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

【VBA】複数列にフィルターをかける方法|応用例・エラー対策も解説

「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 = FalseShowAllData を組み合わせます。

If ws.FilterMode Then ws.ShowAllData ' フィルター解除

さらに、フィルター対象が0件だった場合のエラー処理も加えておくと、実務での運用が安定します。


■ まとめ|複数列フィルターでVBAの実務力を一段アップ!

VBAによる複数列フィルターは、基本を押さえれば非常に強力な自動化手段になります。この記事で紹介したポイントを振り返ってみましょう。

  • AutoFilterは1列ずつ個別に指定可能
  • 複数条件はArrayOperator:=xlFilterValuesで実現
  • CurrentRegionで範囲指定をミスしない
  • フィルター結果の抽出・コピー処理も自動化できる
  • フィルター解除やエラー対策も忘れずに実装

業務でのデータ処理が格段に楽になるこのテクニック、ぜひ自分のシナリオに取り入れてみてください。

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