FILTER関数の使い方|複数条件の書き方と#CALC!・#SPILL!の直し方

FILTER関数は、条件に合う行をまとめて別の場所へ取り出す関数です。VLOOKUPが1件しか返せないのに対し、該当する行を全件返します。使えるのはMicrosoft 365とExcel 2021以降で、2019以前では #NAME? になります。

この記事でわかること

  • FILTER関数の3つの引数と、条件の書き方
  • 複数条件の書き方(ANDは掛け算・ORは足し算)
  • 「〜を含む」の部分一致と、必要な列だけを取り出す方法
  • #CALC!・#SPILL!・#VALUE!が出るときの原因と直し方
  • オートフィルターやVLOOKUPとの使い分け


目次

FILTER関数の構文と引数

構文

=FILTER(配列, 含む, [空の場合])
引数指定するもの注意点
配列取り出したい元のデータ範囲見出し行は含めない
含む条件式(TRUE/FALSEの並び)配列と行数を揃える。ずれると #VALUE!
空の場合該当0件のときに返す値省略すると #CALC! になる

FILTERは動的配列関数です。数式を入れるのは左上の1セルだけで、結果は必要な行数・列数へ自動的に広がります。この広がりをスピルと呼びます。

⚠️ 使えるバージョン

FILTER関数はMicrosoft 365とExcel 2021以降で利用できます。Excel 2016・2019では使えません。2019以前で開くと、関数名の前に接頭辞が付いた文字列として表示され、結果は #NAME? になります。古い環境に配布するブックでは使わない、という判断が要ります。

FILTER関数の使い方|複数条件の書き方と#CALC!・#SPILL!の直し方の解説図1

基本の使い方

A列に支店、B列に商品、C列に数量、D列に金額が並ぶ表を例にします。大阪支店の行だけを取り出す式です。

=FILTER($A$2:$D$100, $A$2:$A$100="大阪", "該当なし")

数式は結果を出したい場所の左上のセルだけに入力します。下の行にも同じ式をコピーする必要はありません。むしろコピーすると、スピルの邪魔になります。

第3引数の "該当なし" は省略できますが、省略すると該当0件のときに #CALC! が表示されます。集計表に組み込むなら、必ず指定してください。

条件をセル参照にする

条件を直接書かず、入力セルを参照させると使い回せます。F1に支店名を入力する形です。

=FILTER($A$2:$D$100, $A$2:$A$100=$F$1, "該当なし")

F1を書き換えるだけで、抽出結果がその場で入れ替わります。元データを更新しても自動で追従するため、オートフィルターのかけ直しが不要になります。


実務でよく使う4パターン

① 複数条件(AND・OR)

FILTERにはAND関数もOR関数も使いません。条件式を掛け算と足し算でつなぎます。

つなぎ方意味書き方
*かつ(AND)($A$2:$A$100="大阪")*($D$2:$D$100>=10000)
+または(OR)($A$2:$A$100="大阪")+($A$2:$A$100="京都")

実際の式です。各条件をかっこで囲むのを忘れないでください。

=FILTER($A$2:$D$100, ($A$2:$A$100="大阪")*($D$2:$D$100>=10000), "該当なし")

AND関数を使うと、条件全体がTRUEかFALSEの1個の値に潰れてしまい、意図した絞り込みになりません。ここが動的配列関数に特有の書き方です。

② 「〜を含む」で絞る

部分一致にはSEARCH関数を組み合わせます。

=FILTER($A$2:$D$100, ISNUMBER(SEARCH("ペン", $B$2:$B$100)), "該当なし")

SEARCHは見つかった位置を返し、見つからなければエラー。それをISNUMBERでTRUE/FALSEに変換する仕組みです。SEARCHは大文字と小文字を区別しません。区別したい場合はFIND関数に置き換えます。

③ 必要な列だけを取り出す

FILTERを二重にすると、行と列の両方を絞れます。外側の「含む」に、列数と同じ要素数の0と1の配列を渡す形です。

=FILTER(FILTER($A$2:$D$100, $A$2:$A$100="大阪"), {1,1,0,1}, "該当なし")

内側で行を絞り、外側で2列目までと4列目だけを残しています。{1,1,0,1} は横方向の配列定数で、カンマ区切りが列の並びに対応します。

④ 並べ替え・重複除去と組み合わせる

同じ動的配列のSORT関数・UNIQUE関数と入れ子にできます。抽出したうえで金額の降順に並べる式です。

=SORT(FILTER($A$2:$D$100, $A$2:$A$100="大阪", ""), 4, -1)

SORTの第2引数4は「4列目で並べる」、第3引数-1は降順を表します。重複のない一覧が欲しいなら =UNIQUE(FILTER(...)) の形です。

FILTER関数の使い方|複数条件の書き方と#CALC!・#SPILL!の直し方の解説図2

うまくいかないときの原因と直し方

エラー表示で原因はほぼ特定できます。

表示原因直し方
#CALC!条件に合う行が1件もない第3引数に "該当なし" や "" を指定する
#SPILL!結果が広がる先に別のデータがある下・右のセルを空ける。結合セルも解除する
#SPILL!数式をテーブルの中に入れているテーブルの外のセルへ移す
#VALUE!配列と「含む」の行数が違うどちらも同じ行番号で始め、同じ行番号で終える
#NAME?Excel 2016・2019で開いている使えない。オートフィルター等で代替する
結果が1行だけ「含む」を1つの値にしてしまっているAND関数をやめ、* でつなぐ
該当0件なのに空欄が1つ残る第3引数の "" が返っている仕様どおり。件数はCOUNTIFSで数える

#SPILL!が消えないとき

#SPILL! は「結果を置く場所が足りない」というエラーです。見た目には空欄でも、スペースが1文字だけ入っているセルが邪魔をしていることがあります。

エラーの出ているセルを選ぶと、広がろうとしている範囲が破線で表示されます。その破線の内側をまとめて選択し、Deleteキーで消してから再計算してください。

結合セルも原因になります。スピル先に結合セルがあると、FILTERは結果を展開できません。

結果のセルを直接編集できない

スピルした結果のうち、左上以外のセルは編集も削除もできません。「配列の一部を変更することはできません」という警告が出ます。

修正するときは左上のセルの数式を直す、消すときは左上のセルをDeleteする。これが原則です。

FILTER関数の使い方|複数条件の書き方と#CALC!・#SPILL!の直し方の解説図3

似た機能・関数との使い分け

手段対応バージョン選ぶ場面
FILTER365/2021〜該当行を全件取り出し、自動更新させたい
オートフィルター2016〜その場で一時的に絞って見るだけ
フィルターの詳細設定2016〜複雑な条件で別の場所へ抽出する(手動実行)
XLOOKUP2021〜一致する1件だけを引く
VLOOKUP2016〜同上。2016・2019の相手にも渡す
UNIQUE・SORT365/2021〜重複除去・並べ替え。FILTERと入れ子にする
ピボットテーブル2016〜明細ではなく集計結果を見たい

判断の軸は2つです。1件か全件か、そして自動更新が要るか。

1件でよければXLOOKUPかVLOOKUP。全件なら、その場で見るだけならオートフィルター、シートに残して自動更新させたいならFILTER、という並びになります。


よくある質問

Q1:Excel 2019でFILTER関数を使う方法はありますか?

ありません。FILTERは2021以降の関数で、2019では #NAME? になります。同じ結果が欲しい場合は、「データ」タブのフィルターの詳細設定で別の場所へ抽出するか、INDEX関数とSMALL関数を組み合わせた配列数式で代替します。後者は式が長くなるため、更新頻度が低いなら詳細設定のほうが現実的です。

Q2:抽出された件数を数えるには?

=COUNTIFS() で条件を直接数えるのが確実です。=ROWS(FILTER(...)) でも数えられますが、該当0件のときは「空の場合」の値が1行返るため、結果が1になります。0件を0と表示したいなら、COUNTIFSを使ってください。

Q3:抽出結果を別のシートに出せますか?

出せます。別シートの左上セルに数式を入れ、元データをシート名つきで参照します。抽出先のシートは、スピルの邪魔になるデータを置かず空けておくのが前提です。

Q4:テーブル(Ctrl+T)の中にFILTERを入れられますか?

入れられません。動的配列の結果はテーブルの内側では展開できず、#SPILL! になります。テーブルを参照するのは問題ないので、数式はテーブルの外のセルに置いてください。

Q5:抽出結果を並べ替えたり、値として固定したりできますか?

並べ替えはSORT関数で入れ子にします。結果を固定したい場合は、スピル範囲をコピーして「値」として貼り付けてください。貼り付け後は自動更新されなくなるため、記録用のスナップショットという扱いになります。


まとめ

FILTERの要点
  • 引数は配列・含む・空の場合の3つ。第3引数を省くと0件のとき#CALC!
  • 複数条件はANDが*・ORが+。AND関数・OR関数は使わない
  • 数式は左上の1セルだけ。結果はスピルして自動で広がる
  • #SPILL!は場所不足。空白に見えるセル・結合セル・テーブル内が原因
  • 使えるのはMicrosoft 365とExcel 2021以降。2019以前は#NAME?

※関数の対応バージョンはExcelの一般提供時点の情報にもとづいています。お使いの環境や更新プログラムの適用状況により、利用できる関数や表示が異なる場合があります。

あわせて読みたい

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

はじめまして、白石です。製造業の生産管理で15年、毎日の実績集計と帳票づくりをExcelでやってきました。マクロを組もうとして早々に挫折し、そこからは「関数と表の機能だけでどこまでやれるか」でしのいできた口です。部門では「この集計どうやるの」と聞かれる係になり、聞かれた内容を手元にメモし続けました。そのメモがいつのまにか、関数名ではなくやりたいことから引く形になっていて、それがこのサイトのもとになっています。Excelは同じことをやるのに何通りもやり方があって、しかもバージョンによって使える関数が違います。ここでは実際に動かして確かめた式だけを載せ、つまずきやすいところと使えないバージョンを先に書くようにしています。

目次