VBAで自動化 VBA一覧 フィルター操作 抽出・検索処理

【VBA】AutoFilterの複数条件を設定する方法|AND・ORを自在に操る実務向け活用術

Excelでデータを抽出するときに欠かせない「フィルター」機能。
手動操作では簡単に複数条件を指定できますが、「毎回設定するのが面倒」「同じ条件で毎月データを抽出したい」と感じたことはありませんか?

VBAの AutoFilterメソッド を使えば、複数条件を自動で設定して一瞬で抽出できます。
この記事では、AutoFilterの複数条件指定を「OR」「AND」両方の観点から詳しく解説し、実務ですぐ使える応用例まで紹介します。

✅ AutoFilterメソッドの基本構文をおさらい

複数条件を設定する前に、まずはAutoFilterの基本形を確認しておきましょう。


🔹 基本構文

Range("範囲").AutoFilter Field:=列番号, Criteria1:="条件"
引数説明
Fieldフィルターをかける列番号(範囲の左から数えて)
Criteria1抽出する条件
OperatorAND/OR 条件を指定する(複数条件を使うときに必要)
Criteria22つ目の条件を指定

🔹 単一条件の例

Sub FilterSingle()
    Range("A1:D100").AutoFilter Field:=2, Criteria1:="営業部"
End Sub

この例では、B列(2列目)の値が「営業部」の行のみを抽出します。


ここまでは単一条件。
次は本題の 複数条件(複数値)での抽出 に進みます。


✅ OR条件(いずれかに一致する)

まずは「営業部または開発部」のように、いずれかの値に一致する場合の設定です。
この場合は、Operator:=xlOr を使います。


🔹 OR条件の構文

Range("範囲").AutoFilter Field:=列番号, _
    Criteria1:="条件1", Operator:=xlOr, Criteria2:="条件2"

🔹 例:「営業部」または「開発部」を抽出

Sub FilterOrCondition()
    Range("A1:D100").AutoFilter Field:=2, _
        Criteria1:="営業部", Operator:=xlOr, Criteria2:="開発部"
End Sub

処理内容

  • 範囲:A1:D100
  • 2列目(B列)を対象
  • 値が「営業部」または「開発部」の行だけを抽出

このように Operator:=xlOr を使うと、OR条件になります。
業務で「複数部門」や「複数カテゴリ」を抽出したいときによく使います。


💡 複数条件(3つ以上)の場合

AutoFilterの構文では、Criteria1Criteria2 の2つしか直接指定できません。
3つ以上の条件を設定したい場合は、配列を使って指定します。

参考:【VBA】If文の複数条件をリストで判定する方法|効率的な条件分岐の書き方と応用


✅ 複数値(3つ以上)を指定する|配列を使う方法

OR条件を3つ以上に拡張したい場合は、Criteria1:=Array() を使います。


🔹 構文

Range("範囲").AutoFilter Field:=列番号, Criteria1:=Array("条件1", "条件2", "条件3"), Operator:=xlFilterValues

🔹 例:「営業部」「開発部」「総務部」を抽出

Sub FilterMultipleOr()
    Range("A1:D100").AutoFilter Field:=2, _
        Criteria1:=Array("営業部", "開発部", "総務部"), Operator:=xlFilterValues
End Sub

解説

  • Array("営業部", "開発部", "総務部") のように配列で条件をまとめる
  • Operator:=xlFilterValues で「配列条件」を有効にする
  • いずれかに一致する行が抽出される(OR条件)

この方法は、部門・商品カテゴリ・支店名などの複数一致抽出に非常に便利です。

参考:【VBA】IF文のorを3つ以上組み合わせた複数条件


✅ AND条件(両方の条件に一致する)

次は、「A列が営業部 かつ C列が100以上」のように、
複数の条件を同時に満たす(AND条件) 抽出です。

この場合は、複数の列を使ってフィルターをかけるのがポイントです。


🔹 例:B列が「営業部」かつC列が「100以上」

Sub FilterAndCondition()
    Range("A1:D100").AutoFilter Field:=2, Criteria1:="営業部"
    Range("A1:D100").AutoFilter Field:=3, Criteria1:=">=100"
End Sub

処理の流れ

  1. まずB列に「営業部」フィルターをかける
  2. 次にC列で「100以上」の条件を設定

結果として、両方の条件を満たす行だけが表示されます。
これがVBAでの「AND条件」に相当します。


💡 ポイント

AutoFilterは列単位で独立して条件を持てるため、
複数列に順番でフィルターをかけることでAND条件を実現できます。

参考:【VBA】If文でAND条件を使用する方法


✅ 数値条件での複数指定(範囲指定)

数値の範囲を指定する場合も、複数条件を使うことが可能です。
たとえば「100以上かつ500以下」のように設定する場合です。


🔹 例:C列の値が「100〜500」

Sub FilterNumberRange()
    Range("A1:D100").AutoFilter Field:=3, _
        Criteria1:=">=100", Operator:=xlAnd, Criteria2:="<=500"
End Sub

処理内容

  • 3列目(C列)を対象
  • 値が100以上かつ500以下の行を抽出

Operator:=xlAnd によって、範囲条件の両方を満たす行のみが表示されます。


🔹 例:売上高が「100万円以上500万円以下」

Sub FilterSalesRange()
    Range("A1:E200").AutoFilter Field:=4, _
        Criteria1:=">=1000000", Operator:=xlAnd, Criteria2:="<=5000000"
End Sub

売上管理などでの範囲抽出に最適な構文です。

参考:【VBA】セルの値が一致したら処理を実行する方法|If文・ループ・実務活用例




✅ 日付条件での複数指定

日付の場合も同様にAND条件を使って範囲を指定できます。


🔹 例:2024年4月1日〜2024年4月30日

Sub FilterDateRange()
    Range("A1:D100").AutoFilter Field:=1, _
        Criteria1:=">=2024/4/1", Operator:=xlAnd, Criteria2:="<=2024/4/30"
End Sub

注意点

  • 日付は "2024/4/1" のように文字列形式で指定します。
  • Excel内部ではシリアル値で扱われるため、Format関数で整形しても動作します。

🔹 例:今日以降のデータを抽出(動的日付)

Sub FilterAfterToday()
    Dim todayDate As String
    todayDate = Format(Date, "yyyy/m/d")

    Range("A1:D100").AutoFilter Field:=1, Criteria1:=">=" & todayDate
End Sub

これにより、今日以降の日付が自動的に抽出されます。
定期レポートやスケジュール表の抽出で便利です。

参考:【VBA】日付を判定する方法:IsDate・VarType・DateValue・CDate


✅ 複数列を使った条件抽出(組み合わせ応用)

複数列を組み合わせることで、実務に近い複雑な条件抽出が可能です。


🔹 例:B列が「営業部」かつC列が「売上500以上」

Sub FilterMultiColumn()
    With Range("A1:D100")
        .AutoFilter Field:=2, Criteria1:="営業部"
        .AutoFilter Field:=3, Criteria1:=">=500"
    End With
End Sub

2つの列に独立した条件をかけることで、
「営業部のうち売上が500以上」のデータだけを抽出できます。


💡 別シートや変数を使った条件もOK

Sub FilterByVariable()
    Dim dep As String, limit As Long
    dep = Sheets("設定").Range("B1").Value
    limit = Sheets("設定").Range("B2").Value

    With Sheets("データ").Range("A1:D100")
        .AutoFilter Field:=2, Criteria1:=dep
        .AutoFilter Field:=3, Criteria1:=">=" & limit
    End With
End Sub

条件を変数で設定すれば、ユーザーが設定シートに入力するだけで抽出内容を切り替え可能です。
このようにして「毎月の自動抽出マクロ」を作ることもできます。

参考:【VBA】VLOOKUP を別シートで使う方法と実用例


✅ フィルター解除の基本構文

抽出後に必ず解除処理を入れておくと、他のマクロと干渉しません。

Sub ClearFilter()
    If ActiveSheet.AutoFilterMode Then
        ActiveSheet.AutoFilterMode = False
    End If
End Sub

または、同じ範囲に .AutoFilter を再実行して解除することもできます。


✅ 実務で役立つ応用シナリオ

① 特定部門+売上範囲抽出

  • 部署列で「営業部」
  • 売上列で「100万円〜500万円」
  • 条件を組み合わせて自動抽出

② 指定月のデータ抽出

  • 日付列で「>=月初」「<=月末」
  • 月次集計を自動化できる

③ 配列で複数カテゴリ抽出

  • 商品区分が「A・B・C」に該当する行を抽出
  • 人手による絞り込みを完全自動化

✅ よくあるエラーと対処法

エラー原因対処法
実行時エラー1004範囲外参照範囲指定を確認(A1:Dなど)
条件が反映されないCriteria1の指定ミス"文字列"の引用符を忘れない
数値が正しく抽出されない文字列扱い">=" & 数値 形式で結合する
フィルターが残るAutoFilterMode未解除ActiveSheet.AutoFilterMode = False を追加

✅ 処理速度を上げるコツ

フィルター処理を高速化するには、画面更新と自動計算を一時停止しましょう。

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

' --- フィルター処理 ---
Range("A1:D100").AutoFilter Field:=2, Criteria1:="営業部"

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

これにより、処理速度が2倍以上になることもあります。


■ まとめ:AutoFilter複数条件を使いこなせば分析が自動化できる

  • Operator:=xlOr … OR条件(いずれかに一致)
  • Operator:=xlAnd … AND条件(範囲や複数列を組み合わせ)
  • 配列 Array() を使えば3つ以上のOR条件も指定可能
  • 数値・日付・文字列などの型に注意して正確に抽出
  • AutoFilterMode=False で解除も忘れずに

AutoFilterの複数条件を理解すれば、手動操作を完全に自動化し、抽出業務を一瞬で完了できます。
レポート作成や月次データ分析の第一歩として、ぜひ今日から活用してみてください。

-VBAで自動化, VBA一覧, フィルター操作, 抽出・検索処理