Excelでマクロ(VBA)を使ってデータを扱う際、「特定の列だけフィルターを解除したい」「一部の条件だけ解除して他の条件は維持したい」といったニーズが出てきます。手動では簡単に操作できますが、VBAで一部だけフィルター解除するには少し工夫が必要です。
この記事では、「ExcelVBA フィルター 解除 一部」というキーワードで検索された方向けに、以下の内容を網羅的に解説します。
✅ フィルターの基本構造と仕組み
✅ 一部のフィルター解除ができない理由
✅ 代替手段としての再適用テクニック
✅ 実務で役立つ応用コード例
✅ エラーにならない安全な実装方法
目次
✅ まず知っておきたい:AutoFilterの構造
VBAでフィルターを操作する場合、よく使われるのが AutoFilter メソッドです。このメソッドは、「対象となるセル範囲」「列番号(Field)」「絞り込み条件(Criteria1など)」で構成されています。
例:A列に「東京」という条件でフィルターをかける
Range("A1").CurrentRegion.AutoFilter Field:=1, Criteria1:="東京"
そして「解除」と言った場合には大きく以下の2種類があります。
- 全フィルター解除:
.AutoFilterMode = Falseまたは.ShowAllData - 一部の列のフィルターだけ解除: ⇒ VBAでは直接解除する手段はない
つまり、「一部のフィルターだけ解除する」処理は、一度全体をリセットして必要な条件だけをかけ直すのが基本的な対処法となります。
【VBA】フィルター解除を全て実行する方法|複数シート・複数フィルター対応の完全自動化解説
✅ 結論:一部解除=「必要なフィルターだけ再適用」
・ できない例(Fieldだけ解除)
' これはエラーにはならないが意味がない
Range("A1").CurrentRegion.AutoFilter Field:=1
このように「Fieldのみ指定して解除しよう」とすると、条件の解除にはなりません。VBAでは特定列のフィルターを解除する直接的な命令は存在していないため、一旦全て解除 → 必要な列に再フィルターという流れを取ります。
✅ 具体例:C列だけ解除して、A列のフィルターは残したい
以下のようなVBAコードを使用します:
Sub RemoveFilterFromC_KeepA()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("データ")
With ws
If .AutoFilterMode Then .AutoFilterMode = False
' フィルター再設定(A列:東京のみ抽出)
With .Range("A1").CurrentRegion
.AutoFilter Field:=1, Criteria1:="東京"
' C列のフィルターを除外(適用しない)
End With
End With
End Sub
このように、最初にすべてのフィルターをクリアし、必要な列(この例ではA列)にだけフィルターを再設定するのが「一部解除」の代替手段です。
【VBA】「フィルター 空白以外」を設定する方法|空白を除外してデータ抽出する自動化手法
✅ 応用パターン:フィルター条件を記憶して一部だけ再構築
フィルター状態を記憶し、必要なものだけ復元するコード例です。
Sub PartialFilterReset()
Dim ws As Worksheet
Set ws = Worksheets("データ")
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
If ws.AutoFilterMode Then ws.AutoFilterMode = False
With ws.Range("A1:D" & lastRow)
' 条件1(A列):"東京"
' 条件2(C列)は解除したいのでここではかけない
.AutoFilter Field:=1, Criteria1:="東京"
End With
End Sub
この方法を取れば、**「元のフィルター条件のうち、必要なものだけ再適用」**という形で、一部解除に近い挙動が可能です。
✅ 条件を動的に指定したい場合
実務では「A列は"東京"と"大阪"」「D列は10000以上」というように、複数列・複数条件が可変的になることがよくあります。
Sub DynamicPartialFilter()
Dim ws As Worksheet
Set ws = Worksheets("売上データ")
If ws.AutoFilterMode Then ws.AutoFilterMode = False
With ws.Range("A1").CurrentRegion
' A列は複数条件でフィルター(再適用)
.AutoFilter Field:=1, Criteria1:=Array("東京", "大阪"), Operator:=xlFilterValues
' B列とC列の条件は今回は除外(フィルター解除と同様)
End With
End Sub
このように、「除外したい列はフィルター再設定しない」という方針で制御していくのが基本です。
【VBA】オートフィルターに複数条件を設定する方法|業務効率を劇的に上げるフィルター自動化
■ ShowAllDataとの違いに注意
ShowAllData はすべてのフィルター条件を一括で解除するものです。
If ws.FilterMode Then ws.ShowAllData
一部だけ解除したい場合は使いません。
むしろこの命令は、「一度すべて解除して、後から必要な列だけ再度フィルターをかけ直す」ための準備に使う形になります。
【VBA】複数列にフィルターをかける方法|応用例・エラー対策も解説
✅ 実務での応用例:指定列だけ動的にフィルター解除
以下のコードは、A列とD列のフィルター条件は維持し、C列だけ解除したいというケースに対応しています。
Sub ResetSpecificColumnFilter()
Dim ws As Worksheet
Set ws = Worksheets("データ")
' 既存フィルターの再構築
Dim filter1 As Variant: filter1 = "営業部"
Dim filter4 As Variant: filter4 = ">=5000"
If ws.AutoFilterMode Then ws.AutoFilterMode = False
With ws.Range("A1").CurrentRegion
.AutoFilter Field:=1, Criteria1:=filter1 ' A列:営業部
.AutoFilter Field:=4, Criteria1:=filter4 ' D列:5000以上
' C列はフィルターしない(解除された状態)
End With
End Sub
■ フィルター解除がうまくいかないときのチェックポイント
・ 範囲指定の見直し
.Range("A1").CurrentRegionを使うことで連続したセル範囲全体にフィルターが適用されます。- 手動で選んだ不完全な範囲だと、うまく条件がかからないケースがあります。
・ FilterModeとAutoFilterModeの違い
AutoFilterMode:フィルターの見出し行が存在するかFilterMode:実際にフィルターによって非表示の行があるか
この違いを正確に把握して制御することで、意図しない全解除や再設定ミスを防止できます。
■ まとめ|VBAで一部フィルター解除は「再適用」で実現する
ExcelVBAでフィルターの一部だけ解除したいというニーズは多いですが、実際には直接的な解除手段はなく、条件を再適用するアプローチで実現します。
もう一度要点をおさらいしましょう。
- VBAでは特定列のフィルターだけを直接解除する方法はない
- 一度すべて解除し、必要な列にだけフィルターを再適用する
.AutoFilter Field:=nを使って再構築することで柔軟に制御可能- 実務では「再適用+一部省略」で一部解除のように見せるのが基本
- 範囲設定やFilterMode/AutoFilterModeの扱いにも注意