概要
FILTER や XLOOKUP が使えない古い Excel でも、「複数条件で検索」したい場面はたくさんあります。
そのときに定番になるのが INDEX+MATCH+条件(配列数式) の組み合わせです。
考え方はシンプルで、
- MATCH で「条件をすべて満たす行番号」を見つける
- INDEX で「その行の値」を取り出す
という流れです。
複数条件は、FILTER と同じく 掛け算(*)で AND 条件 を作るのが基本パターンです。
基本の考え方(1条件版のおさらい)
まずは 1条件の INDEX+MATCH から振り返ります。
A列:商品コード
B列:商品名
E2 の商品コードに対応する商品名を取りたいときの基本形は次の通りです。
=INDEX($B$2:$B$100, MATCH(E2, $A$2:$A$100, 0))
MATCH で「E2 が A2:A100 の中で何番目か」を求め、その番号を INDEX に渡して B列の値を返しています。
複数条件版では、この「MATCH の第2引数(検索範囲)」を 条件式から作る というイメージになります。
複数条件 MATCH の基本形(AND 条件)
例として、次のような売上表を考えます。
A列:日付
B列:担当者
C列:商品
D列:金額
「担当者=F2 かつ 商品=G2 の行」を1件だけ特定したいとします。
このとき、MATCH の検索範囲を次のような“条件の掛け算”で作ります。
=MATCH(1, (B2:B100=F2) * (C2:C100=G2), 0)
ポイントをかみ砕くと:
(B2:B100=F2)→ 行ごとに TRUE / FALSE(担当者が一致しているか)(C2:C100=G2)→ 行ごとに TRUE / FALSE(商品が一致しているか)- TRUE を 1、FALSE を 0 とみなして掛け算すると、
両方 TRUE の行だけ 1×1=1、それ以外は 0 になります - MATCH は「1 を探せ」と言っているので、「すべての条件を満たす行」を見つけられる
こうして見つかった「行番号」を INDEX に渡します。
INDEX+MATCH+条件(複数条件検索)の完成形
上の考え方を組み合わせると、
「担当者=F2 かつ 商品=G2 の行の“金額”を返す」式は次のようになります。
=INDEX($D$2:$D$100,
MATCH(1, (B2:B100=F2) * (C2:C100=G2), 0))
日本語で言い直すと、
- B列とC列の両方が条件に合う行を MATCH で探して
- その行の D列($D$2:$D$100)の値を INDEX で取り出す
という仕組みです。
※古い Excel では「配列数式」として
Ctrl + Shift + Enter で確定が必要な場合があります(数式が {} で囲まれるタイプ)。
条件を増やす/数値条件を混ぜる
担当者+商品+金額以上 の3条件(AND 条件)
先ほどの例に「金額が 10000 以上」という条件も追加してみます。
=INDEX($D$2:$D$100,
MATCH(1,
(B2:B100=F2) *
(C2:C100=G2) *
(D2:D100>=10000),
0))
条件を増やすときは、掛け算(*)をどんどん増やせば OK です。
日付も含めた4条件
「日付=E2」「担当者=F2」「商品=G2」「金額が 10000 以上」なら:
=INDEX($D$2:$D$100,
MATCH(1,
(A2:A100=E2) *
(B2:B100=F2) *
(C2:C100=G2) *
(D2:D100>=10000),
0))
OR 条件を混ぜたい場合
旧式の INDEX+MATCH で OR 条件を扱う場合、少し工夫が必要ですが、
基本的な考え方は FILTER と同じで「+(足し算)」を使います。
例えば「担当者が F2 または G2」で、商品が H2 という条件で1件を探したいとき:
=INDEX($D$2:$D$100,
MATCH(1,
((B2:B100=F2) + (B2:B100=G2)) *
(C2:C100=H2),
0))
(B2:B100=F2) + (B2:B100=G2)が、
「F2 でも G2 でも TRUE(1)」という OR 条件- それと
(C2:C100=H2)を掛け算して AND 条件にしている
旧 Excel では、複雑になってくると「FILTER の方が圧倒的に書きやすい」ですが、
FILTER が使えない環境ではこのパターンがよく使われます。
よくあるつまずきと対策
条件式の範囲サイズは必ず揃える
A2:A100、B2:B100、C2:C100 … のように、
すべて同じ行数・同じ開始行にすることが絶対条件です。
一つだけ 2〜99 行などにずれていると、配列のサイズ不一致でおかしな結果やエラーになります。
MATCH の「1」と「0(完全一致)」の意味
- MATCH の第1引数 → 探す値(1 を探す)
- 第3引数 → 検索方法。0 は「そのまま完全一致」です
「条件式の掛け算で 1(TRUE)を作り、その 1 を完全一致で探す」という構図になっている、と思ってください。
複数件ヒットした場合は「一番上の行」だけ
MATCH は、条件を満たす行が複数あっても「一番上の行」しか返しません。
複数件をすべて一覧にしたいときは、FILTER の方が向いています。
エラーを人に見せたくない場合は IFERROR
条件に合う行が1件もないときは #N/A になります。
ユーザーにやさしくするなら IFERROR で包みます。
=IFERROR(
INDEX($D$2:$D$100,
MATCH(1,(B2:B100=F2)*(C2:C100=G2),0)
),
"該当なし"
)
例題
問題1: A2:A100 に商品コード、B2:B100 に商品名、C2:C100 にカテゴリがあります。
「商品コード=E2 かつ カテゴリ=F2」の商品名を G2 に表示してください。
=INDEX($B$2:$B$100,
MATCH(1,(A2:A100=E2)*(C2:C100=F2),0))
問題2: A2:A100 に日付、B2:B100 に担当者、C2:C100 に商品、D2:D100 に金額があります。
「日付=F2 かつ 担当者=G2 かつ 商品=H2」の金額を I2 に表示してください。
=INDEX($D$2:$D$100,
MATCH(1,
(A2:A100=F2)*
(B2:B100=G2)*
(C2:C100=H2),
0))
問題3: 問題2の式に「金額が 10000 以上」という条件を追加し、
その条件を満たす金額を J2 に表示してください。
=INDEX($D$2:$D$100,
MATCH(1,
(A2:A100=F2)*
(B2:B100=G2)*
(C2:C100=H2)*
(D2:D100>=10000),
0))
問題4: B2:B100 に担当者、C2:C100 に商品、D2:D100 に金額があります。
「担当者が F2 または G2 のどちらか かつ 商品が H2」の金額を K2 に表示してください。
=INDEX($D$2:$D$100,
MATCH(1,
((B2:B100=F2)+(B2:B100=G2))*
(C2:C100=H2),
0))
問題5: 問題2の式をベースに、条件に合う行が見つからない場合は「該当なし」と表示するように L2 に式を書いてください。
=IFERROR(
INDEX($D$2:$D$100,
MATCH(1,
(A2:A100=F2)*
(B2:B100=G2)*
(C2:C100=H2),
0)
),
"該当なし"
)
まとめ
複数条件検索(旧式)の INDEX+MATCH のポイントは次の通りです。
- MATCH で「条件式の掛け算が 1 になる行」を探す
- INDEX で、その行の値を取り出す
- AND 条件は
(条件1)*(条件2)*(条件3)という掛け算で表現する - 条件に合う行が複数あっても「一番上の1件」だけを返す
FILTER や XLOOKUP がない環境でも、このパターンを覚えておけば、
かなり高度な「複数条件検索」が実現できます。
