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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 空のシートに関数を入れたい 2 2021/12/03 15:08
- Visual Basic(VBA) シート名をフォルダ名に変更 1 2021/12/01 15:59
- Visual Basic(VBA) シート名でファイル検索する 2 2021/11/30 17:05
- Visual Basic(VBA) Excel VBAでフォルダ内の全テキストファイルの任意データを取得について 7 2021/12/18 16:00
- Visual Basic(VBA) サブフォルダ含むすべてのフォルダの Excel 検索 4 2021/12/13 09:33
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Excel(エクセル) VBA Scripting.Dictionary 連想配列 複数参照する方法 2 2021/12/17 01:52
- Visual Basic(VBA) EXCLE VBA シートクリックしたら該当シートコピー 1 2021/11/11 16:37
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) excel VBAでメールを送る方法について 2 2021/11/03 15:34
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
エクセルVBAで、ある指定した文字を含む行だけを選択したいのですが、、 例えば、1〜20行目までに"12818588"
Excel(エクセル)
-
VBA(エクセル)で自動的にボタンをクリックさせるには
その他(プログラミング・Web制作)
-
指定した文字があった場合、その行を削除するマクロが欲しいです
Excel(エクセル)
-
-
4
【VBA】特定列に文字が入っていたらそのセル行をコピーしてマスターブックの同じ行に貼り付けたい
その他(Microsoft Office)
-
5
【vba】指定範囲の中に任意の文字があるときの条件分岐
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スタティックテキストが表示さ...
-
VBA、UserFormを前面に出力して...
-
ACCESS側からEXCELの書式を設定...
-
【C#】 あるイベントから別イ...
-
VBSで応答不要のメッセージボッ...
-
InvalidateRectがうまくいかない
-
マウスのクリックを無視したい
-
メッセージボックスのボタン名変更
-
VBA kernel32 の意味
-
起動後直に実行するコードはど...
-
Excel VBA 自動的に閉じるMsgBox
-
WEB上にボタンが押せない
-
DirectX環境下での方向キー同時...
-
VB.NET開発(イベントプロシー...
-
スケジューリング方式
-
VBSの処理中一旦処理を止めて再...
-
MFCのView終了時の終了確認
-
VCでウエイトをミリ秒でかけ...
-
VBA メッセージボックスを自動...
-
Application.ScreenUpdating=Fa...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
メッセージボックスのボタン名変更
-
VBSの処理中一旦処理を止めて再...
-
VBSで応答不要のメッセージボッ...
-
ACCESS側からEXCELの書式を設定...
-
VBA メッセージボックスを自動...
-
Application.ScreenUpdating=Fa...
-
VBA kernel32 の意味
-
エクセルVBAでクリップボード内...
-
Excelのワークシートに行を挿入...
-
Excel VBA で処理中断(DoEvents...
-
【C#】 あるイベントから別イ...
-
手動かプログラムでの起動かの判断
-
ASP.NETでのメッセージ画面を出...
-
Excel VBA 自動的に閉じるMsgBox
-
シャットダウン時のExcel強制終...
-
VBA、UserFormを前面に出力して...
-
<input type="file">タグで「キ...
-
Excel VBA 実行中に一瞬フリー...
-
「キャンセル」ボタン付きの処...
-
EXCEL VBA「Application.Displa...
おすすめ情報