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



