要点 —
INDEX/MATCHは、それぞれ1つの仕事をする2つの関数から作られた 検索です。MATCH(value, lookup_column, 0)は、列の中の値の位置(どの行か)を 返します。INDEX(return_column, position)は、その位置の値を返します。 これらをネストすると——=INDEX(Return, MATCH(key, Lookup, 0))——VLOOKUPには真似できない検索が手に入ります: 左でも右でも見て、挿入された列に耐え、真の行 × 列検索へ拡張できます。 唯一の罠はMATCHの第3引数——完全一致には0を使います。すべての バージョンで動作します;365 ではXLOOKUPが両方を 1つに畳み込みます。
=INDEX(C2:C500, MATCH(F2, A2:A500, 0)) ' AでF2を探し、一致するCを返す
=INDEX(Price, MATCH("APX-100", ID, 0)) ' 名前付き範囲なら一文のように読める
熟練者が INDEX/MATCH に手を伸ばす理由は郷愁ではありません——それが、VLOOKUP が
溶接している2つのことを分けるからです:行を見つけることと、値を取ってくること。
MATCH が見つける係。INDEX が取ってくる係。どちらも相手の列がどこにあるかを気に
しないので、VLOOKUP の硬直した幾何——値は左、列は右へ数える——がまるごと蒸発します。
この記事で学べること
- 考え方の軸:MATCH がどこを見つけ、INDEX が何を取ってくる
- 切り離すことが、なぜ右だけでなく左を見られることを意味するのか
- VLOOKUP が静かに壊れるとき、なぜ INDEX/MATCH は挿入された列に耐えるのか
match_typeの罠——VLOOKUP の第4引数と同じ「0を使え」の教訓- 他の何もきれいにはできない一手:二次元(行 × 列)検索
- XLOOKUP がこれを置き換えるとき——そして INDEX/MATCH がなお勝つとき
考え方の軸:MATCHがどこを見つけ、INDEXが何を取ってくる
それぞれの半分を単独で走らせれば、分業は明らかです。
=MATCH("APX-100", A2:A500, 0) ' -> 37 (APX-100 はA列の37番目の項目)
=INDEX(C2:C500, 37) ' -> C列の37番目のセルの値
MATCH は1つの列を検索し、数値を返します:あなたの値の位置です。INDEX は
検索を完全に無視します——範囲と位置を渡すと、そこにある値を返します。どちらも
相手を知りません。MATCH の位置をそのまま INDEX に食わせることで、両者を組み合わせます:
=INDEX(C2:C500, MATCH("APX-100", A2:A500, 0))
' ^ここから取ってくる ^ここで行を見つける
これがテクニックのすべてです。そして、そこにないものに注目してください:列の 数え上げもなければ、2つの範囲が隣り合っていたり、特定の順序に並んでいたりする要件も ありません。
切り離すから、左を見られる
検索範囲と返却範囲が独立した引数なので、それらの左右の順序は無関係です。
IDをD列に、名前をA列に置く? MATCH がDを検索し、INDEX がAから取ってきて、
ちゃんと動きます:
' A = 名前、D = ID。IDを持っていて、その左の名前が欲しい。
=INDEX(A2:A500, MATCH(F2, D2:D500, 0)) ' 造作ない — VLOOKUPにはできない
これが目玉の利点です。VLOOKUP は検索列の右側の
列しか返せません;INDEX/MATCH にそんな規則はありません——最初の列が固定された単一の
「テーブル」など存在せず、あなたが明示的に指名する2つの範囲があるだけだからです。
挿入された列に耐える
VLOOKUP の col_index_num はベタ書きの整数で、誰かが列を挿入した瞬間に間違った列を
指します。INDEX/MATCH は列を一切数えません——Excel が自動更新する名前付き範囲や
列全体の参照を指します:
=INDEX(C2:C500, MATCH(F2, A2:A500, 0))
' AとCの間に列を挿入? Excel が C2:C500 -> D2:D500 と書き換えてくれる。
列を挿入、削除、移動しても、参照がそれに合わせてずれます。これが、他の人が編集する ブックにとって INDEX/MATCH が安全な選択である理由です——数式は、どのデータが 欲しいかを述べているのであって、今日たまたま何列ぶん向こうにあるかではないのです。
match_typeの罠(VLOOKUPと同じ教訓)
MATCH の第3引数は、VLOOKUP の第4引数とまさに同じ地雷です。既定は
1(近似、昇順ソートを仮定)です。あなたがほぼ常に欲しいのは 0 です:
=MATCH(F2, A2:A500) ' 危険 — 既定で1、近似、ソート済みデータが必要
=MATCH(F2, A2:A500, 1) ' 近似:F2以下で最大の値(昇順が必要)
=MATCH(F2, A2:A500, 0) ' 完全検索で正しい — F2に等しい行
=MATCH(F2, A2:A500, -1) ' 近似:F2以上で最小の値(降順が必要)
ほぼ間違いなく欲しい完全一致には 0 を打ちます。近似 MATCH には、近似 VLOOKUP と
同じ正当なニッチ——ソート済みの列での帯(バンド)検索(値がどの区分に落ちるかを
見つける)——があり、それ以外のあらゆる場所では同じ静かな間違った答えの失敗があります。
他の何もきれいにはできない一手:二次元検索
ここで INDEX/MATCH は「VLOOKUP をうまくやったもの」であることをやめ、それ自身の
道具になります。INDEX は行番号と列番号の両方を受け取れます。それぞれを
自前の MATCH から食わせれば、行キーと列キーの交点にある値を検索できます
——マトリックスに対する検索です:
' グリッド:A列に月が縦、1行目に地域が横、真ん中に数値。
=INDEX(B2:M13, MATCH(F2, A2:A13, 0), MATCH(G2, B1:M1, 0))
' ^どの行(月) ^どの列(地域)
一方の MATCH が行を、もう一方が列を特定し、INDEX が両者の交わるセルを返します。
VLOOKUP はこれに不格好な作業列が要ります;XLOOKUP は別の XLOOKUP の中にネストする
必要があります。2つの MATCH を持つ INDEX は、それを1行で読めます——いまだに Excel で
いちばんきれいな二次元検索です。
エラーを包む — きつく
何も見つけられなかった MATCH は #N/A を返し、それが INDEX を通って外へ伝播します。
同じ規律ある方法で扱います:まず原因を直し(空白、文字列と数値の不一致)、それから
数式が正しくなってからだけ包みます。
=IFERROR(INDEX(C2:C500, MATCH(F2, A2:A500, 0)), "見つかりません")
ここでは、本当に壊れた参照まで飲み込んでしまう無差別なラッパーよりも、
IFERROR を選びます。MATCH からの #N/A は
情報です——キーがそこにないことを教えてくれます。
判断:INDEX/MATCHか、VLOOKUPか、XLOOKUPか?
XLOOKUP— Excel 365 なら、1つの値の検索には これが既定です:どちらの方向も見て、組み込みの「見つからない」値を取り、ネストした INDEX/MATCH よりも素直に読めます。- INDEX/MATCH — **二次元(行 × 列)**検索ではなお勝者で、左検索と挿入に強い参照が 必要な、XLOOKUP のない古いバージョンでもっとも堅牢な選択です。
VLOOKUP— 単純な完全一致・右へ返すケース には問題ありませんが、列が動くと壊れるやつです。
腕の見せどころは、問題の形を読むことです:1つの値か、交点か? 現代の Excel か、古い 共有ブックか? それが、3つのうちどれを手にしているかを教えてくれます。
ExcelMaster の使いどころ
ほとんどの人にとって INDEX/MATCH のいちばん難しい部分はネストです——どの範囲を MATCH
が検索し、どれを INDEX が返し、二次元検索で2つの MATCH がどこへ行くのかを覚えておく
こと。ExcelMaster は平易な説明(「顧客IDで照合して、各注文の地域を顧客シートから
引いてきて」)からパターン全体を書き、完全一致を固定し、正しい構造を選びます——
そのほうがきれいなら単一の XLOOKUP、本当にグリッド検索を
しているなら2つの MATCH を持つ INDEX——だから、あなたが手で括弧を組み立てることは
ありません。
よくある質問
INDEX MATCHとは何で、どう動く?
2つの関数から作られた検索です。MATCH(value, lookup_range, 0) は、列の中の値の
位置を返します;INDEX(return_range, position) は、その位置の値を返します。
=INDEX(return_range, MATCH(value, lookup_range, 0)) として組み合わせると、MATCH が
行を見つけ、INDEX が選んだ任意の列から結果を取ってきます。
VLOOKUPではなくINDEX MATCHを使うのはなぜ?
3つの理由:左を見られる(検索列より前の列を返せる)、列番号をベタ書きしないので 挿入や移動された列に耐える、そして真の二次元(行 × 列)検索へ拡張できる。 VLOOKUP は右側の列しか返せず、テーブルの列が変わると壊れます。
INDEXとMATCHで二次元検索をするには?
INDEX の中に、行用と列用の2つの MATCH を使います:
=INDEX(data, MATCH(row_key, row_headers, 0), MATCH(col_key, col_headers, 0))。
最初の MATCH がどの行かを見つけ、2つ目がどの列かを見つけ、INDEX が両者の交わる値を
返します。
MATCHの0は何を意味する?
0 は完全一致の match_type——検索値に等しい値の位置です。1(既定)と -1 は
ソート済みデータで近似一致をします。通常の検索には 0 を使います;省略すると既定の
1 になり、ソートされていないデータでは静かに間違った行を返しうる。
XLOOKUPがあるなら、INDEX MATCHはまだ学ぶ価値がある?
はい。XLOOKUP は単純な1つの値の検索では INDEX/MATCH を
置き換えますが、INDEX/MATCH はいまだに二次元(行 × 列)検索をするいちばんきれいな
方法であり、XLOOKUP のない古い Excel バージョンでは不可欠です。
検証環境
検証環境: Excel 365(Windows 11)— 最終確認 2026-07-05。
関連ガイド: ExcelのVLOOKUP · ExcelのHLOOKUP & LOOKUP · XLOOKUP(2025) · ExcelのIFERROR · ExcelのFILTER
