「VBAで複数の列にフィルターをかけたいけど、うまくいかない」
「手動でやるのは簡単なのに、VBAで書くと意外と難しい…」
そんな悩みを持つ方に向けて、この記事ではExcelVBAで複数列にフィルターをかける具体的な方法とコツ、応用例や注意点まで徹底解説します。
Excelを業務で日々使うユーザーや、マクロを使って自動処理をしたい方にとって、複数列フィルターは知っておくべき重要なテクニックです。フィルターの操作に慣れておくと、データ抽出や集計業務が一気に効率化できます。
目次
✅ ExcelVBAで複数列フィルターをかける基本構文
まずは、複数列にフィルターをかける基本的な構文を理解しておきましょう。フィルターの対象となる列が複数ある場合、AutoFilterメソッドを使って列ごとに条件を設定します。
以下は、A列に「東京」、C列に「営業部」という条件でフィルターをかける例です。
Sub FilterMultipleColumns()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("データ")
' 一度フィルターを解除(不要なフィルターを消す)
If ws.AutoFilterMode Then ws.AutoFilterMode = False
' フィルターを設定
With ws.Range("A1").CurrentRegion
.AutoFilter Field:=1, Criteria1:="東京" ' A列に対してフィルター
.AutoFilter Field:=3, Criteria1:="営業部" ' C列に対してフィルター
End With
End Sub
・解説ポイント
AutoFilterは見出しのある範囲(通常はCurrentRegion)に対して実行されます。Field:=1は見出しから見た列番号(A列が1、B列が2…)です。- 複数列にかけたい場合は、それぞれの列に対して個別に
AutoFilterを指定します。
【VBA】「フィルター 空白以外」を設定する方法|空白を除外してデータ抽出する自動化手法
✅ 複数条件やワイルドカードの応用も可能
「A列が"東京"または"大阪"」のように複数条件を指定したい場合もあります。この場合は配列を使うことで対応できます。
Sub FilterMultipleValues()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("データ")
If ws.AutoFilterMode Then ws.AutoFilterMode = False
With ws.Range("A1").CurrentRegion
.AutoFilter Field:=1, Criteria1:=Array("東京", "大阪"), Operator:=xlFilterValues
.AutoFilter Field:=3, Criteria1:="営業部"
End With
End Sub
また、ワイルドカード(*や?)を使うこともできます。
.AutoFilter Field:=2, Criteria1:="*株式会社*"
*は任意の文字列?は任意の1文字
【VBA】オートフィルターに複数条件を設定する方法|業務効率を劇的に上げるフィルター自動化
■ 注意点:AutoFilterの範囲と構文ミスに注意!
複数列にフィルターをかける際のよくあるトラブルが、以下の2つです:
・ AutoFilterの範囲が適切でない
たとえば Range("A1:D100") などと限定的に指定してしまうと、途中でデータが切れて意図した結果になりません。
→ 原則として Range("A1").CurrentRegion のように連続範囲全体を自動取得するのが安全です。
・ Criteria1とOperatorの組み合わせミス
特に複数条件(Array(...))を使う場合、Operator:=xlFilterValues を忘れると配列として認識されずフィルターが無効になります。
✅ より実践的な使い方|日付や数値範囲のフィルター
数値や日付の範囲指定にも対応可能です。例えば「売上高が10000以上、かつ部署が営業部」のようなケースです。
Sub FilterNumericAndText()
Dim ws As Worksheet
Set ws = Worksheets("売上データ")
If ws.AutoFilterMode Then ws.AutoFilterMode = False
With ws.Range("A1").CurrentRegion
.AutoFilter Field:=4, Criteria1:=">=10000" ' 売上高(D列)
.AutoFilter Field:=3, Criteria1:="営業部" ' 部署(C列)
End With
End Sub
このように、文字列・数値・日付の条件を混在させたフィルターも、Field番号と条件を組み合わせて柔軟に設定可能です。
✅ フィルター結果のコピーや抽出も自動化できる
フィルターで絞り込んだ後、結果だけを別シートにコピーする処理も一緒に覚えておくと便利です。
Sub FilterAndCopy()
Dim wsSrc As Worksheet, wsDest As Worksheet
Set wsSrc = Worksheets("データ")
Set wsDest = Worksheets("抽出結果")
If wsSrc.AutoFilterMode Then wsSrc.AutoFilterMode = False
With wsSrc.Range("A1").CurrentRegion
.AutoFilter Field:=2, Criteria1:="企画部"
.SpecialCells(xlCellTypeVisible).Copy Destination:=wsDest.Range("A1")
End With
End Sub
補足:
SpecialCells(xlCellTypeVisible)はフィルターで表示されているセルだけを抽出します。- コピー先シートは事前に作成しておきましょう。
✅ フィルターの解除やエラー処理もセットで書こう
フィルター後にすぐ解除したい場合や、毎回クリーンな状態で処理したい場合は、AutoFilterMode = False や ShowAllData を組み合わせます。
If ws.FilterMode Then ws.ShowAllData ' フィルター解除
さらに、フィルター対象が0件だった場合のエラー処理も加えておくと、実務での運用が安定します。
■ まとめ|複数列フィルターでVBAの実務力を一段アップ!
VBAによる複数列フィルターは、基本を押さえれば非常に強力な自動化手段になります。この記事で紹介したポイントを振り返ってみましょう。
AutoFilterは1列ずつ個別に指定可能- 複数条件は
Array+Operator:=xlFilterValuesで実現 CurrentRegionで範囲指定をミスしない- フィルター結果の抽出・コピー処理も自動化できる
- フィルター解除やエラー対策も忘れずに実装
業務でのデータ処理が格段に楽になるこのテクニック、ぜひ自分のシナリオに取り入れてみてください。