Excel関数 逆引き集 | INDEX+MATCH 基本

Excel VBA Excel
スポンサーリンク

概要

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で書いた方が後々楽だな」と判断できるようになっていきます。

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