VBAで自動化 VBA一覧 フィルター結果の加工・削除 抽出・検索処理

【VBA】フィルタを使って空白行を削除する方法|効率的にデータを整理しよう

Excelで日常的に発生する悩みのひとつが、「データの途中に空白行が紛れ込んでしまう」ことです。
データの並べ替えや集計を行う際に、空白行があると処理が止まったり、関数結果がずれたりと、業務上のトラブルを引き起こすことがあります。

手動で空白行を削除するのは時間がかかりますが、VBA(マクロ)を使えば一瞬で解決できます。
中でも「オートフィルタ機能」を組み合わせることで、見た目上は空白行を抽出して削除するというスマートな処理が可能です。

この記事では、VBAでフィルタを使って空白行を効率的に削除する方法を、実務に役立つ形で詳しく解説します。

✅ フィルタで空白行を削除するメリットとは?

・空白セルの位置を気にせず一括処理できる

Excelのオートフィルタを使うと、「空白セルを含む行だけ」を自動的に抽出できます。
つまり、どの位置に空白があってもVBAで一括削除できるため、データ件数が多くても処理が速いのが特徴です。

たとえば以下のようなシートを想像してください。

A列B列C列
山田東京100
鈴木200
大阪300
田中名古屋400

このようなデータをフィルタで抽出し、空白を含む行を削除すれば、整った表にできます。

参考:【VBA】特定のセル(空白セル・数式セル・エラーセル)を見つけ出す:SpecialCells メソッド


✅ VBAでフィルタを使って空白行を削除する基本コード

・A列に空白がある行を削除する例

Sub DeleteBlankRows_Filter()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("データ")

    ' A列にフィルタを設定して空白セルを抽出
    ws.Range("A1").AutoFilter Field:=1, Criteria1:="="

    ' 見えている(空白セルを含む)行を削除
    On Error Resume Next
    ws.Range("A1").CurrentRegion.Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    On Error GoTo 0

    ' フィルタ解除
    ws.AutoFilterMode = False

    MsgBox "空白行を削除しました。", vbInformation
End Sub

・コードの流れ解説

  1. AutoFilterでA列を対象に空白セルを抽出
  2. SpecialCells(xlCellTypeVisible)で抽出された可視セル(空白行)を選択
  3. EntireRow.Deleteで行ごと削除
    参考:【VBA】セル・行・列・シート・ファイルの削除(Delete・Killステートメント)
  4. 最後に AutoFilterMode = False でフィルタを解除
    参考:【VBA】可視セルのみを処理する方法|非表示セルを除外して安全に自動化する

非常にシンプルですが、処理の流れが明確で安全性も高い方法です。


✅ 空白行削除の仕組みを理解しよう

・Criteria1:="=" が空白を意味する

オートフィルタの Criteria1:="=" は「セルが空白であるもの」を抽出する条件を意味します。
手動操作で「(空白)」を選ぶのと同じ動作です。

たとえば「A列に空白がある行を削除したい」場合は Field:=1
「B列が空白の行を削除したい」場合は Field:=2 に変更します。

ws.Range("A1").AutoFilter Field:=2, Criteria1:="="

このように列番号を変えるだけで、他の列にも簡単に対応できます。

参考:【VBA】「フィルター 空白以外」を設定する方法|空白を除外してデータ抽出する自動化手法


✅ 実務で使える応用例:複数列の空白を削除

・A列またはB列のどちらかが空白なら削除

実務では、「どちらか一方が空白なら削除したい」というケースもよくあります。
その場合、2回フィルタ処理を組み合わせるのが簡単です。

Sub DeleteBlankRows_MultiColumn()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("データ")

    ' まずA列の空白行を削除
    ws.Range("A1").AutoFilter Field:=1, Criteria1:="="
    On Error Resume Next
    ws.Range("A1").CurrentRegion.Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    On Error GoTo 0
    ws.AutoFilterMode = False

    ' 続いてB列の空白行を削除
    ws.Range("A1").AutoFilter Field:=2, Criteria1:="="
    On Error Resume Next
    ws.Range("A1").CurrentRegion.Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    On Error GoTo 0
    ws.AutoFilterMode = False

    MsgBox "A列またはB列が空白の行を削除しました。", vbInformation
End Sub

このコードでは、A列とB列それぞれで空白行を検出して削除しています。
繰り返し処理でもよいですが、2段階で実行する方が動作確認がしやすく、エラーも出にくい構成です。

参考:【VBA】複数列にフィルターをかける方法|応用例・エラー対策も解説




✅ 応用例:データ範囲を自動判定して空白行を削除

データ量が可変のシートでは、A1:A1000 のように固定範囲を指定すると空白が残ることがあります。
そのため、CurrentRegion を使って自動的に範囲を判定するのが便利です。

Sub DeleteBlankRows_AutoRange()
    Dim ws As Worksheet
    Dim rng As Range

    Set ws = ThisWorkbook.Sheets("データ")
    Set rng = ws.Range("A1").CurrentRegion '自動で表範囲を取得

    rng.AutoFilter Field:=1, Criteria1:="="

    On Error Resume Next
    rng.Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    On Error GoTo 0

    ws.AutoFilterMode = False
    MsgBox "自動範囲で空白行を削除しました。", vbInformation
End Sub

このコードは、表全体を動的に認識するため、データ量が毎回変動する帳票やCSVインポート後の整形処理などに最適です。

参考:【VBA】For文:空白行まで繰り返す処理方法


✅ 注意点:エラー対策とデータ破損防止

・可視セルが存在しない場合のエラー

SpecialCells(xlCellTypeVisible) は対象セルがないときにエラーを返すため、
On Error Resume NextOn Error GoTo 0 で安全にスキップする必要があります。

・フィルタ設定を残さない

フィルタを解除しないと、その後の処理で意図しない動作になることがあります。
削除処理の最後には必ず ws.AutoFilterMode = False を入れておきましょう。

・バックアップを取る

削除は元に戻せないため、実務で使用する際はバックアップを取ってから実行するのが安心です。
例えば次のようにバックアップを自動生成するコードを追加しておくと安全です。

ws.Copy After:=ws
ActiveSheet.Name = ws.Name & "_Backup"
 参考:【VBA】シートのコピーを自動化(AddメソッドとCopyメソッド)

✅ よくあるエラー:「オブジェクトが必要です」対処法

このエラーは主に、オートフィルタが設定されていないのに .AutoFilter.Range を呼び出した場合に発生します。
これを防ぐには次のように「フィルタが存在するかどうか」を確認します。

If ws.AutoFilterMode = False Then
    MsgBox "フィルタが設定されていません。", vbExclamation
    Exit Sub
End If

また、データ範囲が1行しかない場合にも SpecialCells が動作しないことがあるため、
実務では複数行データを想定しておくと安定します。


✅ 高速化のポイント:画面更新を止めて実行

削除処理を大量データに対して行う場合、画面の再描画によって処理が遅くなることがあります。
そのため、実行前後に以下を追加することで速度を改善できます。

Application.ScreenUpdating = False
' 削除処理
Application.ScreenUpdating = True

また、連続削除を行う際は、Application.Calculation = xlCalculationManual で一時的に計算を止めるのも有効です。

参考:【VBA】Application.ScreenUpdatingプロパティの使用方法と特徴


✅ まとめ:フィルタを使った空白行削除で業務をスマート化しよう

  • AutoFilterCriteria1:="=" を組み合わせると空白行を一瞬で抽出可能
  • SpecialCells(xlCellTypeVisible) で表示セルのみ削除すれば安全
  • 複数列や可変範囲にも柔軟に対応できる
  • エラー対策やバックアップを入れて実務でも安心して使える

VBAを使えば、面倒な空白行削除を数秒で完了できます。
特に日次・週次のデータ整形業務では、これだけで作業時間が大幅に削減されるでしょう。
ぜひこのテクニックを取り入れて、Excelの整理作業を完全に自動化してみてください。

-VBAで自動化, VBA一覧, フィルター結果の加工・削除, 抽出・検索処理