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