FILTER関数の使い方|複数条件・エラー対処・旧Excel代替まで

スポンサーリンク

ExcelのFILTER関数を使えば、表の中から条件に合う行だけを別の場所へ自動で取り出せます。シートの「フィルター機能」と違い、元のデータには一切触れません。

とはいえ実務で使い始めると、「複数条件の指定がうまくいかない」「#CALC!や#SPILL!が出る」「自分のExcelでは使えない」といった壁にぶつかりがちです。

この記事では、FILTER関数の基本構文から、AND/OR/NOTの複数条件、エラー別の診断、Excel 2019以前の代替数式までを一気通貫で解説します。すべての数式は下の共通サンプルで結果を確認しているので、手元で再現しながら読み進めてください。

この記事はこんな人におすすめです。

  • 「FILTER関数 複数条件」の正しい書き方を知りたい
  • #CALC!や#SPILL!エラーの原因を切り分けたい
  • 自分のExcelで使えないとき、何で代替すればいいか知りたい

FILTER関数とは?できることと対応バージョン

ExcelのFILTER関数は、指定した条件に一致する行だけを抽出する関数です。読み方は「フィルター関数」。検索や並べ替えと違い、元の表をそのまま残したまま、別のセルに結果を吐き出せるのが最大の特徴です。

この記事全体で使う共通サンプルデータを先に示します。A1からD6に、次の小さな売上表が入っているとします。

A(No)B(部署)C(氏名)D(売上)
1No部署氏名売上
21営業田中120
32総務鈴木0
43営業佐藤85
54経理伊藤200
65営業山田150

1行目が見出しなので、抽出対象のデータ範囲は「A2:D6」です。以降の数式はすべて、この表を前提に結果を示します。

基本構文と3つの引数

FILTER関数の構文は、3つの引数で構成されます。

=FILTER(配列, 含む, [空の場合])

各引数の役割は次のとおりです。

  • 第1引数 配列(必須): 抽出の対象となるデータ範囲。今回は A2:D6
  • 第2引数 含む(必須): 抽出条件。データと同じ行数の論理値(TRUE/FALSE)の並び
  • 第3引数 空の場合(省略可): 条件に合う行が0件のときに返す値

第2引数は「範囲=値」の形で書きます。たとえば B2:B6="営業" は、各行が営業かどうかを判定し、TRUE/FALSEの並びを作ります。FILTERはこのTRUEの行だけを残す仕組みです。

抽出結果は1つのセルに入力するだけで、自動的に複数行・複数列へあふれて表示されます。この挙動を「スピル」(数式の結果が隣接セルへ自動展開される機能)と呼びます。あふれ先のセルは空けておく必要があります。

=FILTER(A2:D6, B2:B6="営業", "該当なし")

この数式の結果は、営業の3行(田中120/佐藤85/山田150)が上から順に展開されます。FILTER関数はMicrosoft 365、Excel for the web、Excel 2021、Excel 2024で使えます。Excel 2019以前は動的配列関数に未対応のため、後半で紹介する代替数式が必要です。

オートフィルターとの使い分け早見表

「シートのオートフィルターで十分では?」と思うかもしれません。どちらを使うべきかは、やりたいことで決まります。判断軸ごとに整理しました。

やりたいことオートフィルターFILTER関数
元データを変えずに抽出したい△(行を隠すだけ)
結果を別シート・別の場所に出したい×(同じ表上のみ)
毎回手動で操作したくない×(都度クリック)○(自動更新)
条件をセルやドロップダウンで切り替えたい×
印刷レイアウトを崩したくない

ざっくり言えば、「一度きりの目視確認」ならオートフィルター、「結果を別の場所に置いて自動更新したい」ならFILTER関数です。レポートやダッシュボードを組むならFILTER関数が圧倒的に向いています。

単一条件・複数条件と別シートの指定方法

ここがFILTER関数で最もつまずきやすいポイントです。「FILTER関数 複数条件」で検索する人の多くは、AND条件やOR条件の演算子の書き方で詰まっています。順番に見ていきましょう。

単一条件で抽出する

まずは1つの条件で抽出します。サンプル表から「営業」の行だけを取り出してみます。

=FILTER(A2:D6, B2:B6="営業", "該当なし")

第2引数の B2:B6="営業" が、各行について営業かどうかを判定します。結果は田中(120)、佐藤(85)、山田(150)の3行です。第3引数の「該当なし」は、もし0件だったときに表示する文字列です。

数値の比較も同じように書けます。「売上が100以上」なら次のとおりです。

=FILTER(A2:D6, D2:D6>=100, "該当なし")

この結果は田中(120)、伊藤(200)、山田(150)の3行になります。

AND条件(*)で複数条件を同時指定

複数の条件を「すべて満たす行」だけ抽出したいときは、条件同士を *(アスタリスク)でつなぎます。これがAND条件(論理積。すべての条件が同時に成り立つこと)の書き方です。

「営業」かつ「売上が100以上」の行を抽出してみます。

=FILTER(A2:D6, (B2:B6="営業")*(D2:D6>=100), "該当なし")

各条件は必ずカッコで囲んでください。結果は田中(120)と山田(150)の2行です。佐藤(85)は営業ですが売上が100未満なので除外されます。

なぜ掛け算でANDになるのか、仕組みは単純です。TRUEは1、FALSEは0として扱われ、1×1=1(TRUE)、1×0=0(FALSE)となります。両方TRUEのときだけ1が残るので、AND条件になるわけです。

OR条件(+)でいずれか一致を指定

「どちらか一方でも満たせばよい」場合は、条件同士を +(プラス)でつなぎます。これがOR条件(論理和。いずれかの条件が成り立つこと)です。

「総務」または「経理」の行を抽出します。

=FILTER(A2:D6, (B2:B6="総務")+(B2:B6="経理"), "該当なし")

結果は鈴木(0)と伊藤(200)の2行です。足し算でORになる理由も同じで、0+1=11+0=10+0=0 となり、どちらかがTRUEなら1が残ります。

なお、同じ列で3つ以上の値を許可したいなら、条件を + で並べ続ければ対応できます。たとえば (B2:B6="営業")+(B2:B6="総務")+(B2:B6="経理") のように書けます。

NOT条件()で除外フィルターをかける

「特定の値を除いたすべて」を抽出したいときは、不等号 <>(〜ではない)を使います。除外フィルターです。

「営業以外」の行を抽出してみます。

=FILTER(A2:D6, B2:B6<>"営業", "該当なし")

結果は鈴木(0)と伊藤(200)の2行です。AND・ORと組み合わせることもできます。たとえば「営業以外で、かつ売上が100以上」なら次のように書きます。

=FILTER(A2:D6, (B2:B6<>"営業")*(D2:D6>=100), "該当なし")

この結果は伊藤(200)の1行だけです。鈴木(0)は営業以外ですが、売上が100未満なので除外されます。「○○を含む文字列を除外したい」といった部分一致の除外は、NOT(ISNUMBER(SEARCH("除外語", 範囲))) を条件に使うと実現できます。

別シート・別ファイルから抽出する

FILTER関数は、別シートのデータを参照して抽出することもできます。範囲の前に「シート名!」を付けるだけです。元データが「Sheet1」のA2:D6にあるとします。

=FILTER(Sheet1!A2:D6, Sheet1!B2:B6="営業", "該当なし")

ポイントは、第1引数と第2引数の両方に「Sheet1!」を付けることです。条件範囲だけ付け忘れると、サイズ不一致のエラーになります。抽出したい部署名をG1セルに入れ、Sheet1!B2:B6=G1 とすれば、G1を書き換えるだけで結果が切り替わる動的レポートが作れます。

別ブック(別ファイル)も参照できますが、注意が必要です。参照先のブックを開いていないと #REF! エラーになります。動的配列の結果は、ブックを閉じた状態では正しく取得できません。別ブック参照は管理が煩雑になりやすいので、元データは同じブックの別シートに集約するのがおすすめです。シート名をセルから動的に組み立てたい場合はINDIRECT関数も使えます。ただし別ブック参照に弱く、再計算が重い点には注意してください。

エラーの原因と対処法

FILTER関数で出るエラーは、原因を切り分ければ怖くありません。代表的な3種類を、症状から逆引きできるように整理します。エラー値全般の意味はExcelエラー値一覧も参考にしてください。

#CALC!エラー|第3引数で空時の表示を指定する

#CALC! は、条件に合う行が1つもないのに、第3引数(空の場合)を省略したときに発生します。FILTERは「0件の結果」をそのまま返せないため、エラーになる仕組みです。

たとえばサンプル表で存在しない「人事」を条件にすると、0件なので #CALC! が出ます。

=FILTER(A2:D6, B2:B6="人事")

対処は簡単で、第3引数に表示したい値を指定するだけです。

=FILTER(A2:D6, B2:B6="人事", "該当なし")

これで0件のとき「該当なし」と表示されます。何も表示したくなければ ""(空文字)を指定します。FILTERをさらに他の関数で包んでいて、第3引数だけでは制御しきれない場合は、IFERRORで全体を囲む方法も有効です。

=IFERROR(FILTER(A2:D6, B2:B6="人事"), "該当なし")

#SPILL!エラー|3パターン別チェックリスト

#SPILL! は、抽出結果を展開(スピル)しようとしたスペースが確保できないときに出ます。競合記事は「スピル先にデータがある」で終わりがちですが、実際の原因は複数あります。よくある3パターンを症状別にまとめました。

症状・状況原因解決手順
スピル予定範囲に文字や数式があるあふれ先のセルが空でないエラーセルを選ぶと破線枠で展開予定範囲が出る。その枠内の既存データを削除・移動する
結合セルが範囲に重なっている結合セルにはスピルできない該当範囲の「セルの結合」を解除する
テーブル(Ctrl+T)の中で使っているテーブル内は動的配列を展開できない数式をテーブルの外に移す。または「テーブルデザイン > 範囲に変換」でテーブルを解除する

診断のコツは、エラーセルを選択することです。スピルしようとした範囲が破線枠で表示されるので、その枠の中に何が邪魔しているかを目で確認できます。エラーチェックの警告メニューから「障害のあるセルを選択」を使うと、干渉しているセルを直接特定できます。

このほか、A:A のように列全体を参照すると、1,048,576行分を返そうとして #SPILL! になります。条件範囲は A2:A100 のように必要な範囲に限定しましょう。

条件範囲のサイズ不一致エラー

第1引数のデータ範囲と、第2引数の条件範囲で、行数がそろっていないとエラーになります。たとえばデータが A2:D6(5行)なのに、条件を B2:B10(9行)と書いてしまうケースです。

(誤)=FILTER(A2:D6, B2:B10="営業", "該当なし")

解決策は、データ範囲と条件範囲の行数を完全に一致させることです。

(正)=FILTER(A2:D6, B2:B6="営業", "該当なし")

複数条件を *+ でつなぐときも、すべての条件範囲の行数をそろえる必要があります。別シート参照のときは、条件範囲側のシート名付け忘れもこのエラーの原因になります。

旧Excel(2019以前)ユーザー向け代替数式

「FILTER関数が使えない」という人の多くは、Excel 2019以前を使っています。動的配列関数が実装されていないため、FILTERそのものは入力できません。ただし、配列数式を使えば同じ結果を再現できます。

INDEX+IF配列数式(Ctrl+Shift+Enter)で再現する

旧Excelで条件抽出を再現する定番が、INDEX・SMALL・IFを組み合わせた配列数式(CSE数式)です。結果を表示したい先頭セルに、次の数式を入力します。

=IFERROR(INDEX($A$2:$A$6, SMALL(IF($B$2:$B$6="営業", ROW($B$2:$B$6)-ROW($B$2)+1), ROW(A1))), "")

入力のあとに Enterではなく Ctrl + Shift + Enter で確定するのが鉄則です。これで数式が配列数式として扱われ、両端に { } が付きます。あとは数式を下方向へコピーすれば、該当行が順番に表示されます。なお、Microsoft 365やExcel 2021以降なら、この数式はCtrl + Shift + Enterなしの通常確定でも動作します。

仕組みは次のとおりです。IF($B$2:$B$6="営業", ...) で営業の行番号だけを抜き出し、SMALL(..., ROW(A1)) で小さい順に1件ずつ取り出します。ROW(A1) はコピーするたびに2、3と増えるので、2件目・3件目と順に表示されます。

氏名や売上など別の列も並べたいときは、INDEXの対象範囲を $C$2:$C$6(氏名)や $D$2:$D$6(売上)に変えた数式を、横の列にそれぞれ用意します。

COUNTIF+VLOOKUP組み合わせパターン

条件に一致する件数を数えるだけなら、配列数式を使わずCOUNTIFで足ります。

=COUNTIF($B$2:$B$6, "営業")

この結果は「3」です。「営業の人数だけ知りたい」のように、抽出ではなく集計が目的なら、こちらの方がはるかに軽くて簡単です。抽出した結果から特定の値を引きたい場合は、上のINDEX配列数式で抽出列を作業列として置きます。そこにXLOOKUP関数やVLOOKUPを当てると、旧Excelでも実務に耐える表が組めます。

可能であれば、Microsoft 365へのアップデートが根本的な解決策です。FILTER関数を含む動的配列関数は、日々のデータ処理を大幅に楽にしてくれます。

実務フロー別レシピと他関数との組み合わせ

最後に、FILTER関数を他の動的配列関数と組み合わせる実務レシピを紹介します。「やりたいこと」起点で見てください。

抽出結果をSORTで並べ替える

抽出したあと、特定の列で並べ替えたいケースは多いはずです。FILTERをSORT関数で包めば、抽出と並べ替えを一気に行えます。

「営業の行を抽出し、売上(4列目)の降順で並べる」なら次のとおりです。

=SORT(FILTER(A2:D6, B2:B6="営業", ""), 4, -1)

結果は山田(150)、田中(120)、佐藤(85)の順に並びます。SORTの第2引数「4」が並べ替えの基準列、第3引数「-1」が降順の指定です。昇順にしたいなら「1」にします。

UNIQUEと組み合わせて重複なしリストを作る

抽出結果から重複を除いたリストが欲しいときは、UNIQUE関数で包みます。たとえば「営業の氏名一覧(重複なし)」なら、対象列を氏名に絞って次のように書きます。

=UNIQUE(FILTER(C2:C6, B2:B6="営業", ""))

部署マスタから「実際に登場する部署名の一覧」を作るときなどに重宝します。FILTERとUNIQUE、SORTを組み合わせたスピル活用は、UNIQUE・FILTER・SORT・SEQUENCEのスピル活用まとめでさらに深掘りしています。

HSTACKで離れた列を結合してから抽出する

「氏名(C列)と売上(D列)だけ、しかも順番を入れ替えて抽出したい」のように、離れた列や順序を組み替えたいときはHSTACKが便利です。HSTACKは複数の範囲を横方向に連結する関数で、Microsoft 365とExcel 2024で使えます。

=FILTER(HSTACK(C2:C6, D2:D6), B2:B6="営業", "")

この結果は、営業の行について氏名と売上だけを横並びにした表になります。表示したい列だけをHSTACKで組み立ててからFILTERにかけるのがコツです。

部署別の在席リストを自動生成する

セル参照と組み合わせると、入力欄を1つ変えるだけで切り替わるリストが作れます。G1セルに見たい部署名を入れておき、次の数式を別の場所に置きます。

=FILTER(A2:D6, B2:B6=G1, "該当なし")

G1を「営業」にすれば営業の一覧、「経理」にすれば経理の一覧へ瞬時に切り替わります。G1をドロップダウン(データの入力規則)にしておけば、クリックだけで部署別リストを呼び出せる簡易ツールの完成です。

Googleスプレッドシートでも使えるか

FILTER関数はGoogleスプレッドシートにも存在し、考え方は同じです。ただし複数条件の書き方に違いがあります。Excelでは第2引数の中で *+ を使いましたが、スプレッドシートでは引数をカンマで並べるだけでAND条件になります。

(スプレッドシート)=FILTER(A2:D6, B2:B6="営業", D2:D6>=100)

また0件のときのエラーも異なり、スプレッドシートは #N/A を返します(Excelは #CALC!)。回避策は IFERROR(FILTER(...), "") で囲む方法が定番です。スプレッドシート側の詳しい使い方はスプレッドシートのFILTER関数の使い方で解説しています。

まとめ

ExcelのFILTER関数は、条件に合う行を元データを崩さずに別の場所へ抽出できる、動的配列関数の代表格です。最後に要点を整理します。

  • 複数条件: AND条件は *、OR条件は +、除外は <>。各条件はカッコで囲む
  • #CALC!: 0件のときは第3引数(空の場合)を指定すれば回避できる
  • #SPILL!: スピル先のデータ・結合セル・テーブル内使用の3パターンを切り分ける
  • 旧Excel: INDEX+SMALL+IFの配列数式(Ctrl+Shift+Enter)で代替できる
  • 使い分け: 別の場所に出して自動更新したいならFILTER、目視だけならオートフィルター

SORTやUNIQUE、HSTACKと組み合わせれば、抽出から並べ替え・重複除去まで1つの数式で完結します。まずは手元の表で =FILTER(範囲, 条件, "該当なし") を打ち込み、結果がスピルする感覚をつかんでみてください。

タイトルとURLをコピーしました