Excelでデータの整理をしていると、「フィルターで抽出した結果だけ削除したい」「非表示になっている行はそのまま残したい」といったシーンが多くあります。
しかし通常の削除操作では、非表示の行までまとめて削除してしまうことがあります。これを避けるには、「オートフィルタで抽出された可視セルのみを削除する」という正確な処理が必要です。
この記事では、VBAでオートフィルタの可視セルを削除する方法について、初心者にもわかりやすく解説します。手動操作では時間がかかる作業を、数秒で自動化できるようになります。
目次
- ✅ オートフィルタの可視セルだけを削除するとは?
- ・通常削除との違いを理解しよう
- ✅ VBAで可視セルのみ削除する基本コード
- ・基本構文
- ✅ コード解説と実務での使い方
- ・1. フィルタ範囲の自動検出
- ・2. 可視セルが存在しない場合のエラー防止
- ・3. 削除後のデータ整合性
- ✅ 応用:特定列の条件でフィルタしてから可視セルを削除
- ・特定条件を自動フィルタして削除する例
- ✅ 注意点とよくあるエラー対策
- ・「オブジェクトが必要です」エラーの原因
- ・「可視セルが見つかりません」のエラー
- ・削除後にフィルタを解除するかどうか
- ✅ 応用例:複数条件で削除する場合
- ・AND条件・OR条件を活用
- ✅ さらに便利な活用法:削除前にバックアップを取る
- ✅ まとめ:VBAで可視セル削除をマスターして安全に効率化
✅ オートフィルタの可視セルだけを削除するとは?
・通常削除との違いを理解しよう
Excelの「オートフィルタ」では、条件に一致した行のみを表示し、それ以外を非表示にします。
ただし、そのまま Rows.Delete
や Range("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
・コードのポイント
ws.AutoFilter.Range
でフィルタ範囲全体を取得
参考:【VBA】オートフィルタのリストを取得する方法|抽出結果を自在に扱う実務テクニック.SpecialCells(xlCellTypeVisible)
で可視セルのみ抽出.EntireRow.Delete
でその行を削除
参考:【Excel】重複の削除を“行単位”で行う方法|1行全体の重複チェックと削除手順を徹底解説
このように「非表示行を保護しながら可視行だけ削除」できるため、誤削除を防げます。
✅ コード解説と実務での使い方
・1. フィルタ範囲の自動検出
上記のコードでは AutoFilter.Range
を使用しているため、どの列でフィルタをかけていても自動的にその範囲を取得します。
そのため、特定の列を指定する必要がなく、柔軟に対応できます。
・2. 可視セルが存在しない場合のエラー防止
SpecialCells(xlCellTypeVisible)
は、該当セルがないときにエラーを返す性質があります。
そのため、On Error Resume Next
→ If 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
このコードでは、
AutoFilter
で「完了」行のみ表示- 可視セル削除で該当行を削除
- フィルタ解除で表を元に戻す
という流れになっています。
✅ 注意点とよくあるエラー対策
・「オブジェクトが必要です」エラーの原因
AutoFilter.Range
を呼び出しても、そもそもフィルタが設定されていない場合に発生します。
これを防ぐために、最初に If ws.AutoFilterMode = False Then Exit Sub
を入れておくのが安全です。
・「可視セルが見つかりません」のエラー
条件に一致するデータがない場合に SpecialCells
が空になります。
On Error Resume Next
を入れ忘れると実行中断するため注意が必要です。
・削除後にフィルタを解除するかどうか
実務では、削除後にフィルタ状態を残すと見え方が変わるため、
削除完了後に ws.AutoFilterMode = False
で解除しておくのがおすすめです。
✅ 応用例:複数条件で削除する場合
・AND条件・OR条件を活用
Criteria1
と Operator:=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 Next
とIf Not rng Is Nothing
で安全にエラー回避AutoFilter
を組み合わせて条件削除も自動化可能- 複数条件やバックアップ処理を組み合わせると実務での信頼性が向上
可視セル削除をVBAで自動化することで、手作業での誤削除を防ぎ、日常業務のスピードを大幅に向上できます。
ぜひ自分のExcel環境でも活用して、ミスのないデータ管理を実現しましょう。