INDEXとMATCHを組み合わせて柔軟に検索する方法

VLOOKUPには「検索する列は表の一番左端でなければならない」という制約があります。検索したい列より左側にある値を取り出したい場合、結論から言うとINDEX関数とMATCH関数を組み合わせることで、検索範囲と取得範囲を別々に指定できるようになり、この制約から解放されます。この記事では基本の書き方、VLOOKUPとの違い、複数条件での検索まで解説します。

目次

INDEX+MATCHの基本の書き方

基本の形は次の通りです。

=INDEX(取得したい範囲,MATCH(検索値,検索範囲,0))

やっていることは2段階です。まずMATCHで検索値が「何番目にあるか」を調べ、次にINDEXでその番目の値を取ってくる、というイメージです。

MATCH関数が「検索範囲の中で検索値が何番目にあるか」という位置(行番号)を返し、INDEX関数がその位置に対応する値を「取得したい範囲」から取り出します。MATCHの第3引数は完全一致で検索するために「0」を指定します。

なぜVLOOKUP・XLOOKUPではなくINDEX+MATCHなのか

VLOOKUPは検索列が範囲の一番左端でなければならず、検索したい列より左にある値は取り出せません。INDEX+MATCHは「検索する範囲」と「取り出す範囲」を独立して指定できるため、左方向の検索も可能になります。また、表の途中に列を挿入してもMATCH側の範囲参照が自動的に調整されるため、VLOOKUPの列番号指定(3列目、4列目…)のように数式が崩れる心配も少なくなります。

一方、VLOOKUPの制約を解消しつつさらにシンプルに書けるXLOOKUPという選択肢もありますが、こちらはExcel 2021・Microsoft 365以降でしか使えません。共有相手や職場のExcelがそれより古いバージョンの場合はXLOOKUPが使えず#NAME?エラーになるため、そうした互換性を優先したい場面ではINDEX+MATCHを選ぶことになります。XLOOKUPが使える環境であれば、まずXLOOKUPで複数条件に一致するデータを検索する方法をご検討ください。

具体例:商品コードから商品名を検索する(左方向の検索)

次のような商品マスタ(A1:C4)があるとします。商品コード(B列)は商品名(A列)より右側にあります。

A(商品名) B(商品コード) C(単価)
2 ノートPC P001 98000
3 マウス P002 1500
4 キーボード P003 3200

D2に入力した商品コードから、左側にある商品名(A列)を取得したい場合、VLOOKUPでは対応できませんが、INDEX+MATCHなら次のように書けます。

=INDEX(A2:A4,MATCH(D2,B2:B4,0))

「P002」がB列の何番目にあるかをMATCHで調べ、その番目にあるA列の値をINDEXで取り出す、という流れです。

D2が「P002」であれば、B2:B4の中で「P002」は2番目にあるため、A2:A4の2番目である「マウス」が返されます。

複数条件で検索したい場合

MATCHの検索値を配列演算にすることで複数条件検索にも対応できますが、数式が複雑になりがちです。「氏名と日付の両方が一致する行を検索したい」のような複数条件検索は、XLOOKUPで複数条件に一致するデータを検索する方法で紹介しているXLOOKUP関数の方がシンプルに書けます(Excel 2021・Microsoft 365以降で利用可能)。

よくあるエラー・注意点

  • MATCHの第3引数を省略しない: 第3引数を省略すると近似一致(1または-1相当)になり、意図しない結果を返すことがあります。完全一致で検索したい場合は必ず「0」を指定してください。
  • 該当なしのときは#N/Aエラーになる: 検索値が見つからない場合はVLOOKUPと同様に#N/Aエラーが返ります。VLOOKUPとIFERRORを組み合わせてエラー表示を防ぐ方法で紹介している考え方はINDEX+MATCHでもそのまま使え、IFERRORまたはIFNAで囲むと安全です。
  • 取得範囲と検索範囲の行数を揃える: INDEXの取得範囲とMATCHの検索範囲は行数(または列数)が一致していないと、ずれた結果や#REF!エラーの原因になります。

まとめ

INDEX+MATCHは検索範囲と取得範囲を別々に指定できるため、VLOOKUPでは不可能な左方向の検索や、列挿入に強い柔軟な数式を組めます。複数条件での検索が必要な場合はXLOOKUP、エラー処理についてはIFERRORとの組み合わせ方もあわせて確認しておくと安心です。

目次