ExcelのFILTER関数|複数条件・使い方・VBA自動化まで解説

ExcelのFILTER関数を使えば、条件に合うデータを一瞬で抽出できます。VBA自動化まで一気に解説します!
まずは関数の使い方を解説し、最後にVBA自動化コードも紹介します
{VBA_DEMO}- FILTER関数の書式と3つの引数の意味
- 複数条件(AND/OR)でデータを絞り込む方法
- SORT・UNIQUE・INDEX MATCHとの組み合わせテクニック
- FILTER関数が使えない環境での代替方法
- #CALC!・#VALUE!・スピルエラーの原因と対処法
- VBAでフィルタリング処理を自動化するコード3選
FILTER関数とは?基本の使い方
FILTER関数は、指定した条件に一致するデータを元の表から抽出して、別のセル範囲に表示する関数です。Microsoft 365およびExcel 2021以降で使用できます。
従来のオートフィルター機能と異なり、FILTER関数は元のデータを非表示にせず、別の場所に結果を出力します。元データが変更されると結果も自動的に更新されるため、動的なレポート作成に最適です。
{DIAGRAM_FILTER_BASIC}FILTER関数の書式と引数
FILTER関数の構文は以下の通りです。
=FILTER(配列, 含む, [空の場合])
各引数の意味を表にまとめます。
| 引数 | 必須/任意 | 説明 |
|---|---|---|
| 配列 | 必須 | フィルタリング対象のセル範囲(例: A2:D100) |
| 含む | 必須 | 抽出条件を指定する論理式(例: B2:B100=”東京”)。TRUEの行が抽出される |
| 空の場合 | 任意 | 条件に一致するデータがない場合に返す値(例: “該当なし”) |
ポイント: 第2引数「含む」は、配列と同じ行数(または列数)の論理配列を返す式を指定します。条件式の結果がTRUEになる行だけが抽出されます。
第3引数「空の場合」を省略すると、条件に合うデータが1件もないときに#CALC!エラーが発生します。実務では “該当データなし” などの文字列を指定しておくのがおすすめです。
基本的なフィルタリング例
以下の売上データから「東京」のデータだけを抽出する例を見てみましょう。
| 社員名 | 支店 | 商品 | 売上金額 |
|---|---|---|---|
| 田中 | 東京 | ノートPC | 150,000 |
| 佐藤 | 大阪 | モニター | 45,000 |
| 鈴木 | 東京 | キーボード | 8,500 |
| 高橋 | 名古屋 | マウス | 3,200 |
| 伊藤 | 東京 | モニター | 52,000 |
この表がA1:D6にある場合、以下の数式でB列(支店)が「東京」の行だけを抽出できます。
=FILTER(A2:D6, B2:B6="東京", "該当なし")
この数式をF2セルに入力すると、結果がスピル(自動展開)して以下のように表示されます。
| 社員名 | 支店 | 商品 | 売上金額 |
|---|---|---|---|
| 田中 | 東京 | ノートPC | 150,000 |
| 鈴木 | 東京 | キーボード | 8,500 |
| 伊藤 | 東京 | モニター | 52,000 |
1つのセルに数式を入力するだけで、条件に合う全行が自動的に展開される点がFILTER関数の大きな魅力です。元データに行を追加しても、結果は自動で更新されます。
{EXCEL_DEMO}FILTER関数の実践テクニック
基本的な1条件でのフィルタリングを理解したら、次は複数条件や空の場合の処理を覚えましょう。実務では複数条件でのデータ抽出が頻繁に発生します。
複数条件のフィルタリングについて、さらに詳しい実例はExcelで複数条件のフィルターを設定する方法の記事も参考にしてください。
{DIAGRAM_FILTER_MULTI}複数条件でフィルタリング(AND条件)
「条件Aかつ条件B」のように、すべての条件を満たすデータだけを抽出するにはAND条件を使います。FILTER関数でAND条件を指定するには、条件同士を「*」(乗算)でつなぎます。
例えば、「支店が東京」かつ「売上金額が50,000以上」のデータを抽出する場合は以下のように記述します。
=FILTER(A2:D6, (B2:B6="東京")*(D2:D6>=50000), "該当なし")
この数式では、2つの条件式をそれぞれカッコで囲み、「*」で乗算しています。論理値のTRUEは1、FALSEは0として計算されるため、すべての条件がTRUE(=1)のときだけ乗算結果が1になり、その行が抽出されます。
3つ以上の条件も同様に「*」でつなげられます。
=FILTER(A2:D100, (B2:B100="東京")*(C2:C100="モニター")*(D2:D100>=10000), "該当なし")
いずれかの条件でフィルタリング(OR条件)
「条件Aまたは条件B」のように、いずれかの条件を満たすデータを抽出するにはOR条件を使います。FILTER関数でOR条件を指定するには、条件同士を「+」(加算)でつなぎます。
=FILTER(A2:D6, (B2:B6="東京")+(B2:B6="大阪"), "該当なし")
加算の場合、いずれかの条件がTRUE(=1)であれば合計が1以上になるため、その行が抽出されます。
AND条件とOR条件の組み合わせも可能です。例えば「(東京または大阪)かつ売上50,000以上」は以下のように書きます。
=FILTER(A2:D6, ((B2:B6="東京")+(B2:B6="大阪"))*(D2:D6>=50000), "該当なし")
OR条件部分をカッコでまとめてからAND条件の「*」でつなぐのがポイントです。
結果が空の場合の処理
FILTER関数で条件に一致するデータが1件もない場合、第3引数の指定によって動作が変わります。
| 第3引数の指定 | 結果が0件のときの動作 |
|---|---|
| 省略 | #CALC! エラーが表示される |
| “該当なし” | 「該当なし」と表示される |
| “”(空文字) | 空白セルが表示される |
| 0 | 0が表示される |
実務では#CALC!エラーを防ぐために第3引数を必ず指定することを推奨します。エラーが残っていると、そのセルを参照する他の数式もエラーになる可能性があるためです。エラー処理の詳細はIFERROR関数の使い方も併せて参考にしてください。
Excel歴10年の経験上、FILTER関数のAND条件とOR条件を混同して意図しない結果になるケースを多く見てきました。覚え方は「AND=掛け算(*)、OR=足し算(+)」です。筆者は新しいFILTER数式を作るとき、まず条件部分だけを別セルに入力して TRUE/FALSE の配列を確認してから本番の数式に組み込むようにしています。この「条件だけ先にテスト」する習慣で、デバッグ時間が大幅に減りました。
Q: FILTER関数の第3引数を省略した場合と空文字””を指定した場合、何が違いますか?
A: 省略すると該当データが0件のとき#CALC!エラーが出て、そのセルを参照する他の数式も連鎖的にエラーになります。空文字””を指定すると空白セルが1つ表示されるだけなので、後続の数式に影響しません。実務では””または”該当なし”を指定しておくのが安全です。
FILTER関数と他の関数の組み合わせ
FILTER関数はスピル対応の動的配列関数のため、他のスピル関数と組み合わせることで強力なデータ処理が可能になります。ここでは実務で特に使用頻度の高い3つの組み合わせパターンを紹介します。
{DIAGRAM_COMPARISON}SORT関数との組み合わせ
FILTER関数の結果を並べ替えたい場合、SORT関数で囲みます。例えば、東京支店のデータを売上金額の降順で表示するには以下のように書きます。
=SORT(FILTER(A2:D6, B2:B6="東京", "該当なし"), 4, -1)
SORT関数の第2引数「4」は並べ替えの基準列(4列目=売上金額)、第3引数「-1」は降順を意味します。昇順にしたい場合は「1」を指定します。
この組み合わせを使えば、「条件に合うデータを抽出して、金額順に並べる」といった処理が1つの数式で完結します。
UNIQUE関数との組み合わせ
FILTER関数の結果から重複を除いた一覧を取得するには、UNIQUE関数を組み合わせます。例えば、東京支店で取り扱っている商品の種類を重複なしで取得するには以下のように書きます。
=UNIQUE(FILTER(C2:C6, B2:B6="東京"))
この数式は、まずFILTER関数で東京支店の商品列(C列)だけを抽出し、その結果をUNIQUE関数で重複除去しています。ドロップダウンリストの選択肢を動的に生成する場合などに便利です。
XLOOKUP関数との使い分けについてはXLOOKUP関数の使い方完全ガイドを参照してください。1件だけ取得したい場合はXLOOKUP、条件に合う全件を抽出したい場合はFILTER関数が適しています。
INDEX MATCHとの組み合わせ
FILTER関数の結果から特定の値を取り出すには、INDEX関数と組み合わせます。例えば、東京支店の2番目のデータの売上金額を取得するには以下のように書きます。
=INDEX(FILTER(D2:D6, B2:B6="東京"), 2)
この数式は、FILTER関数で東京支店の売上金額を抽出した配列の2番目の値を返します。
さらに、MATCH関数を組み合わせて動的にN番目を求めることもできます。INDEX+MATCH関数の基本はINDEX MATCH関数の使い方で詳しく解説しています。
=INDEX(FILTER(A2:D6, B2:B6="東京"), MATCH(MAX(FILTER(D2:D6, B2:B6="東京")), FILTER(D2:D6, B2:B6="東京"), 0), 1)
この数式は「東京支店で最も売上が高い社員名」を返します。FILTER関数で東京支店のデータを抽出し、MAXで最大売上金額を求め、MATCHでその位置を特定し、INDEXで社員名(1列目)を取得しています。
FILTER+SORT+UNIQUEの組み合わせは、筆者が月次レポートで最も多用するパターンです。例えば「今月受注があった顧客の一覧を売上順で重複なしに出す」という処理が =SORT(UNIQUE(FILTER(…))) の1行で済みます。以前はピボットテーブルで作っていた集計が数式1本で完結するため、ファイルサイズも軽くなり、共有時の動作も快適になりました。
Q: FILTER関数の結果がスピルして他のセルのデータを上書きしてしまいます。どうすれば防げますか?
A: スピル先に既にデータがあると#SPILL!エラーになります。FILTER関数の出力先には十分な空きスペースを確保してください。対策としては、出力用の列を別シートに設けるか、出力範囲の下に十分な空白行を確保する方法が実務的です。データ件数が変動する場合は最大件数を想定してスペースを取りましょう。
FILTER関数が使えない場合の代替方法
FILTER関数はExcel 2021以降およびMicrosoft 365でのみ使用可能です。Excel 2019以前をお使いの場合や、古いバージョンとの互換性が必要な場合は、以下の代替方法を検討してください。
オートフィルターで代替する方法
Excelの全バージョンで使えるオートフィルター機能は、FILTER関数の最も身近な代替手段です。
設定手順:
- データ範囲内の任意のセルを選択
- 「データ」タブ → 「フィルター」をクリック
- 列ヘッダーのドロップダウン矢印をクリックし、条件を設定
- 複数条件は「テキストフィルター」や「数値フィルター」で設定可能
FILTER関数とオートフィルターの違い:
| 比較項目 | FILTER関数 | オートフィルター |
|---|---|---|
| 出力先 | 別のセル範囲に出力 | 元データの行を非表示 |
| 元データへの影響 | なし(元データはそのまま) | 行が非表示になる |
| 自動更新 | データ変更時に自動反映 | フィルター再設定が必要 |
| 対応バージョン | Excel 2021以降/365 | 全バージョン |
| 数式内での利用 | 他の関数と組み合わせ可能 | 不可 |
オートフィルターは手軽ですが、元データの表示が変わる点と、数式で結果を参照できない点がデメリットです。レポートの自動化にはFILTER関数が向いています。
VBAで同等の処理を実装する方法
FILTER関数が使えないバージョンでも、VBA(Visual Basic for Applications)を使えば同等のフィルタリング処理を実装できます。VBAならExcelのバージョンに関係なく動作するため、互換性の問題もありません。
具体的なVBAコードはVBAでFILTER関数を自動化するセクションで3パターン紹介しています。VLOOKUP関数と組み合わせたデータ検索の自動化も検討してみてください。
よくあるエラーと対処法
FILTER関数を使用する際に発生しやすいエラーと、その原因・解決策をまとめます。
#CALC!エラーの原因と解決策
#CALC!エラーは、FILTER関数で最も頻繁に発生するエラーです。条件に一致するデータが1件もない場合に表示されます。
原因: 第3引数(空の場合)を省略した状態で、条件に一致するデータがない
解決策: 第3引数にデフォルト値を指定します。
' エラーが出る書き方
=FILTER(A2:D6, B2:B6="福岡")
' エラーを防ぐ書き方
=FILTER(A2:D6, B2:B6="福岡", "該当データなし")
また、IFERROR関数で囲む方法もあります。IFERROR関数の使い方はこちらの記事で詳しく解説しています。
=IFERROR(FILTER(A2:D6, B2:B6="福岡"), "該当データなし")
#VALUE!エラーの原因と解決策
#VALUE!エラーは、FILTER関数の第2引数(条件)の配列サイズが第1引数(配列)の行数と一致しない場合に発生します。
原因: 配列と条件の範囲サイズが不一致
' エラーが出る例(配列はA2:D6の5行、条件はB2:B10の9行)
=FILTER(A2:D6, B2:B10="東京")
' 正しい書き方(配列も条件も5行で一致)
=FILTER(A2:D6, B2:B6="東京")
解決策: 第1引数の配列と第2引数の条件式の行数が一致しているか確認してください。特にデータの追加・削除で範囲がずれている場合に発生しやすいので、テーブル(Ctrl+T)を使って範囲を自動拡張させる方法がおすすめです。
スピル範囲のトラブル
FILTER関数の結果が展開(スピル)される範囲に既にデータが入っていると、#SPILL!エラーが表示されます。
原因: スピル先のセルが空でない(値・数式・結合セルなどが存在する)
解決策:
- スピル先のセルを空にする(値や数式を削除)
- 結合セルがある場合は結合を解除する
- FILTER関数を十分な空白スペースがある場所に移動する
- エラーセルをクリックすると、ブロックしているセルが青枠で表示されるので、そのセルを確認する
予防策: FILTER関数の出力先は、下方向と右方向に十分な空白がある場所を選びましょう。データが増えて結果の行数が変わる可能性があるため、余裕を持ったレイアウトが重要です。
VBAでFILTER関数を自動化する
ここでは、FILTER関数と同等のフィルタリング処理をVBAで実装するコードを3パターン紹介します。FILTER関数が使えないバージョンでも動作し、ボタン一つで定型処理を実行できるのがVBAの強みです。
AutoFilterを使ったVBAコード
ExcelのAutoFilter機能をVBAで制御する方法です。特定の条件でフィルタリングし、結果を別シートにコピーするマクロです。
Sub FilterWithAutoFilter()
Dim wsSource As Worksheet
Dim wsDest As Worksheet
Dim lastRow As Long
Set wsSource = ThisWorkbook.Sheets("データ")
' 出力先シートを作成(既存なら削除して再作成)
On Error Resume Next
Application.DisplayAlerts = False
ThisWorkbook.Sheets("抽出結果").Delete
Application.DisplayAlerts = True
On Error GoTo 0
Set wsDest = ThisWorkbook.Sheets.Add(After:=wsSource)
wsDest.Name = "抽出結果"
' データ範囲の最終行を取得
lastRow = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row
' 既存のフィルターを解除
If wsSource.AutoFilterMode Then wsSource.AutoFilterMode = False
' B列(支店)が「東京」の条件でフィルタリング
wsSource.Range("A1:D" & lastRow).AutoFilter Field:=2, Criteria1:="東京"
' フィルター結果を出力先シートにコピー
wsSource.Range("A1:D" & lastRow).SpecialCells(xlCellTypeVisible).Copy _
Destination:=wsDest.Range("A1")
' フィルターを解除
wsSource.AutoFilterMode = False
' 出力先シートをアクティブにして完了メッセージ
wsDest.Activate
MsgBox "抽出完了: " & wsDest.Cells(wsDest.Rows.Count, "A").End(xlUp).Row - 1 & " 件", vbInformation
End Sub
使い方: Alt+F11でVBEを開き、標準モジュールに貼り付けて実行します。「データ」シートのB列が「東京」の行を「抽出結果」シートにコピーします。
配列フィルタリングVBA
VBAの配列を使って高速にフィルタリングするコードです。AutoFilterよりも高速に処理でき、複雑な条件にも柔軟に対応できます。
Sub FilterWithArray()
Dim wsSource As Worksheet
Dim dataArr As Variant
Dim resultArr() As Variant
Dim lastRow As Long
Dim resultCount As Long
Dim i As Long, j As Long
Set wsSource = ThisWorkbook.Sheets("データ")
lastRow = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row
' データを配列に読み込み(高速化)
dataArr = wsSource.Range("A2:D" & lastRow).Value
' 条件に一致する行数をカウント
resultCount = 0
For i = 1 To UBound(dataArr, 1)
' 条件: B列(2列目)が「東京」かつ D列(4列目)が50000以上
If dataArr(i, 2) = "東京" And dataArr(i, 4) >= 50000 Then
resultCount = resultCount + 1
End If
Next i
If resultCount = 0 Then
MsgBox "条件に一致するデータがありません", vbExclamation
Exit Sub
End If
' 結果配列を作成
ReDim resultArr(1 To resultCount, 1 To 4)
resultCount = 0
For i = 1 To UBound(dataArr, 1)
If dataArr(i, 2) = "東京" And dataArr(i, 4) >= 50000 Then
resultCount = resultCount + 1
For j = 1 To 4
resultArr(resultCount, j) = dataArr(i, j)
Next j
End If
Next i
' 結果をF2セルから出力
wsSource.Range("F1:I1").Value = wsSource.Range("A1:D1").Value
wsSource.Range("F2").Resize(resultCount, 4).Value = resultArr
MsgBox "配列フィルタリング完了: " & resultCount & " 件", vbInformation
End Sub
メリット: データを一括で配列に読み込んでから処理するため、数万行のデータでも高速に動作します。条件部分をカスタマイズすることで、FILTER関数では実現しにくい複雑な条件にも対応できます。
条件付きコピーVBA
AdvancedFilter(フィルタオプション)を使った方法です。条件範囲を別に用意して、複雑なAND/OR条件でのフィルタリングを実現します。
Sub FilterWithAdvancedFilter()
Dim wsSource As Worksheet
Dim wsCriteria As Worksheet
Dim lastRow As Long
Set wsSource = ThisWorkbook.Sheets("データ")
lastRow = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row
' 条件シートを作成
On Error Resume Next
Application.DisplayAlerts = False
ThisWorkbook.Sheets("条件").Delete
Application.DisplayAlerts = True
On Error GoTo 0
Set wsCriteria = ThisWorkbook.Sheets.Add(After:=wsSource)
wsCriteria.Name = "条件"
' 条件を設定(同じ行 = AND条件、異なる行 = OR条件)
' 例: 「東京で売上50000以上」OR「大阪で売上100000以上」
wsCriteria.Range("A1").Value = "支店"
wsCriteria.Range("B1").Value = "売上金額"
wsCriteria.Range("A2").Value = "東京"
wsCriteria.Range("B2").Value = ">=50000"
wsCriteria.Range("A3").Value = "大阪"
wsCriteria.Range("B3").Value = ">=100000"
' 出力先を準備(G列以降)
wsSource.Range("G1:J1").Value = wsSource.Range("A1:D1").Value
' AdvancedFilterを実行
wsSource.Range("A1:D" & lastRow).AdvancedFilter _
Action:=xlFilterCopy, _
CriteriaRange:=wsCriteria.Range("A1:B3"), _
CopyToRange:=wsSource.Range("G1:J1"), _
Unique:=False
' 結果件数を取得
Dim resultLastRow As Long
resultLastRow = wsSource.Cells(wsSource.Rows.Count, "G").End(xlUp).Row
' 条件シートを削除
Application.DisplayAlerts = False
wsCriteria.Delete
Application.DisplayAlerts = True
MsgBox "条件付きコピー完了: " & resultLastRow - 1 & " 件", vbInformation
End Sub
AdvancedFilterの特徴: 条件範囲で同じ行に書いた条件はAND条件、異なる行に書いた条件はOR条件として処理されます。上記の例では「東京で50,000以上」または「大阪で100,000以上」のデータが抽出されます。
- AutoFilter方式: シンプルな条件でフィルタリングしたい場合に最適。コードが短く理解しやすい
- 配列フィルタリング: 大量データを高速処理したい場合や、複雑な条件ロジックが必要な場合に最適
- AdvancedFilter: AND/OR条件の組み合わせが多い場合や、条件を別シートで管理したい場合に最適
よくある質問(FAQ)
Q. FILTER関数はどのバージョンのExcelで使える?
FILTER関数はMicrosoft 365(旧Office 365)サブスクリプション版、およびExcel 2021以降の買い切り版で使用できます。Excel 2019以前のバージョンでは利用できません。Web版のExcel(Excel Online)でも使用可能です。自分のExcelがFILTER関数に対応しているか確認するには、任意のセルに「=FILTER(」と入力して関数候補に表示されるかどうかを確認してください。
Q. FILTER関数で複数条件を指定するには?
AND条件(すべて満たす)は条件同士を「*」(乗算)でつなぎます。例: =FILTER(A:D, (B:B=”東京”)*(C:C>=100), “該当なし”)。OR条件(いずれか満たす)は「+」(加算)でつなぎます。例: =FILTER(A:D, (B:B=”東京”)+(B:B=”大阪”), “該当なし”)。各条件は必ずカッコで囲んでください。AND条件とOR条件を組み合わせることも可能です。
Q. FILTER関数で結果が0件の場合どうなる?
第3引数(空の場合)を省略していると#CALC!エラーが表示されます。エラーを防ぐには、第3引数に「”該当なし”」や「””」(空文字列)などのデフォルト値を指定してください。例: =FILTER(A2:D6, B2:B6=”福岡”, “該当データなし”)。IFERROR関数で囲む方法でも同様にエラーを回避できます。
Q. FILTER関数とオートフィルターの違いは?
FILTER関数は数式として別のセルに結果を出力し、元データには一切影響を与えません。元データが変更されると結果も自動更新されます。一方、オートフィルターは元データの行を非表示にして絞り込む機能で、データの見た目が変わります。FILTER関数は他の関数と組み合わせて使える点、動的に結果が更新される点がメリットです。ただし、Excel 2021以降でのみ使用可能です。
Q. FILTER関数をVBAで自動化するメリットは?
VBAで自動化する主なメリットは3つあります。第一に、FILTER関数が使えないExcel 2019以前でも同等の処理を実行できます。第二に、フィルタリングからレポート出力までの一連の処理をボタン一つで実行できるため、作業の標準化・効率化が図れます。第三に、条件の動的な変更やループ処理と組み合わせることで、FILTER関数では難しい複雑なデータ加工も可能になります。
まとめ
この記事では、ExcelのFILTER関数の使い方を基本から応用、VBA実装まで解説しました。
- 基本構文: =FILTER(配列, 含む, [空の場合]) の3引数で使える
- AND条件: 条件同士を「*」でつなぐ → 全条件を満たす行を抽出
- OR条件: 条件同士を「+」でつなぐ → いずれかの条件を満たす行を抽出
- 他関数との組み合わせ: SORT・UNIQUE・INDEX MATCHと連携して高度な処理が可能
- エラー対策: 第3引数を必ず指定して#CALC!エラーを防ぐ
- VBA対応: AutoFilter・配列フィルタ・AdvancedFilterで全バージョン対応
FILTER関数はデータ抽出の効率を劇的に改善する関数です。複数条件やエラー処理のパターンを覚えておけば、日常のExcel作業がぐっと楽になります。FILTER関数が使えない環境でもVBAで代替できるので、ぜひ業務に取り入れてみてください。
Excelスキルを活かしてSNS運用も自動化しませんか?
Excelの関数をマスターしたあなたなら、Googleスプレッドシート×GAS(Google Apps Script)を使ったSNS自動化ツールもすぐに使いこなせます。X(Twitter)やThreadsの予約投稿を、月額0円で自動化する方法をまとめています。
→ SNS予約投稿ツール完全ガイド|無料&買い切りツールを徹底比較
VBA開発・GAS連携・Webアプリ化まで、
業務に合わせた最適な自動化をご提案します。
LINEでExcelを気軽に学べる
