【完全版】VBAでフィルター(AutoFilter)を使いこなす方法|解除・複数条件・注意点まで徹底解説

Excelで大量のデータを扱うとき、「必要なデータだけを一時的に表示したい」という場面は非常に多くあります。

その代表的な機能が フィルター(AutoFilter) です。

VBAを使えば、このフィルター操作を自動化でき、

  • 毎回同じ条件で抽出する
  • フィルター後のデータだけを処理する
  • 処理が終わったら元の状態に戻す

といった 一連の作業をワンクリックで実行 できます。

一方で、

  • フィルターが解除できない
  • 条件を指定したのに抽出されない
  • 複数条件の書き方が分からない
  • フィルター後の処理でエラーが出る

など不具合に悩まされることもあります。

この記事では、実務で本当に困りやすいポイントまで含めて丁寧に解説します。

目次

VBAのAutoFilterとは?

AutoFilterは、Excelの
[データ]→[フィルター]
で設定できる、行の表示・非表示を切り替える機能です。

VBAから操作すると、次のようなことが可能になります。

  • 指定した条件で自動的にフィルターをかける
  • 毎回同じ抽出条件を再現する
  • 抽出後の行だけをコピー・集計・転記する
  • 処理が終わったらフィルターを解除する

つまり、
「手作業でやっていたフィルター操作」をそのままマクロ化できる
というイメージです。

VBAでフィルターを設定する基本構文

フィルターを有効にするだけの最小コード

Range("B2:E7").AutoFilter

このコードを実行すると、
指定した範囲の 1行目が見出し行として認識 され、フィルターが設定されます。

列と条件を指定してフィルターする

Range("B2:E7").AutoFilter Field:=2, Criteria1:="東京"
  • Field:左から何列目か(1始まり)
  • Criteria1:抽出条件

この例では、
2列目が「東京」の行だけが表示 されます。

フィルター範囲の指定で最も重要な考え方

見出し行を必ず含める

AutoFilterは、見出し行がないと正しく動作しません

Excelのフィルターは、

  • 1行目:見出し行(列名)
  • 2行目以降:データ行

という構造を前提に動作します。この問題を確実に回避するために、見出しセルを起点にして範囲を自動取得する方法がよく使われます。

それが次のコードです。

Range("A1").CurrentRegion.AutoFilter

UsedRangeを使う場合の注意点

ActiveSheet.UsedRange.AutoFilter

この書き方も可能ですが、

  • 過去に使ったセル
  • 不要な空白

まで含まれることがあるため、
意図しない範囲までフィルターがかかる ことがあります。

慣れないうちは CurrentRegion を使う方が無難です。

フィルターを解除する方法

VBAでフィルターを扱う際、解除方法の違いを理解していないと不具合を招く可能性が高まります。

フィルター自体を完全に解除する

下記コードは、フィルター自体を解除するコードです。実行することで各列に設定されているフィルターの「▼」自体が消えます。

If ActiveSheet.AutoFilterMode Then
    ActiveSheet.AutoFilterMode = False
End If

フィルターは残したまま、条件だけ解除する

下記コードは、フィルター自体は残しつつ、条件を解除するコードです。条件により絞り込まれた状態から、全データを再表示することができます。

If ActiveSheet.FilterMode Then
    ActiveSheet.ShowAllData
End If

複数条件でフィルターする方法

複数の条件で絞り込みたい場合もマクロで実現することができます。

OR条件

Range("B2:E7").AutoFilter Field:=2, Criteria1:=Array("東京", "大阪"), Operator:=xlFilterValues

AND条件(同一の列に対して)

Range("B2:E7").AutoFilter Field:=4, Criteria1:=">=150", Operator:=xlAnd, Criteria2:="<=250"

AND条件(複数の列に対して)

' ① 2列目が「東京」
Range("B2:E7").AutoFilter Field:=2, Criteria1:="東京"

' ② 4列目が「200以上」
Range("B2:E7").AutoFilter Field:=4, Criteria1:=">=200"

数値・空白・日付フィルターの実務パターン

空白のみを抽出

Range("B2:E7").AutoFilter Field:=2, Criteria1:="="

空白以外を抽出

Range("B2:E7").AutoFilter Field:=2, Criteria1:="<>"

日付の期間指定

Range("B2:E7").AutoFilter Field:=4, Criteria1:=">=2025/01/01", Operator:=xlAnd, Criteria2:="<=2025/01/31"

日付は文字列として指定するのが無難です。

よくあるトラブルと対策

結合セルがある場合のトラブル

結合セルがあると、

  • フィルターが効かない
  • 行がズレる
  • エラーが発生する

といったトラブルが起こります。実務では、フィルター前に結合セルを解除するという前処理を入れるのが定石です。

セル結合に関する処理について知りたい方はこちらの記事をご覧ください。

フィルター後の「表示行だけ」を処理したい

フィルターでの絞り込みをしたにも関わらず、全セルを処理してしまう のはよくあるミスです。

対策としては、可視セルのみ を対象にしたRange変数として取得して、その後の処理に繋げます。

Dim rng As Range
Set rng = Range("A2:A10").SpecialCells(xlCellTypeVisible)

コピー・集計・転記など、フィルター後の処理では必須の書き方です。

まとめ|AutoFilterは実務自動化の要

  • フィルターは「削除」ではなく「表示制御」
  • 見出し行を含めるのが絶対条件
  • 解除方法は2種類ある
  • 複数条件・空白・日付は使いどころが多い
  • フィルター後は可視セルのみ処理する

VBAで業務効率化をするなら、AutoFilterは避けて通れない必須処理 です。

この記事のコードをテンプレとして使えば、日々のデータ抽出・集計作業を大幅に自動化できます。

この記事を書いた人

うつ病により二度の休職を経験。
現在は自動車メーカー勤務で、開発業務改善に従事。
自身の経験を基にしたメンタル改善のための情報や、仕事を楽にするためのVBAのノウハウ発信をしています。

目次