Excelでデータを抽出するときに欠かせない「フィルター」機能。
手動操作では簡単に複数条件を指定できますが、「毎回設定するのが面倒」「同じ条件で毎月データを抽出したい」と感じたことはありませんか?
VBAの AutoFilterメソッド を使えば、複数条件を自動で設定して一瞬で抽出できます。
この記事では、AutoFilterの複数条件指定を「OR」「AND」両方の観点から詳しく解説し、実務ですぐ使える応用例まで紹介します。
目次
- ✅ AutoFilterメソッドの基本構文をおさらい
- 🔹 基本構文
- 🔹 単一条件の例
- ✅ OR条件(いずれかに一致する)
- 🔹 OR条件の構文
- 🔹 例:「営業部」または「開発部」を抽出
- 💡 複数条件(3つ以上)の場合
- ✅ 複数値(3つ以上)を指定する|配列を使う方法
- 🔹 構文
- 🔹 例:「営業部」「開発部」「総務部」を抽出
- ✅ AND条件(両方の条件に一致する)
- 🔹 例:B列が「営業部」かつC列が「100以上」
- ✅ 数値条件での複数指定(範囲指定)
- 🔹 例:C列の値が「100〜500」
- 🔹 例:売上高が「100万円以上500万円以下」
- ✅ 日付条件での複数指定
- 🔹 例:2024年4月1日〜2024年4月30日
- 🔹 例:今日以降のデータを抽出(動的日付)
- ✅ 複数列を使った条件抽出(組み合わせ応用)
- 🔹 例:B列が「営業部」かつC列が「売上500以上」
- 💡 別シートや変数を使った条件もOK
- ✅ フィルター解除の基本構文
- ✅ 実務で役立つ応用シナリオ
- ① 特定部門+売上範囲抽出
- ② 指定月のデータ抽出
- ③ 配列で複数カテゴリ抽出
- ✅ よくあるエラーと対処法
- ✅ 処理速度を上げるコツ
- ■ まとめ:AutoFilter複数条件を使いこなせば分析が自動化できる
✅ AutoFilterメソッドの基本構文をおさらい
複数条件を設定する前に、まずはAutoFilterの基本形を確認しておきましょう。
🔹 基本構文
Range("範囲").AutoFilter Field:=列番号, Criteria1:="条件"
引数 | 説明 |
---|---|
Field | フィルターをかける列番号(範囲の左から数えて) |
Criteria1 | 抽出する条件 |
Operator | AND/OR 条件を指定する(複数条件を使うときに必要) |
Criteria2 | 2つ目の条件を指定 |
🔹 単一条件の例
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の構文では、Criteria1
と Criteria2
の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条件)
この方法は、部門・商品カテゴリ・支店名などの複数一致抽出に非常に便利です。
✅ 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
処理の流れ
- まずB列に「営業部」フィルターをかける
- 次にC列で「100以上」の条件を設定
結果として、両方の条件を満たす行だけが表示されます。
これがVBAでの「AND条件」に相当します。
💡 ポイント
AutoFilterは列単位で独立して条件を持てるため、
複数列に順番でフィルターをかけることで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の複数条件を理解すれば、手動操作を完全に自動化し、抽出業務を一瞬で完了できます。
レポート作成や月次データ分析の第一歩として、ぜひ今日から活用してみてください。