VBA開発

ループ中に条件を満たす列の列削除を行う【ExcelVBA】

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列目)はチェックが行われなくなり、正常に動作しません。

その他

Range("B2").EntireColumn.Delete '2列目を削除
  • 複数行纏めて削除する場合は、下記のような記載します。
Range("A:C").Delete ' A ~ C 列を削除
  • 他シートの行削除する場合は、下記のような記載をします。
Worksheets("Sheet1").Columns(1).Delete 'Sheet1の1列目を削除

コメント

タイトルとURLをコピーしました