
B列に「両方」が入っている時、その「両方」を含む内容を下に複製し、複製した方のA列の末尾に「A」を追加したいです。
下記に示す内容のVBAを作成しましたが、添付する図のように内容が一か所しか複製されないのです。
どこを修正すれば良いでしょうか。
よろしくお願いいたします。
Sub 両方が入っている場合に下に複製()
Dim tgt As Long
Dim tgtmax As Long
Dim ws1 As Worksheet
Set ws1 = ThisWorkbook.Worksheets("Sheet1")
tgtmax = ws1.Cells(Rows.Count, "A").End(xlUp).Row 'tgtデータの最終行
'両方の場合の複製
For tgt = 2 To tgtmax
If ws1.Range("B" & tgt).Value = "両方" Then
Application.Goto Reference:=ws1.Range("A" & tgt), Scroll:=True
Application.ScreenUpdating = False
'// 現在行位置を取得
iRow = Selection.Row
'// 選択行数を取得
iRowCount = Selection.Rows.Count
If (iRowCount = 1) Then
iRowCount = 0
ElseIf (iRowCount > 1) Then
iRowCount = iRowCount - 2
End If
'// 選択セルの先頭行を選択
Range(iRow & ":" & iRow).Select
'// 選択行をコピー
Selection.Copy
'// 行数分だけ選択
Range(iRow + 1 & ":" & iRow + 1 + iRowCount).Select
'// 行数分貼り付け
Selection.Insert Shift:=xlDown
Range("A" & iRow + 1 + iRowCount).Select
Selection.Value = Selection.Value & "A" '複製した文字列の末尾に「A」を追加
Application.ScreenUpdating = True
Exit For
End If
Next
End Sub

No.3ベストアンサー
- 回答日時:
#1ですが
iRowCount = Selection.Rows.Count が気になって考えてみましたが
添付図ではありませんが、、結合セルがあると言う事でしょうか・・
結合セルがある場合、
逆からループすると、どうも計算が合わないような気がします。
しかし、行の挿入や削除のループは、末行から逆にループするのが鉄則です
上から廻す場合は、一旦配列などに入れ出力する方法になります。(これが理想ですが)
.Selectなどを使用している所から、少し難しい事になりそうですね。
ご質問のコードを基に(基本的に.Selectなどをそのままでループもカウント変数を使う方法を維持)
対象セルの結合セルに対応したコードサンプルを検証してみてください
コメントを自身で書き加えると理解できると思います
結合セル在っても無くても大丈夫です
Sub 両方が入っている場合に下に複製()
Dim tgt As Long
Dim tgtmax As Long
Dim iRowCount As Long
Dim ws1 As Worksheet
Set ws1 = ThisWorkbook.Worksheets("Sheet1")
'tgtデータの最終行
tgtmax = ws1.Cells(Rows.Count, "A").End(xlUp).Row
Application.ScreenUpdating = False
'行末からループ
For tgt = tgtmax To 2 Step -1
'両方の場合の複製
If ws1.Range("B" & tgt).Value = "両方" Then
'実験用ステップ実行でスクロールすると見にくいので Scroll:=False
Application.Goto Reference:=ws1.Range("A" & tgt), Scroll:=False
'選択セルを含む行 .EntireRow
Selection.EntireRow.Copy
'選択行数 通常:1結合時:結合行数
iRowCount = Selection.Rows.Count
Range(tgt + iRowCount & ":" & tgt + iRowCount).Insert Shift:=xlDown
Application.CutCopyMode = False 'コピー範囲を消す
'変更 対象セルの1つ下に挿入 (結合時:結合行数)
Range("A" & tgt + iRowCount).Select
'複製した文字列の末尾に「A」を追加’変更 結合セルの値が表示されているセル Selection(1)
Selection(1).Value = Selection(1).Value & "A"
End If
Next
Application.ScreenUpdating = True
End Sub
このままだと読みにくいのでVBEで確認してください
回答いただきありがとうございました。
「行の挿入や削除のループは、末行から逆にループするのが鉄則です」←大変参考になりました。
教えていただいたコードで行いたい事ができました。
誠にありがとうございました。
No.2
- 回答日時:
こんばんは。
詳しく見ていませんが、
For tgt = 2 To tgtmax
上から処理して、行が増えるとズレると思いますので、下から処理したら
どうでしょうか?
For tgt = tgtmax To 2 Step -1 で下から2行までの処理になるかと。
回答いただきありがとうございました。
「For tgt = tgtmax To 2 Step -1」という処理は思いつきませんでしたので、大変参考になりました。
No.1
- 回答日時:
こんばんは
流し読みで試していないのですけれど
行を挿入するような感じなので
For tgt = 2 To tgtmax は
For tgt = tgtmax To 2 Step -1 として下からループしてみてください
あと、Exit For は If ws1.Range("B" & tgt).Value = "両方" Then が
True だと 1度処理して ループを抜けてしまいますので
おそらく要りません。
なんか、結合セルも対象になっているような感じですが、良いかな?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【教えて!goo ウォッチ 人気記事】風水師直伝!住まいに幸運を呼び込む三つのポイント
記事を読む>>
-
試験本番に後ろの席の人がかなり頻繁にごほごほと咳をしていて試験に集中できないような時はどのような対応をすればよいですか?
大学・短大
-
子供が悪さをすれば親、子供が誤るのは当然だと思っていますが、子供が他の子の教室で大勢の前で謝まるのは普通なのでしょうか?
その他(教育・科学・学問)
-
VBA データ(特定値)のある最終行を取得したい
Excel(エクセル)
-
-
4
歯磨きをしていて口を 3回口をゆすいでまた口の中に歯みがき粉が残っていたのを飲み込んでしまったのです
その他(病気・怪我・症状)
-
5
特定文字のある行の前に空白行を挿入したい
その他(Microsoft Office)
-
6
特定の文字を条件に行挿入とそこからセルデータを追加するVBAについて
Visual Basic(VBA)
-
7
【VBA】特定列に文字が入っていたらそのセル行をコピーしてマスターブックの同じ行に貼り付けたい
その他(Microsoft Office)
-
8
鳥取県西伯郡日吉津村は、大企業からの法人税により財政が潤っているにも拘らず何故単独で中学校を創立しないのでしょうか?
中国・四国
-
9
【VBA】特定の値が入った行をコピーして別シートに貼り付ける方法をおしえていただきたいです。
Excel(エクセル)
-
10
特定の条件の時に行を挿入したい
Excel(エクセル)
-
11
【VBA】特定の文字が入っている行の一部を抽出して別シートコピーするには
Visual Basic(VBA)
-
12
パソコンは0101、2進法だと聞きますが、それがなぜパソコンが画面に写ったり、表の計算をしたりということになるのでしょうか
その他(コンピューター・テクノロジー)
-
13
ExcelVBAを使って、値がある場合は作業を繰り返し実行するプログラムを作成したい。
Visual Basic(VBA)
-
14
vba 2つの条件が一致したらコピーして別シートに値のみ貼り付け
Visual Basic(VBA)
-
15
VBAで空白セルにのみ数値を代入する方法
Excel(エクセル)
-
16
エクセルVBAで5行目からオートフィルタモードに設定したいたい
Excel(エクセル)
-
17
なぜ欧米人は黒い髪同士で子どもを産んでも金髪が出るのに、日本人は茶髪同士で子どもを作っても黒または褐色の頭髪なんですか
ヨーロッパ
-
18
エクセル マクロで数値が変った時行挿入できますか
Excel(エクセル)
-
19
指定した文字があった場合、その行を削除するマクロが欲しいです
Excel(エクセル)
-
20
エクセルVBA、特定条件で行を追加
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
EXCELのVBA-フィルタ抽出後の...
-
5
Excel vbaで特定の文字以外が入...
-
6
screenupdatingが機能しなくて...
-
7
TODAY()で設定したセルの日付...
-
8
Excelで指定した日付から過去の...
-
9
EXCELで変数をペーストしたい
-
10
エクセルvba:自己セルの情報取...
-
11
VBAでセルをクリックする回...
-
12
Excel VBA、 別ブックの最終行...
-
13
セル色なしの行一括削除
-
14
VBSでエクセル内の行数を取得す...
-
15
Excel VBAで比較して数値があっ...
-
16
vbsのセル値の取得について
-
17
Excel VBAで、 ヘッダーへのセ...
-
18
DataGridViewのセル編集完了後...
-
19
【VBA】シート上の複数のチェッ...
-
20
VBAでセルに値が入ったときにイ...
おすすめ情報
公式facebook
公式twitter