VBAで自動化 VBA一覧 フィルター操作・制御 抽出・検索処理

【VBA】フィルターがかかっていたら解除する方法|安全で汎用的なマクロ構文と実務活用例

Excelで大量のデータを扱う際、オートフィルタを利用して条件抽出を行うのは非常に便利です。
しかし、既にフィルターがかかった状態で新たにマクロ処理を実行すると、「意図しないデータが除外される」「コピーや貼り付けがうまくいかない」といったトラブルが起きることがあります。

そこで重要になるのが、「フィルターがかかっていたら解除する」という安全対策です。
マクロ実行前にフィルター状態を確認して必要に応じて解除しておけば、どのシートでも安定した動作を保証できます。

この記事では、Excel VBAで「フィルターがかかっていたら解除する」方法を基本から応用まで解説します。
条件判定の仕組み、複数シートへの対応、フィルター再設定の応用など、実務で役立つノウハウを丁寧に紹介します。

✅ フィルターがかかっていたら解除する基本構文

まずは、最も基本的な構文から確認しましょう。
VBAでは、AutoFilterModeプロパティを使ってシートにフィルターが設定されているかを判定できます。

・基本構文の例

Sub RemoveFilterIfActive()
    'アクティブシートにフィルターがかかっていたら解除
    If ActiveSheet.AutoFilterMode Then
        ActiveSheet.AutoFilterMode = False
    End If
End Sub

・解説

  • AutoFilterModeTrue/False の論理値を返します。
    • True:フィルターが有効
    • False:フィルターなし
  • フィルターが有効な場合のみ、AutoFilterMode = False で解除します。
  • これにより、既存フィルターが残っていても確実にリセット可能です。

この短いコードだけで、どのシートでも安全にフィルター状態を初期化できます。


✅ 特定のシートでのみフィルター解除する方法

実務では、複数のシートを扱うケースが多く、「特定のシートのみ解除したい」という場面もあります。
たとえば「売上データ」シートだけ解除して他はそのままにしたい場合です。

・特定シートを指定して解除するVBA

Sub RemoveFilterFromSpecificSheet()
    Dim ws As Worksheet
    Set ws = Worksheets("売上データ")
    
    If ws.AutoFilterMode Then
        ws.AutoFilterMode = False
        MsgBox ws.Name & " のフィルターを解除しました。", vbInformation
    Else
        MsgBox ws.Name & " にフィルターは設定されていません。", vbInformation
    End If
End Sub

・ポイント

  • Worksheets("売上データ") でシートを明示的に指定
  • AutoFilterMode で状態を判定
  • MsgBox を使ってユーザーに状態を通知

このようにシート単位で制御することで、他の集計シートなどに影響を与えずに安全なマクロ処理ができます。

参考:【VBA】オートフィルタで抽出した一部データをコピーする方法|必要な情報だけを効率的に転記する


✅ フィルターが設定されていても「一部解除」されるケースへの対処

AutoFilterModeTrue の場合でも、Excelの仕様上、
「フィルター行が存在するが、条件が設定されていない状態」も含まれます。

つまり、「フィルターのボタンだけあるけど、実際は全件表示されている」というケースです。
この場合、単にAutoFilterMode = Falseを実行すると、フィルター機能そのものが消えます。

もし「フィルター機能は残したいが、条件はリセットしたい」場合は、ShowAllDataを使います。

・条件をリセットして全件表示に戻すVBA

Sub ResetFilterOnly()
    On Error Resume Next
    If ActiveSheet.FilterMode Then
        ActiveSheet.ShowAllData
    End If
    On Error GoTo 0
End Sub

・違いの整理

コード動作使用目的
AutoFilterMode = Falseフィルターそのものを解除(ボタンも消える)次に新しい条件を設定する前
ShowAllData条件だけ解除(ボタンは残す)一時的に全件を表示したい時

この違いを理解して使い分けることで、誤操作を防ぎ、ユーザー体験も向上します。

参考:【VBA】フィルターの一部だけを解除する方法|特定列だけ再表示したいときの解決策


✅ 複数シートのフィルターを一括解除するマクロ

データ分析をしていると、複数シートにフィルターを設定している場合も少なくありません。
ひとつひとつ解除するのは面倒ですが、VBAを使えば全シートのフィルターをまとめて解除できます。

・すべてのシートのフィルターを解除するコード

Sub RemoveAllSheetFilters()
    Dim ws As Worksheet
    Dim count As Long
    count = 0
    
    For Each ws In ThisWorkbook.Worksheets
        If ws.AutoFilterMode Then
            ws.AutoFilterMode = False
            count = count + 1
        End If
    Next ws
    
    MsgBox count & " 件のシートでフィルターを解除しました。", vbInformation
End Sub

・特徴とメリット

  • 全ワークシートをループで走査
  • フィルター状態を自動判定して解除
  • 実行後に「何シート解除したか」メッセージ表示

たとえば週次レポートで複数部署のシートを扱うときなど、実行前の初期化処理として利用できます。


✅ 実務で多いエラー「ShowAllDataでエラーになる」原因と対策

よくある質問として、「ShowAllDataを実行するとエラーになる」というものがあります。
これは、フィルターがまったく設定されていない状態ShowAllDataを呼び出すとエラーが出る仕様によるものです。

・エラー対策を含めた安全な構文

Sub SafeShowAllData()
    On Error Resume Next
    If ActiveSheet.FilterMode Then
        ActiveSheet.ShowAllData
    End If
    On Error GoTo 0
End Sub

・なぜこの書き方が安全か

  • FilterModeがTrueの場合のみShowAllDataを実行
  • フィルターがない場合はスキップ
  • On Error Resume Nextで例外を無視し、マクロが止まらない

この構文はほぼすべての状況で安定して動作します。
特に他の処理(コピー・削除・集計)と組み合わせる際は、必ず最初に実行するのが望ましいです。


✅ フィルター解除をマクロ処理の「冒頭」に入れる理由

実務では、次のようなマクロを組むことが多いでしょう。

  • データを抽出してコピーする
  • 集計結果を別シートに貼り付ける
  • 条件付きで非表示を解除して処理する

これらの処理では、「フィルターが残っている状態」でマクロが動くと、想定外のデータをスキップしてしまう可能性があります。
そのため、多くのプロのVBA開発者は、必ず以下のような処理を「最初に」書きます。

・マクロ冒頭での初期化例

Sub DataProcessMain()
    Dim ws As Worksheet
    Set ws = Worksheets("売上データ")
    
    'フィルター解除
    If ws.AutoFilterMode Then ws.AutoFilterMode = False
    
    'データ処理開始
    ws.Range("A1").CurrentRegion.Copy Destination:=Worksheets("集計結果").Range("A1")
    
    MsgBox "データ処理が完了しました。", vbInformation
End Sub

・メリット

  • マクロの実行が常に同じ条件から始まる
  • フィルター残りによる誤抽出を防げる
  • 不要なエラーを防止できる

マクロの信頼性を高める最も基本的な対策が、この「事前フィルター解除」です。


✅ フィルター解除+再設定を組み合わせる応用例

フィルターを解除してから、新しい条件で再設定したい場合もよくあります。
たとえば「まず既存フィルターをリセット → 次に金額が10万円以上のデータを抽出する」といった流れです。

・解除+再設定の一連処理

Sub ResetAndFilterAgain()
    Dim ws As Worksheet
    Set ws = Worksheets("売上データ")
    
    '既存フィルターを解除
    If ws.AutoFilterMode Then ws.AutoFilterMode = False
    
    '新しい条件を設定
    ws.Range("A1").CurrentRegion.AutoFilter Field:=3, Criteria1:=">=100000"
    
    MsgBox "フィルターを再設定しました。", vbInformation
End Sub

このように「解除 → 新設定」の流れを統一しておくと、どんな状況でも安定して動作します。
特に他のユーザーが操作したExcelファイルを扱う場合に有効です。


✅ 複合的な解除マクロ:AutoFilterModeとFilterModeの両方を考慮する

実は、Excelのフィルター状態には2種類あります。

  1. AutoFilterMode:フィルター行の有無
  2. FilterMode:現在フィルターが適用中かどうか(データが絞り込まれているか)

そのため、両方を考慮して処理を書くのがベストです。

・完全解除マクロ(最も安全な構文)

Sub RemoveAllFiltersSafe()
    Dim ws As Worksheet
    Set ws = ActiveSheet
    
    On Error Resume Next
    
    '絞り込み状態を解除
    If ws.FilterMode Then ws.ShowAllData
    
    'フィルター行自体を削除
    If ws.AutoFilterMode Then ws.AutoFilterMode = False
    
    On Error GoTo 0
End Sub

・解説

  • FilterMode:フィルターの絞り込みがある場合に全件表示
  • AutoFilterMode:フィルター自体を削除
  • 両方の条件を順に処理することで、すべての状態に対応

これが最も堅牢な「フィルター解除マクロ」です。
業務用ツールやRPA連携処理など、安定動作を重視する場面で特におすすめです。


✅ 実務での応用:全シートを初期化する総合マクロ

最後に、実務で即使える「全シート初期化+エラー対策付き」のサンプルを紹介します。

Sub InitializeWorkbook()
    Dim ws As Worksheet
    Dim count As Long
    count = 0
    
    On Error Resume Next
    
    For Each ws In ThisWorkbook.Worksheets
        If ws.FilterMode Then ws.ShowAllData
        If ws.AutoFilterMode Then ws.AutoFilterMode = False
        count = count + 1
    Next ws
    
    On Error GoTo 0
    
    MsgBox count & " 件のシートを初期化しました。", vbInformation
End Sub

・このマクロの特長

  • すべてのシートのフィルターを安全に解除
  • フィルターがない場合でもエラー停止しない
  • 複数ユーザーが使う共有ファイルにも対応可能

定期処理の前後や、マクロ全体の冒頭・末尾に組み込んでおくと非常に便利です。


✅ まとめ:フィルター解除マクロで安定したExcel運用を実現しよう

最後に、本記事のポイントを整理します。

  • AutoFilterModeでフィルター行の有無を判定
  • FilterModeで「絞り込み中か」を確認できる
  • AutoFilterMode = Falseで完全解除
  • ShowAllDataで条件だけリセット可能
  • 全シート一括解除マクロも汎用的で便利

VBAでのフィルター操作は小さな工夫で安定性が大きく変わります。
特に「他人が操作した後のExcel」や「共有ファイル」を扱う場合、
事前にフィルターを解除してから処理を実行することが、マクロの信頼性を高める最大のポイントです。

この仕組みをマクロの基本構造として組み込めば、
今後のVBA開発で「想定外の動作」や「データ抜け」を防ぎ、より安心して自動化を実現できるでしょう。

-VBAで自動化, VBA一覧, フィルター操作・制御, 抽出・検索処理