- ベストアンサー
ForNext構文内で指定した範囲をまとめて削除する方法
Cells(i,1)から順に最終行まで、条件が一致するものを選択し、最終的にその該当する全ての行を一気に削除する方法が知りたいのです。For nextで1行ずつ参照し、条件が一致する都度削除するという方法だと、行が削除されると次行が実際参照されず、飛ばされてしまい、実際に削除されなくてはならない行であっても残ってしまいます。ですので、条件に一致する行を選択するか、格納するかをし、最後に一気に削除する方法をとりたいのですが、可能でしょうか。 上記の説明における条件とは 1.Cells(i,1)>0 であり、かつCells(i,3)=0である 2.また1の条件が該当する場合、Range(Cells(i,1),Cells(i,19)の行を削除の対象とします。 分かりにくい説明で申し訳ありません。もし必要であればまた補足させていただきます。 マクロ初心者のため、なかなか応用が効きませんので、知識のある方のお力をお借りしたく、投稿させていただきました。是非今後の勉強にも参考させていただきますので、よろしくお願いします。 下記に1行ずつ参照するマクロを作ってみたものを貼り付けております。 For i = 5 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 1).Value > 0 And Cells(i, 3).Value = 0 Then Set myRange = Range("A:A").Find(what:=CStr(Cells(i, 1).Value + 1)).Offset(-1, 0) Range(Cells(i, 1), myRange.Offset(0, 19)).Select Selection.Delete Shift:=xlUp Else Debug.Print "Not Found" End If Next
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
回答1です。 >下から行削除を行う場合は、どのように書き換えれば下からの順になるのでしょうか。 >For i = 5 To Cells(Rows.Count, 1).End(xlUp).Row これを For i = Cells(Rows.Count, 1).End(xlUp).Row To 5 Step -1 とします。「Step」が味噌です。Help等でご確認ください。
その他の回答 (3)
- mitarashi
- ベストアンサー率59% (574/965)
既に正解は出ていますが、 >条件に一致する行を選択するか、格納するかをし、最後に一気に削除する方法をとりたい という部分にお答えすると、下記の様に出来ると思います。単純化したデータで試験していますので、ご質問のコードには沿っておりません。ご参考まで。(なお、当方XL2000です) Sub test() Dim myRange As Range, targetRange As Range, myRow As Range Set targetRange = Range("a1").CurrentRegion For Each myRow In targetRange.Rows If myRow.Cells(1).Value = 1 Then If myRange Is Nothing Then Set myRange = myRow.Cells(1) Else Set myRange = Union(myRange, myRow.Cells(1)) End If End If Next myRow myRange.EntireRow.Delete End Sub
お礼
本当にありがとうございます。Unionを使用すればいいのですね。とても勉強になりました。わざわざテストまでしていただいてありがとうございます。これからの勉強にも生かしていきたいと思っております。
- nag0720
- ベストアンサー率58% (1093/1860)
上から削除する場合は、For~Next文ではなくDo While~Loop文を使います。 LastRow = Cells(Rows.Count, 1).End(xlUp).Row i = 5 Do While i <= LastRow If (条件判定) Then (行削除) LastRow = LastRow - 1 Else i = i + 1 End If Loop
お礼
ありがとうございます。とても勉強になりました。 Do while~ Loop文とFor next文の違いがあまり良く分かっていなかったので、これからDo Loop文の勉強もしていかなくてはなりません。 迅速なご回答ありがとうございます。
- cistronezk
- ベストアンサー率38% (120/309)
>For nextで1行ずつ参照し、条件が一致する都度削除するという方法だと、行が削除されると次行が実際参照されず、飛ばされてしまい、実際に削除されなくてはならない行であっても残ってしまいます。 そうした副作用を避けるため、削除は下の行から行うのが定石です。
お礼
なるほど。気づきませんでした。迅速な回答ありがとうございます。 まだまだ勉強が足りませんので、これからもがんばります。 本当にありがとうございました。
補足
すいません。もう一点よろしいでしょうか。 下から行削除を行う場合は、どのように書き換えれば下からの順になるのでしょうか。初心者で申し訳ないのですが、お手数でなければよろしくお願いいたします。
お礼
全くの初心者に丁寧にお答えいただき、ありがとうございます。 Step-1ということですね。ご指摘通り、Helpでも確認させていただきました。とても参考になり助かりました。ありがとうございます。