【2026年9月最新】ExcelVBAのオートフィルターの設定・解除方法とは?FilterModeとAutoFilterModeの違いまで非エンジニアにもわかりやすく解説
「業務マクロを再実行したら、なぜか「実行時エラー」が出て止まってしまった」「オートフィルターを解除するコードを書いたはずなのに、思った通りに動かない」——ExcelVBAでオートフィルターを操作するマクロを作っていると、こうしたトラブルに一度は遭遇するはずです。
この手のトラブルの多くは、「フィルターの矢印(ドロップダウン)自体を消す」ことと「フィルターの絞り込み条件だけを解除する」ことを、コードの中で混同してしまうことが原因です。この2つは似ているようで、Excel内部では別の状態として管理されています。
この記事では、VBAでオートフィルターを設定・解除する基本的な方法から、多くの解説記事が見落としがちな「FilterMode」と「AutoFilterMode」という2つのプロパティの違いまで、非エンジニアの経営者・管理職の方にも分かる言葉で解説します。後半では、弊社(株式会社GENAI)がAIエージェント「Claude Code」を使って、こうした業務マクロの改修をどう運用しているかも紹介します。
この記事を最後まで読むと、次の6つが明確になります。
01 WHY IT MATTERS 経営者・管理職が「フィルターの解除」でつまずく理由 マクロを2回目に実行すると急にエラーになる、という典型的な相談
大量のデータを扱うExcel業務では、次のような相談が定期的に発生します。
こうした問題の背景には、多くの場合「今、シートがどういうフィルター状態にあるかを確認せずに、決め打ちでコードを書いている」という原因が関係しています。Excelのフィルター機能には、実は「矢印が表示されているか」と「実際に絞り込みが効いているか」という2つの異なる状態が存在し、これを区別せずに操作すると実行時エラーの温床になります。
大量データの抽出・集計にオートフィルターを使ったマクロを運用している部署がある場合、「マクロが安定して繰り返し実行できるか」を一度確認しておく価値があります。特に月次処理・日次集計のように同じマクロを何度も実行する業務では、この記事で扱う実行時エラーの回避が重要になります。
1-1. 「2回目だけエラーになる」は典型的な症状
VBAのオートフィルター関連のエラーで特に多いのが、「1回目の実行では問題ないが、2回目以降でエラーになる」というパターンです。これは、1回目の実行でフィルターの状態が変化し、2回目の実行時にはコードが想定していた状態と食い違ってしまうことが原因です。次章から、この状態管理の仕組みを具体的に見ていきます。
02 THE BASICS VBAでオートフィルターを設定する方法 単一条件・複数条件の絞り込みを書く
まずは基本の設定方法です。VBAでオートフィルターを設定するには、対象の範囲(Range)に対してAutoFilterメソッドを実行します。
📚 用語解説
AutoFilter(オートフィルター):Excelの表の見出し行に絞り込み用の矢印(ドロップダウン)を表示し、条件に合う行だけを表示する機能。VBAではRangeオブジェクトの AutoFilter メソッドを使って、この設定・条件指定・解除をプログラムから操作できる。
Sub SetFilterExample()
' A1:C100の範囲に、3列目(C列)が"完了"の行だけ表示するフィルターを設定
Range("A1:C100").AutoFilter Field:=3, Criteria1:="完了"
End Sub
Field:=3は「見出し行の何列目を対象にするか」、Criteria1:="完了"は「絞り込みの条件」を表します。複数の条件を組み合わせたい場合は、OperatorとCriteria2を追加します。
Sub SetFilterMultiCondition()
' C列が"未完了"または"保留"の行を表示(OR条件)
Range("A1:C100").AutoFilter Field:=3, Criteria1:="未完了", _
Operator:=xlOr, Criteria2:="保留"
' D列(4列目)が100以上200以下の行を表示(AND条件・数値範囲)
Range("A1:D100").AutoFilter Field:=4, Criteria1:=">=100", _
Operator:=xlAnd, Criteria2:="<=200"
End Sub
| 引数 | 意味 |
|---|---|
| Field | 見出し行の左から何列目を対象にするか(1始まり) |
| Criteria1 | 1つ目の絞り込み条件(文字列・数値の比較演算子も指定可能) |
| Operator | 2つの条件の組み合わせ方(xlAnd=両方満たす/xlOr=どちらか満たす) |
| Criteria2 | 2つ目の絞り込み条件(Operatorとセットで使う) |
03 REMOVING FILTERS オートフィルターを解除する2つの方法 「矢印ごと消す」のか「絞り込みだけ解除する」のかを区別する
ここが、この記事で最も重要なポイントです。「オートフィルターを解除する」という言葉には、実は2つの異なる操作が存在します。
| やりたいこと | コード | 結果 |
|---|---|---|
| フィルターの矢印(ドロップダウン)ごと消す | Range("A1:C100").AutoFilter(引数なしで再実行) | 見出し行の矢印が消え、フィルター機能自体がオフになる |
| 矢印は残したまま、絞り込み条件だけ解除する | ActiveSheet.ShowAllData | 矢印は残ったまま、非表示になっていた行がすべて再表示される |
' パターンA:フィルター機能ごとオフにする(矢印が消える)
Sub RemoveAutoFilterCompletely()
If ActiveSheet.AutoFilterMode Then
Range("A1:C100").AutoFilter ' 引数なしで実行すると、矢印がトグルでオフになる
End If
End Sub
' パターンB:矢印は残して、絞り込みだけ解除する
Sub ClearFilterCriteriaOnly()
If ActiveSheet.FilterMode Then
ActiveSheet.ShowAllData ' 隠れていた行をすべて再表示する
End If
End Sub
多くの解説記事では、この2つを厳密に区別せずShowAllDataや引数なしのAutoFilterをそのまま紹介していますが、実務では「担当者が矢印を使い続けたいのか、完全にフィルター機能を終わらせたいのか」によって使い分ける必要があります。
04 FILTERMODE VS AUTOFILTERMODE FilterModeとAutoFilterModeの違い 「絞り込みが効いているか」と「矢印が出ているか」は別の状態
前章の実行時エラーを防ぐ鍵になるのが、Worksheet.FilterModeとWorksheet.AutoFilterModeという2つのプロパティです。名前が非常に似ているため混同されがちですが、確認している内容はまったく異なります。
📚 用語解説
AutoFilterMode:ワークシートにフィルターの矢印(ドロップダウン)が表示されているかどうかを示すプロパティ(True/False)。絞り込み条件が設定されているかどうかは問わず、矢印そのものの有無だけを表す。
📚 用語解説
FilterMode:ワークシートが現在、実際に絞り込み条件によって行が非表示になっているかどうかを示すプロパティ(True/False)。矢印が表示されていても、絞り込み条件が設定されていなければFalseになる。
| 状態 | AutoFilterMode | FilterMode |
|---|---|---|
| オートフィルター自体を設定していない | False | False |
| 矢印は出ているが、絞り込み条件は未設定(全件表示) | True | False |
| 矢印が出ていて、かつ絞り込み条件が効いている(一部行が非表示) | True | True |
📚 用語解説
実行時エラー1004:VBAで発生する代表的なエラー番号の一つ。「アプリケーション定義またはオブジェクト定義のエラーです」という汎用的なメッセージで表示されることが多く、原因は状況によって様々だが、フィルター操作では「絞り込みが効いていない状態でShowAllDataを呼んだ」ことが典型的な原因となる。
ActiveSheet.ShowAllDataは、FilterModeがFalse(絞り込みが何も効いていない)の状態で実行すると、「実行時エラー1004」が発生します。「フィルターの矢印は出ているが、絞り込み条件は特に設定されていない」という状態でこのメソッドを呼ぶと、まさにこのエラーが起きます。
Sub SafeClearFilter()
' FilterModeを確認してからShowAllDataを呼ぶ = エラーにならない安全な書き方
If ActiveSheet.FilterMode Then
ActiveSheet.ShowAllData
End If
End Sub
このIf ActiveSheet.FilterMode Then ...という1行を入れるだけで、「絞り込みが効いていないときにShowAllDataを呼んでエラーになる」という、非常によくある実行時エラーを未然に防げます。
05 SAFE PATTERN 何度実行してもエラーにならない安全な実装パターン 状態を確認してから操作する、という設計の基本
ここまでの内容を踏まえて、「フィルターを設定し直す」「完全に解除する」という一連の操作を、何度実行してもエラーにならない形でまとめます。
Sub RefreshFilterSafely()
Dim ws As Worksheet
Set ws = ActiveSheet
' 1. 既存の絞り込みだけ解除(矢印は残す)
If ws.FilterMode Then
ws.ShowAllData
End If
' 2. 新しい条件で絞り込みを設定し直す
ws.Range("A1:C100").AutoFilter Field:=3, Criteria1:="完了"
End Sub
Sub RemoveFilterEntirelySafely()
Dim ws As Worksheet
Set ws = ActiveSheet
' フィルター機能そのものをオフにする(矢印も消す)
If ws.AutoFilterMode Then
ws.AutoFilterMode = False
End If
End Sub
後者のws.AutoFilterMode = Falseは、Range.AutoFilterを引数なしで呼ぶのと似た効果を持ちますが、「オブジェクト(ワークシート)のプロパティに直接False代入する」形で書けるため、対象のRangeを毎回指定し直す必要がなく、コードが安定しやすいという利点があります。
状態を確認
FilterMode
AutoFilterMode
解除するか
判断
FilterMode
=Trueなら実行
再設定
Field・Criteria
を指定
矢印ごと
オフに
AutoFilterMode
=False
5-1. Worksheetを明示的に指定する習慣も安定性を高める
もう1つの実務上のコツとして、ActiveSheetに頼りきらず、対象のシートをWorksheets("シート名")のように明示的に指定する書き方も、業務マクロの安定性を高めます。ActiveSheetは「今アクティブになっているシート」を指すため、担当者が別のシートを開いた状態でマクロを実行すると、意図しないシートに対してフィルター操作をしてしまう可能性があります。
Sub SafeClearFilterExplicitSheet()
Dim ws As Worksheet
Set ws = Worksheets("集計データ") ' ActiveSheetに頼らず明示的に指定
If ws.FilterMode Then
ws.ShowAllData
End If
End Sub
「今どのシートを見ているか」という担当者の操作状況に依存しない書き方にしておくことで、誰がどのタイミングでマクロを実行しても同じ結果になるという、業務マクロとして重要な性質が保たれます。
「フィルターは必ず設定されているはず」という前提でコードを書くと、担当者が手動でフィルターを解除していた場合などにエラーが発生します。状態を確認してから操作するという書き方を徹底することが、繰り返し使える業務マクロの条件です。
06 COMMON PITFALLS 業務マクロ運用でよくある落とし穴 早見表 専門知識がなくても確認できる観点
非エンジニアの担当者でも、以下の観点で業務マクロのセルフチェックが可能です。
| 確認したいこと | 確認方法の例 |
|---|---|
| 同じマクロを2回続けて実行してもエラーが出ないか | 本番運用の前に、必ず2回連続で実行するテストを担当者やAIに依頼する |
| 「フィルター解除」の依頼が、矢印を消すことか絞り込みを外すことか | 依頼者・担当者の間で「矢印を残すか」を確認してから改修する |
| 複数条件のフィルターが意図通りAND/ORで組まれているか | OperatorがxlAndかxlOrか、コードやAIへの依頼時に明記する |
| 手動でフィルターを解除された後もマクロが正常に動くか | 担当者が手動操作した後の状態でもマクロを実行して確認する |
フィルターが未設定の状態でマクロを作ってテストすると、その場では問題なく動きます。しかし、翌日別の担当者がフィルターをかけた状態でマクロを実行すると、想定していなかった状態のためにエラーが発生する、というケースが典型的です。複数の状態パターンでテストしておくことが重要です。
6-1. 「担当者によってフィルターの後片付けが違う」問題も見逃せない
複数の担当者が同じシートを使っている職場では、「使い終わったらフィルターを外す人」と「フィルターをかけたままにする人」が混在するという問題がよく起こります。この「後片付けのバラつき」が、翌日のマクロ実行時のエラーの温床になります。
AIエージェントにマクロの改修を一元化して依頼することの隠れた利点は、こうした「人によって前提となる状態がバラつく」問題そのものを、状態確認のコードで吸収できることです。誰がどんな状態でシートを残していても、マクロ側で状態を確認してから動作するように作っておけば、トラブルが起きません。
07 GENAI CASE STUDY 【独自データ】GENAI社内、業務マクロの改修をClaude Codeにどこまで任せているか 状態確認のガードまで含めた改修を、AIエージェントに依頼する運用
ここからは、弊社(株式会社GENAI)の実運用データを紹介します。弊社ではClaude Max 20xプラン(月額$200・約30,000円)を契約し、経営・営業・広告・開発・経理・秘書業務まで全社的にAIエージェント「Claude Code」を活用しています。
| 項目 | 内容 |
|---|---|
| 契約プラン | Claude Max 20x(月$200 / 約30,000円) |
| 利用開始 | 2025年後半〜 |
| マクロ改修関連の用途 | 既存VBAマクロの実行時エラー修正、フィルター状態確認ガードの追加、複数条件フィルターの実装 |
| 担当体制 | 専任のVBA開発者を新規に雇わず、既存メンバー+Claude Codeで対応 |
弊社では、既存の業務マクロを改修する際、Claude Codeに「このマクロ、2回目に実行するとエラーになるので直して」といった日本語での依頼をするだけで、内部的にFilterModeやAutoFilterModeの状態確認を含む改修コードを組み立ててもらっています。「どんな状態で実行してもエラーにならないか」まで含めて自動的にチェックしてもらうのが、弊社の標準的な運用です。
「2回目で
エラーになる」
と共有
Claude Codeが
状態確認の
抜けを特定
FilterMode等の
ガード処理を
追加
人間が
複数回実行して
確認
この運用の利点は、「決め打ちの前提でコードを書いてしまう」という、経験のあるVBA担当者でも意識しないと見落とす落とし穴を、AIが標準的な対策(状態確認のガード処理)を踏まえた上で回避してくれる点にあります。人間が「こういう時にエラーになる」という現象を伝えるだけで、実装の細部と品質管理はAIに任せられます。
7-1. 「起きている現象」を伝えるだけで済む依頼の仕方
弊社の実務では、マクロ改修に関する依頼のほとんどが「何が起きて、どう困っているか」を一言で伝えるだけで完結しています。「2回目の実行でエラーになる」「フィルターを解除したはずなのに動きがおかしい」といった、非エンジニアでも自然に使える言葉で十分にAIへ意図が伝わります。
📚 用語解説
現象の言語化:「2回目に実行するとエラーになる」「解除したはずなのに変わらない」といった、目に見える現象そのものを専門用語を使わずに説明すること。原因(FilterModeの確認漏れ等)を特定する作業自体はAIエージェントに任せられる。
08 CONCLUSION まとめ ── 「状態を確認してから操作する」が業務マクロの安定性を決める 技術の詳細を知らなくても、リスクは管理できる
この記事では、VBAでオートフィルターを設定・解除する基本的な方法から、FilterModeとAutoFilterModeの違い、何度実行してもエラーにならない安全な実装パターン、そして弊社GENAIがAIエージェント「Claude Code」を使ってマクロ改修をどう運用しているかを紹介しました。最後にポイントを振り返ります。
Range.AutoFilter Field:=n, Criteria1:="条件"が基本形If ActiveSheet.FilterMode Then ShowAllDataという状態確認が、エラー回避の鍵「フィルターを解除する」という操作は一見単純ですが、その裏側には「今、シートがどんな状態にあるか」を確認せずに操作してしまうという、経験のあるVBA担当者でも見落としやすい落とし穴が潜んでいます。技術の詳細を全て理解する必要はありませんが、「状態を確認してから操作する」という考え方を知っているだけで、改修の依頼の質が上がります。
小さなエラーを放置せず、状態確認まで含めて早めに改善する習慣を持つことが、業務マクロの安定性を守る確実な一歩です。
「時々エラーになる」業務マクロ、AIで安定した仕組みに作り直しませんか?
フィルター関連のエラー修正から、状態確認ガードの追加・業務プロセス全体の自動化まで。
Claude Codeを使った「何度実行しても安定するマクロ」の作り方を、実例ベースでご提案します。
ここから先の進め方は、大きく2つあります。
自社で回せるようになりたい方は、AI鬼管理でClaude Code/Codexの使い方から業務設計・社内定着まで伴走を受けながら、社内に仕組みを作る道があります。
覚えるより任せたい方は、AI社員AIKATAでこの記事のような定型業務を丸ごと預ける道があります。料金は月30万円の月額定額、追加費用は0円です。
どちらが合うかは、業務量と社内体制次第です。無料相談・無料適合診断で、貴社の場合はどちらが向くかからご相談いただけます。
NEXT STEP
この記事の内容を、あなたのビジネスで
実践してみませんか?
よくある質問
Q. ShowAllDataを実行すると「実行時エラー1004」が出ます。原因は何ですか?
A. FilterModeがFalse、つまり「現在絞り込み条件が何も効いていない」状態でShowAllDataを実行すると、このエラーが発生します。実行前に「If ActiveSheet.FilterMode Then ShowAllData」のように状態を確認してから呼び出すことで回避できます。
Q. AutoFilterModeとFilterModeの違いが分かりにくいです。もう少し具体的に教えてください。
A. AutoFilterModeは「フィルターの矢印(ドロップダウン)が表示されているか」を示し、FilterModeは「実際に絞り込み条件によって行が非表示になっているか」を示します。矢印は出ていても絞り込みは効いていない、という状態もあり得るため、両者は別々に確認する必要があります。
Q. オートフィルターで複数条件(AND・OR)を指定する方法は?
A. 1つ目の条件をCriteria1、2つ目の条件をCriteria2に指定し、Operator引数にxlAnd(両方満たす)またはxlOr(どちらか満たす)を指定します。例:Range("A1:C100").AutoFilter Field:=3, Criteria1:="A", Operator:=xlOr, Criteria2:="B"
Q. マクロを2回目に実行するとエラーになるのはなぜですか?
A. 1回目の実行でフィルターの状態(絞り込みの有無など)が変化し、2回目の実行時にはコードが想定していた状態と食い違っていることが主な原因です。ShowAllDataやAutoFilterの呼び出し前に、必ず現在の状態(FilterMode・AutoFilterMode)を確認する書き方に直すことで解決します。
Q. 非エンジニアでも、マクロのフィルター関連エラーの原因を特定する依頼はできますか?
A. できます。「2回目に実行するとエラーになる」「フィルターを解除したはずなのに動きが変わらない」といった、実際に見えている現象を伝えるだけで十分です。原因の特定(FilterModeの確認漏れ等)はClaude CodeのようなAIエージェントに任せることができます。
Q. Claude Codeに業務マクロの改修を依頼する場合、専門知識は必要ですか?
A. 不要です。「このマクロ、2回目の実行でエラーになる」といった感覚的な言葉で伝えるだけで、Claude CodeがFilterModeやAutoFilterModeの確認漏れを特定し、修正コードを日本語で説明してくれます。最終確認・承認だけ人間が行う運用で十分に回せます。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
AI鬼管理/AI社員AIKATAへのお問い合わせ
この記事を読んで気になった方へ。
専門スタッフが、御社に最適な
業務自動化・業務代行プランを無料でご提案します。




