ExcelのFILTER関数なら、マスターテーブルから「サイズ=Large かつ 色=Blue」の行だけを自動で抽出し、該当がなければ空白を返す表示までワンセルで実現できます。本記事は複数条件のAND/ORの作り方、エラーを空白に置き換える設定、テーブル化(構造化参照)による保守性向上、実務向けの高速・堅牢化テクニックまで、手順と理由を具体的に解説します。
結論(最短ルート)
下記の2つの式だけ覚えれば、目的は達成できます。
=FILTER(A1:H8,(A1:A8="Large")*(B1:B8="Blue"))
該当行がないときは空白(空文字)を返すには、第3引数 if_empty を使います。
=FILTER(A1:H8,(A1:A8="Large")*(B1:B8="Blue"),"")
A1:A8="Large"とB1:B8="Blue"は、行ごとの真偽(TRUE/FALSE)配列を作ります。- 掛け算(
*)は AND 条件を意味します。TRUEを1、FALSEを0と見なすため、1*1=1の行だけが抽出されます。 - 第3引数に
""を渡すと、条件一致なし=通常は#CALC!になるところを空白表示にできます。
前提データ(サンプル)
説明を具体化するため、A1:H8 に下のようなマスターテーブルがあるとします(見出し行は1行目)。
| A:サイズ | B:色 | C:SKU | D:商品名 | E:価格 | F:在庫 | G:カテゴリ | H:備考 |
|---|---|---|---|---|---|---|---|
| Small | Red | SLR-001 | コットンT | 1500 | 20 | トップス | – |
| Medium | Blue | MBL-002 | コットンT | 1550 | 18 | トップス | – |
| Large | Blue | LBL-003 | 裏起毛パーカー | 4800 | 12 | アウター | 定番 |
| Large | Green | LGN-004 | ナイロンジャケット | 6800 | 5 | アウター | – |
| Large | Blue | LBL-005 | オックスフォードシャツ | 4200 | 9 | シャツ | – |
| Medium | Navy | MNV-006 | ニットセーター | 5300 | 7 | トップス | – |
| Large | Blue | LBL-007 | ドライポロ | 3600 | 16 | トップス | 夏向け |
| Small | Blue | SBL-008 | コットンT | 1500 | 22 | トップス | – |
テーブルA(A10:H17)に自動表示する手順
- セル A10 を選択します(結果はスピルで右方向・下方向に自動展開されます)。
- 次の式を入力し、Enter を押します。
=FILTER(A1:H8,(A1:A8="Large")*(B1:B8="Blue"),"")
これで「サイズ=Large かつ 色=Blue」の行だけが A10:H にスピル表示され、該当がなければ空白表示になります。
- #SPILL! が出たとき:スピル先に値や書式オブジェクト(結合セル、画像、図形等)があると発生します。スピル範囲を空けるか、結合を解除してから再計算してください。
- 列順・列数を変えたいとき:
CHOOSECOLSやINDEXで列を並べ替えられます(例は後述)。
AND/OR 条件の作り方(掛け算・足し算で覚える)
FILTER の第2引数は「抽出するかどうか」を決める フィルター配列 です。配列どうしの演算で論理を作ります。
AND 条件(両方満たす)
=FILTER(A1:H8,(A1:A8="Large")*(B1:B8="Blue"),"")
OR 条件(どちらか満たす)
足し算(+)は OR を意味します。TRUE=1、FALSE=0 なので、1+0=1 以上の行が抽出されます。
=FILTER(A1:H8,(A1:A8="Large")+(B1:B8="Blue"),"")
AND と OR の組み合わせ
例えば「サイズ=Large かつ(色=Blue または Navy)」のように丸めて考えます。
=FILTER(
A1:H8,
(A1:A8="Large") * ((B1:B8="Blue") + (B1:B8="Navy")),
""
)
複数値リストで OR 条件を簡潔に(XMATCH/COUNTIF)
色をセル範囲に列挙して可変にしたい場合は、XMATCH や COUNTIF を使うとスッキリ書けます。
=FILTER(
A1:H8,
(A1:A8="Large")*ISNUMBER(XMATCH(B1:B8, E2:E5)),
""
)
または
=FILTER(
A1:H8,
(A1:A8="Large")*(COUNTIF(E2:E5,B1:B8)>0),
""
)
E2:E5 に「Blue」「Navy」などを縦に列挙しておけば、リストを更新するだけで抽出対象が変わります。
該当なしを空白にする — if_empty の正しい使い方
FILTER の第3引数 if_empty に "" を渡すのが一番シンプルです。
=FILTER(A1:H8,(A1:A8="Large")*(B1:B8="Blue"),"")
- 空白と空文字の違い:
""は長さ0の文字列であり、COUNTA では「非空」とカウントされます。集計の都合で「完全な空セル」に見せたい場合は、表示側で条件付き書式で空欄表示にする、もしくはテーブルを受け取る側で「=""を空扱い」にするのが実務的です(数式で本当の空セルを返すことはできません)。 - 「該当なし」と表示したい:
""を"該当なし"など任意の文言に変えるだけです。セル結合を使わず、行単位で見せ方を整えると崩れにくくなります。
テーブル化(Ctrl+T)で壊れない参照に
データが追加・削除される運用では、範囲参照(A1:H8)のままだと行数が変わると追従できません。テーブル化し、構造化参照で書くと堅牢になります。
- A1:H8 を選択 → Ctrl+T → 「先頭行をテーブルの見出しとして使用する」にチェック → テーブル名を テーブル1(任意)に変更。
- 色列に「色」、サイズ列に「サイズ」と見出しがある前提で、式を以下のように書き換えます。
=FILTER(テーブル1,(テーブル1[サイズ]="Large")*(テーブル1[色]="Blue"),"")
これで新規行が追加されても自動で範囲が広がり、抽出結果もリアルタイムに反映されます。
速度最適化(大量データ向け)— 条件列を追加
10万行以上のような大規模データでは、同じ比較式を何度も評価するより「条件列」を1列だけ追加し、そこを参照して FILTER する方が速く安定します。
- マスターテーブルに新しい列「条件」を追加。
- 「条件」列の数式(構造化参照):
=--(([@サイズ]="Large")*([@色]="Blue"))
この列は一致時に 1、不一致なら 0 を返します。抽出側は次のとおり。
=FILTER(テーブル1, テーブル1[条件]=1, "")
比較の評価が1回で済み、FILTER のフィルター配列は単純な数値列なのでスムーズに動きます。条件が複雑なほど効果が大きくなります。
並べ替え・列選択・見出しの整形
抽出結果を見やすく整えたい場面は多いでしょう。Excel 365 なら動的配列関数でワンセル完結が可能です。
並べ替え(価格の昇順)
=SORT(
FILTER(テーブル1,(テーブル1[サイズ]="Large")*(テーブル1[色]="Blue"),""),
MATCH("価格",テーブル1[#Headers],0),
1
)
列の絞り込み(サイズ・色・SKU・商品名・価格だけ)
CHOOSECOLS を使うと列番号で一気に選べます。見出しを含むかどうかに注意してください(ここではデータ範囲に対する列番号)。
=CHOOSECOLS(
FILTER(A1:H8,(A1:A8="Large")*(B1:B8="Blue"),""),
1,2,3,4,5
)
ヘッダー行を付ける(365 のみ)
VSTACK で見出し行を上に重ねられます(ヘッダー手入力を避けたい場合)。
=VSTACK(
A1:E1,
CHOOSECOLS(
FILTER(A1:H8,(A1:A8="Large")*(B1:B8="Blue"),""),
1,2,3,4,5
)
)
別シート・別ブックへ出力
参照元が別シートの場合も同じです(シート名にスペースがあるときは 'シート 名'!A1:H8 のように引用符で囲む)。
=FILTER(商品!A1:H8,(商品!A1:A8="Large")*(商品!B1:B8="Blue"),"")
別ブックの場合はブックが開いている前提で、'[ブック名.xlsx]シート名'!A1:H8 の形式で指定します。
ケース感度・表記ゆれ・空白対策
- 大文字小文字:Excel の等号(
=)比較は通常 大文字小文字を区別しません。厳密に区別したい場合はEXACTを使います。例:EXACT(B1:B8,"Blue") - 前後スペース:入力ゆれ(末尾スペースなど)に強くするには
TRIM(前後スペース除去)やCLEANを比較側に噛ませます。
=FILTER(
A1:H8,
(A1:A8="Large")*(TRIM(B1:B8)="Blue"),
""
)
「部分一致」で色名を含む行を抽出したい
色名に「Blue Sky」「Blue-Gray」が混在していて「Blue を含む」行を抽出したいときは、SEARCH などを使って包含判定を作ります。
=FILTER(
A1:H8,
(A1:A8="Large")*(ISNUMBER(SEARCH("Blue",B1:B8))),
""
)
期待される出力例(テーブルA)
上のサンプルデータでは、A10:H に以下の3行(SKU: LBL-003、LBL-005、LBL-007)がスピル表示されます。
| サイズ | 色 | SKU | 商品名 | 価格 | 在庫 | カテゴリ | 備考 |
|---|---|---|---|---|---|---|---|
| Large | Blue | LBL-003 | 裏起毛パーカー | 4800 | 12 | アウター | 定番 |
| Large | Blue | LBL-005 | オックスフォードシャツ | 4200 | 9 | シャツ | – |
| Large | Blue | LBL-007 | ドライポロ | 3600 | 16 | トップス | 夏向け |
よくあるトラブルと対処
| 症状 | 原因 | 対処 |
|---|---|---|
| #SPILL! | スピル範囲に既存の値・結合・図形がある | 範囲を空ける/結合解除/図形を移動 |
| #CALC! | 一致行がゼロ、if_empty 未指定 | 第3引数に "" かメッセージを指定 |
| #NAME? | FILTER 未対応の古いExcel | Microsoft 365/Excel 2021 以降を使用 |
| 思った列だけ抽出できない | 列位置のズレ/ヘッダー含む範囲を参照 | 正しい範囲と列番号を確認、CHOOSECOLS を活用 |
| 速度が遅い | 比較式の重複評価、複雑なSEARCH/ORの多用 | 条件列方式、XMATCH/COUNTIFで集合判定、必要列だけ抽出 |
式を読みやすくする:LET で分解(365)
式が長くなってきたら LET で中間配列に名前を付けると管理が簡単です。
=LET(
rng, テーブル1,
sz, テーブル1[サイズ],
cl, テーブル1[色],
cond, (sz="Large")*(cl="Blue"),
FILTER(rng, cond, "")
)
条件だけを差し替える、集合判定を追加する、といった編集が安全になります。
実務Tips(現場で役に立つ小ワザ)
- 入力規則でゆれを防ぐ:マスター側の「サイズ」「色」はプルダウン(データの入力規則)にしておくと、比較が安定します。
- 表示側は書式で整える:価格に通貨記号、在庫のゼロは「—」表示、などは表示形式や条件付き書式で対応。抽出ロジックと見た目を分離します。
- 中間列は非表示に:条件列方式を採用しても、列を非表示にしておけば見た目はスッキリ。後々の速度問題に効きます。
- 集計と抽出を分離:抽出後に
UNIQUE、SUBTOTALなどを重ねるより、抽出結果を別ブロックに置いてから集計するとトラブルが少ないです。
関連パターン(現場で頻出)
「Large 以外」かつ「Blue」
=FILTER(A1:H8,(A1:A8<>"Large")*(B1:B8="Blue"),"")
価格の範囲条件を追加(例:3000〜5000)
=FILTER(
A1:H8,
(A1:A8="Large")*(B1:B8="Blue")*(E1:E8>=3000)*(E1:E8<=5000),
""
)
在庫が正数だけを抽出(欠品・空白除外)
=FILTER(
A1:H8,
(A1:A8="Large")*(B1:B8="Blue")*(ISNUMBER(F1:F8))*(F1:F8>0),
""
)
列位置が特定できないときの安全策
列の順番が入れ替わりやすいマスターでは、ヘッダー名から列番号を見つけて抽出する方法が堅牢です(365)。
=LET(
src, テーブル1,
hdr, テーブル1[#Headers],
colSize, MATCH("サイズ", hdr, 0),
colColor, MATCH("色", hdr, 0),
FILTER(src, (INDEX(src,,colSize)="Large")*(INDEX(src,,colColor)="Blue"), "")
)
数式の考え方を図解イメージで掴む
FILTER の第2引数は「行ごとの 1/0 のスイッチ配列」です。A1:A8="Large" → {0;0;1;1;1;0;1;0}B1:B8="Blue" → {0;1;1;0;1;0;1;1}
AND(掛け算) → {0;0;1;0;1;0;1;0}(1の行だけが抽出)
OR(足し算) → {0;1;1;1;1;0;1;1}(合計 > 0 の行を抽出)
保守・配布のチェックリスト
- FILTER/LET/SORT/CHOOSECOLS/VSTACK/XMATCH などの関数が利用可能なバージョンか(Microsoft 365/Excel 2021 以降)。
- スピル範囲に障害物(結合・画像・図形・固定値)がないか。
- 参照はテーブルの構造化参照に統一されているか(範囲参照と混在させない)。
- 比較対象の表記ゆれ対策(入力規則、TRIM/CLEAN の併用)がされているか。
- 大量データの場合、条件列方式で負荷分散されているか。
まとめ
「サイズ=Large かつ 色=Blue」を抽出するなら、(条件1)*(条件2) の AND 論理と FILTER の if_empty をセットで使うのが最短最強です。さらに、テーブル化(構造化参照)で範囲の自動追従を実現し、必要に応じて条件列方式・XMATCH/COUNTIF で柔軟な集合判定・SORT/CHOOSECOLS/VSTACK で見た目の整形までワンセルで完結できます。
最小の式:
=FILTER(A1:H8,(A1:A8="Large")*(B1:B8="Blue"),"")
保守性を高める式:
=FILTER(テーブル1,(テーブル1[サイズ]="Large")*(テーブル1[色]="Blue"),"")
この基本形を出発点に、条件追加(価格帯・在庫・カテゴリ)、OR の拡張(XMATCH/COUNTIF)、速度最適化(条件列)を状況に応じて組み合わせれば、日々の抽出・集計作業は関数だけで高速かつノーコードで自動化できます。

コメント