Excel関数 逆引き集 | 複数条件検索(旧)→ INDEX+MATCH+条件

Excel VBA Excel
スポンサーリンク

概要

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 がない環境でも、このパターンを覚えておけば、
かなり高度な「複数条件検索」が実現できます。

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