VBAで自動化 VBA一覧 フィルタリング 抽出・検索処理

【VBA】フィルターがかかっていたら解除する方法|実務でハマらない完全対策ガイド

Excel VBAで処理を自動化していると、「なぜかデータが全部処理されていない」「件数が合わない」「コピー結果が欠けている」といった違和感に遭遇することがあります。
その原因の多くが、すでにシートにフィルターがかかっていたという見落としです。

特に、
・他人が操作したブック
・前回のマクロ実行後の状態
・共有ブックや定期処理用ファイル

こうした環境では、フィルター状態を前提にしないコードは非常に危険です。

この記事では、「フィルターがかかっていたら解除する」という一見シンプルな処理を、
なぜ必要なのか/どう書くのが安全か/どこで失敗しやすいかまで含めて、実務目線で徹底解説します。

✅ VBAで「フィルターがかかっていたら解除」が重要な理由

「フィルターは見た目で分かるから大丈夫」と思っていると、後で必ず痛い目を見ます。
VBAは画面に見えている状態ではなく、内部状態をそのまま処理するため、フィルターの有無を意識しないコードは不具合の温床になります。


・実務で起きがちな失敗パターン

  1. フィルターされたまま Range.Copy してしまう
  2. 件数取得(CountRows.Count)が合わない
  3. フィルター解除コードを書いたがエラーになる
  4. フィルターが存在しないのに ShowAllData を実行して止まる

特に④は初心者〜中級者が必ず一度は踏む地雷です。


✅ フィルター解除の基本|まず押さえるべき考え方

ここで重要なのは、「フィルターがあるかどうか」ではなく、
「解除していい状態かどうか」を正しく判定することです。

Excel VBAでは、以下の2つを区別する必要があります。

  • フィルター機能が設定されているか
  • 実際に絞り込みがかかっているか

この違いを理解せずにコードを書くと、エラーや想定外動作につながります。


・AutoFilterMode と FilterMode の違い

AutoFilterMode

  • フィルター機能そのものが設定されているか
  • 見出し行に▼があるかどうか

FilterMode

  • 実際に条件による絞り込みがかかっているか
  • データが非表示になっているかどうか

👉 解除が必要なのは FilterMode が True のときです。


✅ 最も基本的なフィルター解除コード

まずは王道パターンから見ていきましょう。

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

If ActiveSheet.FilterMode Then
    ActiveSheet.ShowAllData
End If

これは非常によく使われる定番コードです。


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

ShowAllData は便利ですが、
フィルターがかかっていない状態で実行するとエラーになります。

そのため、

  • いきなり ShowAllData → ❌
  • FilterMode を確認してから → ✅

という流れが必須になります。


✅ AutoFilterModeだけを見てはいけない理由

初心者がよく書いてしまうコードがこちらです。

If ActiveSheet.AutoFilterMode Then
    ActiveSheet.ShowAllData
End If

一見正しそうですが、これは危険です。


・このコードで起きる問題

  • フィルターは設定されている
  • しかし絞り込みはされていない

この状態でも AutoFilterMode = True になります。

👉 結果
ShowAllData が実行されてエラーになる


・正しい考え方

状態AutoFilterModeFilterMode
フィルターなしFalseFalse
フィルターあり(未絞込)TrueFalse
フィルターあり(絞込中)TrueTrue

👉 解除すべきなのは3行目だけ

参考:【VBA】フィルター イベントを擬似的に扱う実務設計完全解説




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

ActiveSheetを使うのが不安な場合、明示的にシートを指定する方が安全です。

・シートを指定して解除

With Worksheets("データ")
    If .FilterMode Then
        .ShowAllData
    End If
End With

・実務でシート指定が重要な理由

  • ActiveSheet が想定と違う
  • 別シートがアクティブになっている
  • 他のマクロから呼ばれる

こうしたケースでは、ActiveSheet前提のコードは事故の元になります。


✅ ListObject(テーブル)にフィルターがかかっている場合

最近のExcelでは、範囲ではなくテーブル(ListObject)が使われることも多いです。


・テーブルのフィルター解除コード

Dim tbl As ListObject

Set tbl = Worksheets("データ").ListObjects("Table1")

If tbl.AutoFilter.FilterMode Then
    tbl.AutoFilter.ShowAllData
End If

・通常範囲との違い

  • Worksheet.ShowAllData では解除できない場合がある
  • テーブルは テーブル単位で制御する必要がある

👉 テーブルを使っているかどうかは、設計段階で必ず確認しましょう。

参考:Excel VBAでテーブル作成:ListObjects.Addメソッドの完全ガイド


✅ フィルターが存在しない場合も含めて安全に解除する方法

「フィルターがあるかどうかも分からない」
そんなケースでは、以下のような書き方が実務向きです。


・On Error を使った実務向けコード

On Error Resume Next
ActiveSheet.ShowAllData
On Error GoTo 0

・この書き方のメリットと注意点

メリット

  • フィルターの有無を意識しなくてよい
  • 単発処理では非常に楽

注意点

  • 本来拾うべきエラーも無視される
  • 大規模マクロでは非推奨

👉 小規模・限定処理向けと考えましょう。


✅ フィルター解除をマクロの「最初」に入れるべき理由

多くの実務トラブルは、
「処理の途中でフィルター解除」していることが原因です。


・推奨構成

Sub MainProcess()

    ' フィルター解除
    If Worksheets("データ").FilterMode Then
        Worksheets("データ").ShowAllData
    End If

    ' データ処理
    ' コピー・集計・書き込みなど

End Sub

・この構成が強い理由

  • 処理対象が常に「全件」になる
  • 前回実行状態に左右されない
  • 他人操作の影響を受けにくい

👉 再現性が高いマクロになります。


✅ フィルター解除+再設定をセットで行う実務パターン

実務では「一度解除 → 条件を変えて再フィルター」という流れが多発します。


・解除 → 再設定の例

With Worksheets("データ")
    If .FilterMode Then .ShowAllData

    .Range("A1").AutoFilter Field:=2, Criteria1:="東京"
End With

・このときの注意点

  • 見出し行を含めた範囲指定になっているか
  • Field番号がズレていないか
  • 空白行が途中に入っていないか

フィルター解除だけでなく、再設定まで含めて1セットで考えると事故が減ります。


✅ UiPath・RPAと組み合わせるときの注意点(後半応用)

Excel VBAでフィルターを解除せずに、UiPathなどのRPAから操作すると、

  • 取得件数が合わない
  • 表示行しか取得できない
  • 想定外の空データになる

といった問題が頻発します。

参考:Power Automate|「複数の項目の取得」から1件だけ取り出す方法|条件指定・最新データ抽出ガイド


・RPA前処理としてVBAを使う考え方

  • VBAで「状態を整える」
  • RPAで「安定した処理を行う」

この役割分担にすると、ロボット側の例外処理が激減します。




✅ まとめ:VBAでフィルターがかかっていたら解除する安全な書き方

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

  • フィルター解除は FilterMode を基準に判断する
  • AutoFilterMode だけを見るのは危険
  • ShowAllData は必ず条件付きで実行する
  • マクロの最初で解除するのが実務では最強
  • テーブル(ListObject)は別扱いが必要
  • RPA連携前の前処理として非常に重要

フィルター解除は地味ですが、
マクロの信頼性を大きく左右する超重要ポイントです。

ここを正しく押さえるだけで、
「なぜか合わない」「原因不明の不具合」は確実に減ります。

ぜひ、あなたの既存マクロにも組み込んでみてください。

参考:【VBA】フィルター後の可視セルに入力する方法|非表示行を除外する安全な実装例

    -VBAで自動化, VBA一覧, フィルタリング, 抽出・検索処理