概要
VLOOKUP が「左端から“縦に”探して右側を返す」関数だとしたら、
INDEX+MATCH は「表のどこでも自由に探して、どこでも返せる」セットです。
- MATCH:探したい値が「範囲の中で何番目か(位置)」を返す
- INDEX:その「何番目か」を受け取って、実際の値を返す
この2つを組み合わせると、
「商品コードで行を見つけて、その行の“好きな列”の値を返す」
という、壊れにくくて柔軟な検索が作れます。
基本の考え方
MATCHで「何行目か」を調べる
まず、MATCH 関数で「検索値が上から何番目にあるか」を求めます。
書式はこうです。
=MATCH(検索値, 検索範囲, 0)
ポイントは検索方法に「0(完全一致)」を使うこと。
例えば、A列に商品コード一覧があるとき、E2 の商品コードが A2:A100 の中で何番目かを調べる式は次の通りです。
=MATCH(E2, $A$2:$A$100, 0)
これで「A2:A100 の中で E2 が何番目か」という“番号(位置)”が返ってきます。
例:結果が 5 なら、「A2:A100 の上から5番目 → 実際のセルは A6」という意味です。
INDEXで「その行の値」を取り出す
次に INDEX。こちらは「範囲の中から、“何行目・何列目”の値を返す」関数です。
=INDEX(範囲, 行番号, [列番号])
単純な例として、B2:B100 から「上から5番目」を取りたいなら、
=INDEX($B$2:$B$100, 5)
となり、B6 の値が返ってきます。
INDEX+MATCH をつなげる基本形
VLOOKUP の代わりになる一番基本の形
「A列で検索して、B列の値を返したい」という、VLOOKUP でよくあるパターンを
INDEX+MATCH で書くとこうなります。
=INDEX($B$2:$B$100, MATCH(E2, $A$2:$A$100, 0))
日本語にすると、
- MATCH(E2, A2:A100, 0) で「E2 が A2:A100 の何番目か」を求める
- その“何番目か”を行番号として、INDEX(B2:B100, その番号) で値を取り出す
という流れです。
この1行が、「INDEX+MATCH 基本形」だと思ってください。
右方向・左方向どちらもOK(VLOOKUPとの違い)
VLOOKUP は「左端列で探して、右にある列しか返せない」制限があります。
INDEX+MATCH は「検索範囲」と「返す範囲」を別々に指定できるので、右方向・左方向どちらも自由です。
右方向(A列で探してC列を返す)
=INDEX($C$2:$C$100, MATCH(E2, $A$2:$A$100, 0))
左方向(C列で探してA列を返す)
=INDEX($A$2:$A$100, MATCH(E2, $C$2:$C$100, 0))
どの列を検索に使うか、どの列の値を返すかを自由に組み合わせられるのが、INDEX+MATCH の大きなメリットです。
列が増えても壊れにくい表を作る
VLOOKUP は「3列目」「4列目」など列番号を“数字”で持つため、途中に列を挿入するとズレます。
INDEX+MATCH は「返したい範囲」そのものを指定するので、列の挿入・削除に強いのも特徴です。
例えば、
=VLOOKUP(E2, $A$2:$D$100, 3, FALSE)
だと、「3」という数字が「B列を返す」と決め打ちしています。
真ん中に列を挿入すると「3列目=別の列」になってしまいます。
一方、
=INDEX($B$2:$B$100, MATCH(E2, $A$2:$A$100, 0))
なら、「返す範囲は常にB列」と決めているので、間に列を挿入しても壊れません。
よくあるつまずきと対策
MATCH の結果は「範囲内で何番目」かであって、シートの行番号ではない
A2:A100 の範囲で MATCH が 1 を返しても、それは“1行目”ではなく「A2:A100 の中で一番上」=A2 の意味です。
INDEX も「その範囲内での行番号」で解釈します。
この“範囲内での位置”という考え方を押さえておくと、混乱しません。
検索方法は必ず「0(完全一致)」を指定する
MATCH の第3引数を省略すると近似値になり、
「ソートされていない表で変なところがヒットする」
という事故が起きます。
=MATCH(E2, $A$2:$A$100, 0)
と、0 を必ず書く癖をつけてください。
文字列と数値の違いに注意
見た目が同じでも、
- “00123”(文字列)
- 123(数値)
は別物です。
うまく見つからないときは、TEXT や VALUE で型を揃えます。
例題
問題1: A2:A100 に商品コード、B2:B100 に商品名があります。E2 の商品コードに対応する商品名を F2 に表示してください(INDEX+MATCH で)。
=INDEX($B$2:$B$100, MATCH(E2, $A$2:$A$100, 0))
問題2: C2:C100 に社員番号、A2:A100 に氏名があります。E2 の社員番号に対応する氏名を F2 に表示してください(左方向検索)。
=INDEX($A$2:$A$100, MATCH(E2, $C$2:$C$100, 0))
問題3: A1:Z1 に項目名ヘッダー、A2:Z100 にデータがあります。G1 に「項目名」、G2 に「行番号(2〜100)」が入っているとき、「G1で指定した項目の、G2行目の値」を H2 に表示してください。
=INDEX($A$2:$Z$100, G2-1, MATCH(G1, $A$1:$Z$1, 0))
※A2 が範囲の1行目なので「G2-1」としています。
問題4: A2:A100 に顧客ID、B2:D100 に「売上」「数量」「単価」が並んでいます。H1 に項目名(売上など)、H2 に顧客IDが入っているとき、「H1×H2 の交点の値」を H3 に表示してください。
=INDEX($B$2:$D$100,
MATCH(H2, $A$2:$A$100, 0),
MATCH(H1, $B$1:$D$1, 0))
問題5: 問題1の式で、E2 が空欄のときは何も表示させず、商品コードが見つからないときは「未登録」と表示するように I2 に式を書いてください。
=IF(E2="","",IFERROR(INDEX($B$2:$B$100, MATCH(E2, $A$2:$A$100, 0)),"未登録"))
まとめ
INDEX+MATCH の基本は、
=INDEX(返したい範囲, MATCH(検索値, 検索範囲, 0))
この1行に尽きます。
- MATCH で「どの行(列)か」を見つける
- INDEX がその行(列)の値を返す
- 検索範囲と返したい範囲を自由に組み合わせられるので、右方向・左方向どちらもOK
- 列の挿入・削除に強く、VLOOKUP より壊れにくい
この型を体で覚えてしまうと、「あ、この検索はINDEX+MATCHで書いた方が後々楽だな」と判断できるようになっていきます。
