INDEX関数とMATCH関数を組み合わせると、VLOOKUP関数だけでは実現できない検索ができるようになります。選手名から背番号を取得する場面を例に、初心者向けに丁寧に説明します。
INDEX+MATCH関数とは
INDEX関数は「範囲の中の何番目かを指定すると、その位置の値を返す」関数、MATCH関数は「検索値が範囲の中の何番目にあるかを返す」関数です。この2つを組み合わせると、VLOOKUPの「検索列は表の左端に限定される」という制約を回避して、検索列より左側にある値でも自由に取得できるようになります。
基本の書式はこうです。
=INDEX(取得したい値の範囲, MATCH(検索値, 検索範囲, 0))
MATCH関数の第3引数には「0」を指定します。これは「完全一致」で検索することを意味し、選手名のような文字列を検索する場合はほぼ必ず0を指定します。
成績管理表での実例:選手名から背番号を取得する
大阪グーニーズの選手マスタシートでは、A列に背番号、B列に守備位置、C列に選手名を記録しているとします。背番号はC列(選手名)より左側にあるため、VLOOKUP関数では選手名を検索キーにして背番号を取得することができません。
| 背番号 | 守備位置 | 選手名 |
|---|---|---|
| 1 | 中堅手 | SUZUKI |
| 4 | 一塁手 | NAKATA |
| 7 | 左翼手 | YAMAMOTO |
| … | … | … |
このマスタが選手マスタシートのA2:C30に入っているとして、選手名「NAKATA」から背番号を取得する式はこうなります。
=INDEX(選手マスタ!A2:A30, MATCH("NAKATA", 選手マスタ!C2:C30, 0))
これで「選手マスタのC2:C30の中でNAKATAが何番目にあるかをMATCHが調べ、その番目の値をA2:A30から取り出す」という計算が実行され、背番号「4」が求まります。
「=MATCH(“NAKATA”, 選手マスタ!C2:C30, 0)」の形で、検索値・検索範囲・照合の種類(0=完全一致)を指定します。これ単体で計算すると「NAKATAが範囲の何番目にあるか」という順位が数値で返ってきます。
取得したい値(背番号)が入っている範囲「選手マスタ!A2:A30」を確認します。この範囲は、MATCHで検索した範囲(C2:C30)と開始行・行数を揃えておく必要があります。
「=INDEX(選手マスタ!A2:A30, 」まで入力したら、その続きにSTEP1で作ったMATCH式をそのまま入れ、最後に「)」を2つ分閉じます。
式を確定すると、該当する背番号がすぐにセルに表示されます。
しくみを理解する:INDEX+MATCHは何をしているのか
この式は、実は2段階の処理を順番に行っているだけです。
- 1段階目(MATCH):検索範囲(C2:C30)を上から順に見ていき、検索値(NAKATA)と一致するセルが何番目にあるかを数値(この例では3番目)として返す
- 2段階目(INDEX):MATCHが返した数値を「範囲の中の位置」として受け取り、取得範囲(A2:A30)の中でその位置にある値を返す
つまりMATCHは「探して位置を教えるだけ」、INDEXは「教わった位置の値を取り出すだけ」という役割分担です。VLOOKUPのように「検索列と取得列が同じ範囲内にあり、取得列は検索列より右」という制約がなく、検索範囲と取得範囲をそれぞれ独立に指定できるため、背番号のように検索列(選手名)より左側にある値でも取得できます。
よくあるミス:結果がおかしくなる原因
MATCH関数の第3引数は省略すると「1」(近似一致)として扱われる仕様になっています。選手名のような文字列を検索する場合、近似一致では意図しない行がヒットしたり、エラーになったりします。文字列や番号を完全一致で検索したいときは、必ず第3引数に「0」を指定してください。
INDEXの取得範囲(A2:A30)とMATCHの検索範囲(C2:C30)は、開始行・行数が完全に一致している必要があります。片方だけ範囲を広げて更新した場合など、行数がずれると「3番目」が指す実際の行がずれてしまい、別の選手の背番号を返してしまいます。範囲を変更するときは、必ず両方の範囲を同時に見直すようにしてください。
- INDEX+MATCHは「MATCHが位置を探し、INDEXがその位置の値を取り出す」2段階の組み合わせ
- VLOOKUPと違い、検索範囲と取得範囲を別々に指定できるため、検索列より左側の値も取得できる
- MATCHの第3引数(0)の省略と、2つの範囲の行数ズレが誤った結果の2大原因
次回予告
次回のテーマは「XLOOKUP」です。VLOOKUPの弱点を解消した新しい検索関数を、選手マスタ参照をシンプルな式に置き換える例で解説していきます。
▶︎ 次回:XLOOKUP関数の使い方としくみ



コメント