要点 —
FILTERはVLOOKUPとは「問い」が違います。検索は1件を返し、FILTERは条件に一致するすべての行を返して、範囲にスピルします。構文は=FILTER(配列, 含める条件, [空のとき])。つまずくのは3点です。一致が無いと#CALC!になる(第3引数で回避:=FILTER(data, cond, "該当なし"))。条件を 組み合わせるときは AND は配列の掛け算、OR は足し算((A=x)*(B=y))で、AND()/OR()は使わない。スピル先がふさがっていると#SPILL!。対応は Excel 365 / 2021 以降です。
=FILTER(Sales, Region = "West")
=FILTER(Sales, (Region = "West") * (Amount > 1000), "該当なし")
「地域が West の行を全部出す」には、長らく作業列+オートフィルター+コピペ、あるいは
壊れやすい配列数式(CSE)が必要でした。FILTER はそれを1つの式にし、元データが
変われば即座に再計算します。ただし1つの値ではなく配列を返すため、検索とは
違うふるまいをし、エラーメッセージも新顔です。
この記事でわかること
FILTERは「多くを返すクエリ」、検索は「1件を返す」——この違いがすべての起点- AND / OR のコツ:配列を掛ける・足す(
AND()・OR()は使わない) - 空の結果で
#CALC!が出る理由と、それを消す唯一の引数 #SPILL!の本当の原因と解消法- 生きた一覧を作る「奥義の式」
=SORT(UNIQUE(FILTER(...)))
考え方の軸:FILTER は「検索」ではなく「クエリ」
SQL を使ったことがあれば、FILTER は WHERE 句です——この条件が真の行を全部ください。
VLOOKUP や XLOOKUP は逆で、上から走査して最初の1件で
止まります。この違いが、FILTER の「意外な挙動」をすべて説明します。検索は1つの値を
1つのセルに返す。FILTER は行の塊を返し、式を入れたセルから下(と右)へスピル
します。ドラッグもCSEも不要。一度書けば、Excel がデータ量に合わせて出力サイズを決めます。
' 1件・1セル:
=XLOOKUP("West", Region, Sales) ' 最初の West 行
' 全件・範囲にスピル:
=FILTER(Sales, Region = "West") ' West の行を、ある分だけ全部
第2引数 含める条件 は、データと同じ高さの TRUE/FALSE の列だと考えてください。
Region = "West" は1セルではなく Region 列全体を一度に比較し、TRUE/FALSE の配列を
作ります。FILTER はその値が TRUE の行を残します。
すべての鍵となるルール:AND は掛ける、OR は足す
FILTER で最も役立つのに、多くの解説が埋もれさせている点です。つい
AND(Region="West", Amount>1000) と書きたくなりますが、動きません。AND() は配列を
1つの TRUE/FALSE に潰してしまい、FILTER は全件か0件になります。条件は配列のままで
保たなければならないので、ブール演算を自分で書きます。
' AND — 条件どうしを掛ける(TRUE*TRUE = 1、何か*FALSE = 0)
=FILTER(Sales, (Region = "West") * (Amount > 1000), "該当なし")
' OR — 条件どうしを足す(FALSE+FALSE = 0、どちらか1なら残る)
=FILTER(Sales, (Region = "West") + (Region = "East"), "該当なし")
掛け算が論理ANDになるのは TRUE*TRUE = 1、*FALSE は必ず0だから。足し算が論理ORに
なるのは、どちらかが1なら行が残るから。各条件は必ずカッコで囲みます——比較を演算より
先にやらせるためです。ここが腑に落ちれば、どんな複雑な条件も「1と0の配列の算数」に
すぎません。
FILTER が #CALC! を返す理由と、それを防ぐ引数
「FILTERが効かない」で最も多い相談がこれです。1行も一致しないと結果は空の配列に
なり、Excel はセルに「何も無い」を表示できないため #CALC! を返します。ロジックの
バグではなく、空配列の見た目そのものです。直し方は省略可能な第3引数 空のとき:
=FILTER(Sales, Region = "North") ' North が無いと -> #CALC!
=FILTER(Sales, Region = "North", "該当なし") ' -> "該当なし"(きれい)
=FILTER(Sales, Region = "North", "") ' -> 空白にしたいとき
ダッシュボードや他の式に渡す FILTER には、毎回 空のとき を付けるクセを。
不意の #CALC! は連鎖し、スピルを参照するものすべてにエラーが伝染します。引数を
1つ足すだけで、「該当なし」が赤いエラーではなく自分の決めた値になります。
#SPILL! は式ではなく「隣人」の問題
FILTER はスピルする先に空セルが必要です。結果が占めたい範囲に、はぐれた値・結合
セル・残った見出しなどがあると、Excel は配列を置けず #SPILL! を返します。式は
正しく、ふさがっているのは置き場所です。セルをクリックすると、使おうとしている
スピル範囲が枠線で示されます。そこにあるものを消せば結果が現れます。実用ルールは2つ:
既存データのすぐ上に FILTER を置かない、スピル域に落ちるものを列全体(A:A)に
入れない。
スピル結果は # 演算子で参照する
出力サイズはデータで変わるので、固定範囲では参照しません。スピルを # 演算子で
指します。FILTER が E2 にあるなら、E2# は「いまスピルしている範囲全体(大きさは
可変)」の意味です。グラフ・COUNTA・自動で伸縮するドロップダウンに渡せます。
=COUNTA(E2#) ' FILTER が返した行数(自動更新)
=SUM(F2#) ' スピルした金額列の合計
奥義の式:SORT・UNIQUE・FILTER の合わせ技
FILTER が重要なのは「組み合わせられる」からです。UNIQUE
と SORT で包めば、ふつう手作業3ステップで作るものが、
自動メンテの1式になります。
=SORT(UNIQUE(FILTER(Customer, Region = "West")))
内側から読みます。FILTER が West の顧客を抽出し、UNIQUE が重複を除き、SORT が
並べ替える——売上が1件増えた瞬間に全部やり直されます。動的ドロップダウンや
ダッシュボード一覧の定番ソースで、作業列も更新ボタンも VBA も不要です。
判断:FILTER が旧来のやり方に取って代わるとき
一致行をコピーしたいだけのために作業列を足してオートフィルターを掛けているなら、
それが FILTER の合図です。部分集合の抽出に {=...} の CSE 配列数式を打っているなら、
365 ではもう10年遅れのパターンです。正直な例外:超巨大シートでは FILTER はブックと
共に再計算するので、100万行からの一度きりの抽出はオートフィルターや Power Query の方が
軽い。生き続けてほしいものはすべて FILTER の勝ちです。
ExcelMaster の使いどころ
FILTER の作業の多くは要するに「生きたビューを作って」です——期限超過の未払い請求を
金額順で別タブに。ExcelMaster は、AND/OR のブール算も 空のとき ガードも含めて、
その式を日本語の指示から書き、置きたい場所に配置し、スピル域が空いているかまで確認
します。ロジックはあなたが握り、手作業だと厄介な配列の機構は任せられます。
よくある質問
FILTER が #CALC! を返すのはなぜ?
条件に1行も一致せず、空の配列はセルに表示できないからです。第3引数 空のとき を
足してください:=FILTER(data, 条件, "該当なし")。エラーが自分で決めた値に変わります。
複数条件で抽出するには?
第2引数を配列のまま保ち、ブール算をします。AND は掛ける (A=x)*(B=y)、OR は足す
(A=x)+(B=y)。AND()・OR() 関数は配列を1値に潰すので使いません。
FILTER で #SPILL! が出る原因は?
結果がスピルしたいセルを、値・結合セル・書式などがふさいでいます。式のセルをクリック してスピル範囲の枠を確認し、そこにあるものを消せば表示されます。
FILTER は Excel 2016 / 2019 で使える?
使えません。FILTER などの動的配列関数は Excel 365 / 2021 以降が必要です。旧版では
オートフィルター、CSE 配列数式、Power Query を使います。
検証環境
検証環境: Excel 365(Windows 11)— 最終確認 2026-06-16。
関連ガイド: ExcelのUNIQUE関数 · ExcelのSORT関数 · ExcelのXLOOKUP
