ExcelVBAのメリットでありデメリットは、エクセル上の癖を理解しないと、
コードが正常に動作しない場合があります。
今回は、指定条件を満たした際、該当行を削除するコードを紹介します。
ループ中の行削除は、下から上に向かって処理をする
通常For~Next等で処理をする場合は、最初行から最終行に向かってループさせますが、
行を削除する場合は、最終行から最初行に向かって処理させます。
コードサンプル
A列が空白の行を削除するサンプルコードです。
'■行削除サンプルコード Loopを大きい数から小さい数に向かって処理する Public Sub Call_sample_RowsDelete() Dim i As Long '■1行目から10行目までA列が空白の場合は、行削除する。 For i = 10 To 1 Step -1 If Cells(i, "a") = "" Then Rows(i).Delete End If Next i End Sub
実際の業務では最終行や条件判断列は変数や定数の場合が多いかと思います。
その場合は下記参考に、処理を変化させてください。
下から上に向かって処理する理由
今回Step-1を利用し、最終行から最初の行へ向かって処理させました。
通常通り、上から下へ向けて処理した場合はなぜNGなのでしょうか。
理由は、行削除すると行番号がズレるからです。
例)3行目が削除された場合
Loop中に3行目削除すると、3行目以降は1行少なくなります。
=今まで4行目だったものが3行目に変化します。結果、旧4行目(現在の3行目)はチェックが行われなくなり、正常に動作しません。
Loop中に3行目削除すると、3行目以降は1行少なくなります。
=今まで4行目だったものが3行目に変化します。結果、旧4行目(現在の3行目)はチェックが行われなくなり、正常に動作しません。
その他
- 行削除をすると画面がちらつきます。
気になる(もしくは速度を求める)場合は、下記処理を追加してください。
ExcelVBAマクロ「マクロ処理を高速化する」をパーツ化する。 - Rows.Deleteで削除していますが、EntireRow.Deleteでも同様動作です。
Range("B2").EntireRow.Delete '2行目を削除
- 複数行纏めて削除する場合は、下記のような記載します。
Range("1:5").Delete ' 1 ~ 5 行目を削除
- 他シートの行削除する場合は、下記のような記載をします。
Worksheets("Sheet1").Rows(1).Delete'Sheet1の1行目を削除
その他
行ではなく、列を削除する場合は以下参照。
ループ中に条件を満たす列の列削除を行う【ExcelVBA】
コメント