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

【VBA】オートフィルタの可視セルを削除する方法|非表示を残して効率的に処理

Excelでデータの整理をしていると、「フィルターで抽出した結果だけ削除したい」「非表示になっている行はそのまま残したい」といったシーンが多くあります。
しかし通常の削除操作では、非表示の行までまとめて削除してしまうことがあります。これを避けるには、「オートフィルタで抽出された可視セルのみを削除する」という正確な処理が必要です。

この記事では、VBAでオートフィルタの可視セルを削除する方法について、初心者にもわかりやすく解説します。手動操作では時間がかかる作業を、数秒で自動化できるようになります。

✅ オートフィルタの可視セルだけを削除するとは?

・通常削除との違いを理解しよう

Excelの「オートフィルタ」では、条件に一致した行のみを表示し、それ以外を非表示にします。
ただし、そのまま Rows.DeleteRange("A1:A10").Delete などを実行すると、非表示の行も削除されてしまう点に注意が必要です。

一方、「可視セルのみ削除」とは、画面上に表示されているセルだけを対象に削除する処理を指します。
これを実現するためには、SpecialCells(xlCellTypeVisible) という指定を使うのがポイントです。

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


✅ VBAで可視セルのみ削除する基本コード

・基本構文

以下のコードを使えば、フィルタ後に表示されている行だけを削除できます。

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

    ' 対象シートを指定
    Set ws = ThisWorkbook.Sheets("データ")

    ' オートフィルタが設定されているか確認
    If ws.AutoFilterMode = False Then
        MsgBox "オートフィルタが設定されていません。", vbExclamation
        Exit Sub
    End If

    ' フィルタ範囲を取得
    With ws.AutoFilter.Range
        ' 見えているセル(可視セル)を取得
        On Error Resume Next
        Set rng = .Offset(1, 0).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
        On Error GoTo 0

        ' 該当セルが存在する場合のみ削除
        If Not rng Is Nothing Then
            rng.EntireRow.Delete
            MsgBox "可視セルの行を削除しました。", vbInformation
        Else
            MsgBox "削除対象のデータがありません。", vbExclamation
        End If
    End With
End Sub

・コードのポイント

  1. ws.AutoFilter.Range でフィルタ範囲全体を取得
    参考:【VBA】オートフィルタのリストを取得する方法|抽出結果を自在に扱う実務テクニック
  2. .SpecialCells(xlCellTypeVisible) で可視セルのみ抽出
  3. .EntireRow.Delete でその行を削除
    参考:【Excel】重複の削除を“行単位”で行う方法|1行全体の重複チェックと削除手順を徹底解説

このように「非表示行を保護しながら可視行だけ削除」できるため、誤削除を防げます。


✅ コード解説と実務での使い方

・1. フィルタ範囲の自動検出

上記のコードでは AutoFilter.Range を使用しているため、どの列でフィルタをかけていても自動的にその範囲を取得します。
そのため、特定の列を指定する必要がなく、柔軟に対応できます。

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

SpecialCells(xlCellTypeVisible) は、該当セルがないときにエラーを返す性質があります。
そのため、On Error Resume NextIf Not rng Is Nothing という構文で、安全にエラー回避しています。
実務では、条件に一致しないデータが多いケースもあるため、この処理は欠かせません。

・3. 削除後のデータ整合性

削除後、表の一部がズレる可能性を防ぐために、削除対象を EntireRow 単位で指定しています。
もし列単位で削除したい場合は、.EntireColumn.Delete に変更するだけで対応可能です。


✅ 応用:特定列の条件でフィルタしてから可視セルを削除

・特定条件を自動フィルタして削除する例

手動でフィルタを設定せず、VBAで条件を指定して削除することもできます。

Sub DeleteFilteredRows()
    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 で「完了」行のみ表示
  2. 可視セル削除で該当行を削除
  3. フィルタ解除で表を元に戻す
    という流れになっています。



✅ 注意点とよくあるエラー対策

・「オブジェクトが必要です」エラーの原因

AutoFilter.Range を呼び出しても、そもそもフィルタが設定されていない場合に発生します。
これを防ぐために、最初に If ws.AutoFilterMode = False Then Exit Sub を入れておくのが安全です。

・「可視セルが見つかりません」のエラー

条件に一致するデータがない場合に SpecialCells が空になります。
On Error Resume Next を入れ忘れると実行中断するため注意が必要です。

・削除後にフィルタを解除するかどうか

実務では、削除後にフィルタ状態を残すと見え方が変わるため、
削除完了後に ws.AutoFilterMode = False で解除しておくのがおすすめです。


✅ 応用例:複数条件で削除する場合

・AND条件・OR条件を活用

Criteria1Operator:=xlOr を組み合わせることで、
複数の条件を同時に扱うことも可能です。

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

    ' A列が「完了」または「中止」の行を抽出
    ws.Range("A1").AutoFilter Field:=1, Criteria1:="完了", Operator:=xlOr, Criteria2:="中止"

    ' 可視セルを削除
    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

これにより、複数の削除対象を一括で自動処理できます。
日々の報告データやタスク管理シートの整理に役立ちます。

参考:【VBA】AutoFilterの複数条件を設定する方法|AND・ORを自在に操る実務向け活用術


✅ さらに便利な活用法:削除前にバックアップを取る

誤削除を防ぐため、削除前に一時シートにコピーしておくと安心です。

Sub DeleteWithBackup()
    Dim ws As Worksheet
    Dim bk As Worksheet
    Dim rng As Range

    Set ws = ThisWorkbook.Sheets("データ")
    Set bk = ThisWorkbook.Sheets("バックアップ")

    ws.Range("A1").AutoFilter Field:=1, Criteria1:="削除対象"

    On Error Resume Next
    Set rng = ws.Range("A1").CurrentRegion.Offset(1, 0).SpecialCells(xlCellTypeVisible)
    On Error GoTo 0

    If Not rng Is Nothing Then
        ' バックアップ
        rng.Copy bk.Range("A" & bk.Cells(Rows.Count, "A").End(xlUp).Row + 1)
        rng.EntireRow.Delete
        MsgBox "削除対象をバックアップ後に削除しました。", vbInformation
    Else
        MsgBox "削除対象データがありません。", vbExclamation
    End If

    ws.AutoFilterMode = False
End Sub

業務データを扱う場合、削除処理の自動化には必ずバックアップの仕組みを入れておくことを推奨します。

参考:【VBA】Application.CutCopyMode:コピー・カットモード解除


✅ まとめ:VBAで可視セル削除をマスターして安全に効率化

  • フィルタ後に見えているセルのみを削除するには、SpecialCells(xlCellTypeVisible) を活用
  • On Error Resume NextIf Not rng Is Nothing で安全にエラー回避
  • AutoFilter を組み合わせて条件削除も自動化可能
  • 複数条件やバックアップ処理を組み合わせると実務での信頼性が向上

可視セル削除をVBAで自動化することで、手作業での誤削除を防ぎ、日常業務のスピードを大幅に向上できます。
ぜひ自分のExcel環境でも活用して、ミスのないデータ管理を実現しましょう。

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