Excel VBAで処理を自動化していると、「なぜかデータが全部処理されていない」「件数が合わない」「コピー結果が欠けている」といった違和感に遭遇することがあります。
その原因の多くが、すでにシートにフィルターがかかっていたという見落としです。
特に、
・他人が操作したブック
・前回のマクロ実行後の状態
・共有ブックや定期処理用ファイル
こうした環境では、フィルター状態を前提にしないコードは非常に危険です。
この記事では、「フィルターがかかっていたら解除する」という一見シンプルな処理を、
なぜ必要なのか/どう書くのが安全か/どこで失敗しやすいかまで含めて、実務目線で徹底解説します。
目次
- ✅ VBAで「フィルターがかかっていたら解除」が重要な理由
- ・実務で起きがちな失敗パターン
- ✅ フィルター解除の基本|まず押さえるべき考え方
- ・AutoFilterMode と FilterMode の違い
- ✅ 最も基本的なフィルター解除コード
- ・基本構文:フィルターがかかっていたら解除する
- ・なぜこの書き方が安全なのか
- ✅ AutoFilterModeだけを見てはいけない理由
- ・このコードで起きる問題
- ・正しい考え方
- ✅ 特定シートのフィルターを解除する方法
- ・シートを指定して解除
- ・実務でシート指定が重要な理由
- ✅ ListObject(テーブル)にフィルターがかかっている場合
- ・テーブルのフィルター解除コード
- ・通常範囲との違い
- ✅ フィルターが存在しない場合も含めて安全に解除する方法
- ・On Error を使った実務向けコード
- ・この書き方のメリットと注意点
- ✅ フィルター解除をマクロの「最初」に入れるべき理由
- ・推奨構成
- ・この構成が強い理由
- ✅ フィルター解除+再設定をセットで行う実務パターン
- ・解除 → 再設定の例
- ・このときの注意点
- ✅ UiPath・RPAと組み合わせるときの注意点(後半応用)
- ・RPA前処理としてVBAを使う考え方
- ✅ まとめ:VBAでフィルターがかかっていたら解除する安全な書き方
✅ VBAで「フィルターがかかっていたら解除」が重要な理由
「フィルターは見た目で分かるから大丈夫」と思っていると、後で必ず痛い目を見ます。
VBAは画面に見えている状態ではなく、内部状態をそのまま処理するため、フィルターの有無を意識しないコードは不具合の温床になります。
・実務で起きがちな失敗パターン
- フィルターされたまま
Range.Copyしてしまう - 件数取得(
CountやRows.Count)が合わない - フィルター解除コードを書いたがエラーになる
- フィルターが存在しないのに
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 が実行されてエラーになる
・正しい考え方
| 状態 | AutoFilterMode | FilterMode |
|---|---|---|
| フィルターなし | False | False |
| フィルターあり(未絞込) | True | False |
| フィルターあり(絞込中) | True | True |
👉 解除すべきなのは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連携前の前処理として非常に重要
フィルター解除は地味ですが、
マクロの信頼性を大きく左右する超重要ポイントです。
ここを正しく押さえるだけで、
「なぜか合わない」「原因不明の不具合」は確実に減ります。
ぜひ、あなたの既存マクロにも組み込んでみてください。