VBAで条件に合う行を削除する方法|後ろから削除する理由とコード解説

VBAで条件に合う行を削除するには、後ろの行から順番にチェックしながら Rows(i).Delete で削除していきます。前から削除すると行がずれてしまうので、必ず最終行から上に向かってループするのがポイントです。

この記事では、次の内容を順番に解説します。

  • 特定の値が入っている行を削除する基本のコード
  • なぜ後ろから削除するのか
  • 複数の条件で削除する方法
  • 空白行をまとめて削除する方法

VBAで条件に合う行を削除するには?

たとえばA列に「キャンセル」と書かれている行をすべて削除したい場合、次のコードを使います。

Sub RowDelete()

    Dim ls_rw As Long

    ' 最終行を取得
    ls_rw = Cells(Rows.Count, 1).End(xlUp).Row

    ' 最終行から上に向かってチェックしていく
    For i = ls_rw To 1 Step -1
        If Cells(i, 1).Value = "キャンセル" Then
            Rows(i).Delete
        End If
    Next i

    MsgBox "削除が完了しました"

End Sub

コードの流れ

  • まずデータが何行目まであるかを調べて、最終行の番号を取得します。
  • 最終行から1行目に向かって、1行ずつ「キャンセル」かどうかを確認します。
  • 「キャンセル」と書かれていたら、その行を削除します。
  • 全部チェックし終わったら「削除が完了しました」と表示します。

なぜ後ろから削除するの?

前から順番に削除すると、行が削除されるたびに下の行が上にずれてしまいます。そうすると、チェックするはずだった行を飛ばしてしまい、削除されない行が出てきてしまいます。

たとえば3行目を削除すると、元の4行目が3行目になります。次に4行目をチェックしようとすると、実際には元の5行目を見ることになってしまいます。

後ろから削除すれば、上の行には影響が出ないので、チェックがずれることなく正確に動きます。

複数の条件で行を削除するには?

「キャンセル」だけでなく「返品」も削除したい場合は、Or(または)を使って条件を増やせます。

If Cells(i, 1).Value = "キャンセル" Or Cells(i, 1).Value = "返品" Then
    Rows(i).Delete
End If

また、A列だけでなくB列やC列の値で判断したい場合は、Cells(i, 1) の数字を変えます。1がA列、2がB列、3がC列に対応しています。

' B列の値で判断する場合
If Cells(i, 2).Value = "キャンセル" Then
    Rows(i).Delete
End If

空白行をまとめて削除するには?

A列が空白になっている行をすべて削除したい場合は、条件を次のように変えるだけです。

If Cells(i, 1).Value = "" Then
    Rows(i).Delete
End If

""(ダブルクォーテーション2つ)は「何も入っていない」という意味です。空白セルを探したいときに使います。

まとめ

VBAで条件に合う行を削除するときは、後ろから順番にチェックするのが基本です。用途に応じて次のように使い分けましょう。

  • 特定の文字が入っている行を削除If Cells(i, 1).Value = "キャンセル" Then Rows(i).Delete
  • 複数の条件で削除Or でつなげて条件を増やす。
  • 別の列で判断Cells(i, 1) の数字を変える。1=A列、2=B列、3=C列。
  • 空白行を削除If Cells(i, 1).Value = "" Then を使う。

手作業でフィルターをかけて削除する作業が多い方は、ぜひこのコードを活用してみてください。ボタンひとつで一気に片付きます。

よくある質問

削除したら元に戻せる?

マクロで削除した場合、Ctrl+Z(元に戻す)は使えません。削除前に必ずファイルのバックアップを取っておくか、別シートにデータをコピーしてから実行するのがおすすめです。

大文字・小文字の違いは区別される?

はい、区別されます。たとえば「キャンセル」と「きゃんせる」は別の文字として扱われます。

表記がバラバラなデータを削除したい場合は、事前にデータを統一するか、LCase などで小文字に揃えてから比較する方法もあります。

特定の文字が「含まれている」行を削除したい場合は?

完全一致ではなく「含まれている」場合に削除したいときは、InStr を使います。

たとえば「キャンセル」という文字がどこかに含まれていれば削除したい場合は、If InStr(Cells(i, 1).Value, "キャンセル") > 0 Then と書きます。

削除する前に確認メッセージを出したい場合は?

削除前に「本当に削除しますか?」と確認したい場合は、MsgBox で Yes/No を聞いてから処理を進める方法があります。誤って実行してしまうのが心配な場合に有効です。

行ではなく列を削除したい場合は?

Rows(i).Delete の代わりに Columns(i).Delete を使えば、列の削除もできます。考え方は同じで、右から左に向かってループするようにします。


動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール