はじめに
Excelの検索関数といえば、長らく「初心者はVLOOKUP、中級者はINDEX MATCH」というのが定番の構図でした。VLOOKUPの弱点を回避できるINDEX MATCHを使いこなせることは、ある種の「Excel中級者の証」とすら言われてきました。
しかし、Microsoft 365 / Excel 2021以降の環境では、その常識はもう古いものになりつつあります。XLOOKUPやFILTERといった新しい関数が登場し、INDEX MATCHでやっていたことのほとんどは、より短く・より安全に書けるようになりました。
この記事では、INDEX MATCHを多用してきた中級者向けに、いま改めて「INDEX MATCHを使わないほうがいい理由」を6つに整理してお届けします。
この記事の前提環境
- Microsoft 365 または Excel 2021 以降(XLOOKUP・FILTERが利用可能)
- Excel 2019以前を使っている場合、XLOOKUPは使えません1ので、引き続きINDEX MATCHが選択肢になります
対象読者
- INDEX MATCHを業務でよく使っている中級者
- 「XLOOKUPは知っているけど、慣れているINDEX MATCHを使い続けている」方
- Excelの検索関数を見直したい方
参考リンク
前提:そもそもINDEX MATCHとは何だったのか
本題に入る前に、INDEX MATCHが広く使われるようになった歴史的背景を整理しておきましょう。
INDEX MATCHは、もともとVLOOKUPの以下の弱点を回避するための「代替テクニック」として広まりました。
| VLOOKUPの弱点 | INDEX MATCHでの解決方法 |
|---|---|
| 検索列より左の値を取得できない | 任意の列を指定できる |
| 列を挿入すると数式が壊れる | 列番号を直接書かないので壊れにくい |
| 横方向の検索ができない(HLOOKUPが必要) | INDEX + MATCHで縦横両方対応 |
つまりINDEX MATCHは、「VLOOKUPの限界を超えるための、ちょっと玄人な書き方」だったわけです。
ところが2020年にXLOOKUPが登場し、これらの弱点はすべてXLOOKUP単体で解決できるようになりました。INDEX MATCHが担っていた役割の多くは、XLOOKUPに移譲できる時代になったのです。
それでは、具体的にINDEX MATCHを使わないほうがいい理由を見ていきましょう。
理由1:数式が長く、可読性が低い
最大の理由がこれです。INDEX MATCHは2つの関数をネストするため、数式が長くなります。
たとえば「商品コードから商品名を取得する」というシンプルな処理を比較してみましょう。
=INDEX(商品マスタ[商品名], MATCH(A2, 商品マスタ[商品コード], 0))
=XLOOKUP(A2, 商品マスタ[商品コード], 商品マスタ[商品名])
XLOOKUPのほうが圧倒的に短く、引数の意味も「検索値、検索範囲、戻り範囲」と直感的に並んでいます。
可読性の差は、自分で書く時よりも、他人の数式を読むときにはっきり現れます。チームでExcelファイルを共有する場面では、シンプルな関数のほうがメンテナンス性に優れているのは間違いありません。
理由2:引数の意味が直感的でない
INDEX関数の引数は、(範囲, 行番号, 列番号)という構造です。
=INDEX(範囲, 行番号, [列番号])
「行番号」「列番号」と言われても、初見では何の数字を入れればいいのか分かりませんよね。だからこそMATCHを組み合わせるわけですが、MATCH関数にも罠があります。
=MATCH(検索値, 検索範囲, [照合の種類])
問題は第3引数の 「照合の種類」 で、ここに 0 を指定しないと完全一致になりません。デフォルト(省略時)は 1(昇順並び替え済みデータでの近似一致)です。
MATCHの第3引数を省略してしまい、意図せず近似一致で動いてしまった事故は、Excel業務でよく見るバグの一つです。並び替えされていないデータに対して近似一致で検索すると、何の警告もなく間違った値が返ってきます。
一方、XLOOKUPはデフォルトが完全一致です。第5引数の match_mode を明示的に変えない限り、近似一致の事故は起きません。
=XLOOKUP(A2, 商品コード列, 商品名列)
「うっかり事故が起きにくい設計」になっているという点で、XLOOKUPは中級者にとっても安心感があります。
理由3:「見つからない場合」のエラー処理が冗長
INDEX MATCHで検索値が見つからなかった場合、結果は #N/A エラーになります。これをユーザーフレンドリーな表示に変えるには、IFERRORでラップする必要があります。
=IFERROR(INDEX(商品マスタ[商品名], MATCH(A2, 商品マスタ[商品コード], 0)), "該当なし")
XLOOKUPは第4引数で「見つからない場合の値」を直接指定できます。
=XLOOKUP(A2, 商品マスタ[商品コード], 商品マスタ[商品名], "該当なし")
IFERRORでラップする必要がないため、数式の入れ子が浅くなり、読みやすさが大幅に向上します。
- =IFERROR(INDEX(商品マスタ[商品名], MATCH(A2, 商品マスタ[商品コード], 0)), "該当なし")
+ =XLOOKUP(A2, 商品マスタ[商品コード], 商品マスタ[商品名], "該当なし")
理由4:複数条件検索が配列数式になり保守が難しい
「商品コードかつ店舗コードで検索したい」といった複数条件検索は、INDEX MATCHでも実現できますが、配列数式になります。
=INDEX(売上[金額], MATCH(1, (売上[商品コード]=A2)*(売上[店舗コード]=B2), 0))
(条件1)*(条件2) という掛け算でブール値の積を取り、それをMATCHで検索する……というロジックは、慣れていないとパッと読めません。Excel 2019以前の環境では Ctrl + Shift + Enter で確定する必要もあり、知らない人がうっかり編集すると壊れます。
複数条件検索が必要な場面では、FILTER関数を使うほうがはるかにシンプルです。
=FILTER(売上[金額], (売上[商品コード]=A2)*(売上[店舗コード]=B2))
FILTER関数は「条件に合うデータをすべて返す」関数なので、複数条件にも自然にマッチします。配列数式の特殊な確定操作も不要です。
XLOOKUPでも、検索範囲を & で結合することで複数条件検索は可能です。ただし、FILTERのほうが意図が明確で読みやすいケースが多いので、用途に応じて使い分けるとよいでしょう。
理由5:範囲全体を引数に取るためパフォーマンス・破損リスクが高い
INDEX MATCHは、INDEXに渡す範囲とMATCHに渡す範囲が別物であるという構造上の特徴があります。
=INDEX(商品マスタ[商品名], MATCH(A2, 商品マスタ[商品コード], 0))
^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^
戻り範囲 検索範囲
これが何を意味するかというと、2つの範囲の行数や開始位置がズレると、間違った値を返してもエラーが出ないということです。
たとえば、商品マスタの上に1行追加してしまい、片方の範囲だけ更新が漏れた場合、MATCHが返す行番号とINDEXの範囲がズレて、静かに間違った商品名が返ってきます。
INDEX MATCHは「壊れにくい」と言われがちですが、それは「列挿入で壊れにくい」という意味であって、「範囲のズレに強い」わけではありません。むしろ2つの範囲を別々に指定する分、ズレの危険性は高まります。
XLOOKUPは検索範囲と戻り範囲を引数として渡しますが、Excelは内部的に「同じ行数の配列同士をペアリングする」ことを前提としています。Excelテーブル(構造化参照)と組み合わせれば、列の追加や削除にも自動で追従するため、より安全に運用できます。
また、性能面でも A:A のような列全体指定をINDEX MATCHで多用すると、再計算負荷が高くなる傾向があります。テーブル参照で必要範囲だけを指定する習慣をつけたほうが、ファイル全体が軽くなります。
理由6:スピルとの相性で恩恵を受けにくい
Microsoft 365 / Excel 2021では、スピルという機能で「1つの数式が複数のセルに自動で結果を展開する」ことができるようになりました。
XLOOKUPは戻り範囲に複数列を指定することで、検索結果を横方向に一気に展開できます。
=XLOOKUP(A2, 商品マスタ[商品コード], 商品マスタ[[商品名]:[単価]])
この1行で、商品名と単価を隣り合うセルに同時に取得できます。INDEX MATCHで同じことをやろうとすると、列ごとに数式を書くか、配列を意識した複雑な書き方をする必要があります。
スピルを前提とした「現代Excel」の書き方では、XLOOKUPやFILTERのほうが圧倒的に表現力が高いんですね。
それでもINDEX MATCHが現役のケース(例外として)
ここまで散々INDEX MATCHのデメリットを並べてきましたが、完全に不要というわけではありません。以下のようなケースでは、INDEX MATCHがまだ有効な選択肢になります。
ケース1:Excel 2019以前のレガシー環境
XLOOKUPは Microsoft 365 と Excel 2021 以降でのみ使えます。Excel 2019やExcel 2016を使っているユーザーとファイルを共有する場合、XLOOKUPは #NAME? エラーになります。共有相手の環境に合わせざるを得ない場合は、INDEX MATCHが現実解です。
ケース2:行と列の交差点をピンポイントで取得したい
「行に商品名、列に月を並べたクロス集計表から、特定の商品×月の値を取得したい」というケースでは、INDEX関数の (範囲, 行番号, 列番号) という構造が活きます。
=INDEX(クロス集計表, MATCH("商品A", 商品列, 0), MATCH("4月", 月行, 0))
XLOOKUPでも実現は可能ですが、XLOOKUPをネストする必要があり、INDEX MATCHのほうが直感的なケースがあります。
ケース3:返す列を動的に指定したい一部のケース
検索結果として返す列を、別のセルの値によって動的に切り替えたい場合も、INDEX MATCHの構造が役立つことがあります。
これらの「例外ケース」は、通常はXLOOKUPやFILTERで十分、特殊なときだけINDEX MATCHという優先順位で捉えるのがおすすめです。「まずINDEX MATCH」という選択は、もはや適切とは言えません。
まとめ
INDEX MATCHを使わないほうがいい理由を改めて整理すると、以下の通りです。
- 数式が長く、可読性が低い
- 引数の意味が直感的でなく、近似一致の事故が起きやすい
- エラー処理(見つからない場合)が冗長になる
- 複数条件検索が配列数式になり保守が難しい
- 範囲のズレによる静かな誤動作リスクがある
- スピルとの相性が悪く、現代Excelの恩恵を受けにくい
「INDEX MATCHが書ける=Excel中級者の証」というのは、XLOOKUPがなかった時代の話。Microsoft 365 / Excel 2021以降の環境では、第一選択はXLOOKUP(または用途に応じてFILTER)、行列交差点検索などの一部のケースだけINDEX MATCH、という使い分けが現代的なベストプラクティスです。
慣れた書き方を変えるのは少し勇気が要りますが、一度XLOOKUPに移行すると、数式の短さと安全さに驚くはずです。明日からの業務で、ぜひ書き換えを試してみてください。
-
XLOOKUPは2020年3月にMicrosoft 365の月次チャネルで一般提供が開始され、Excel 2021にも搭載されました。Excel 2019およびそれ以前のバージョンには搭載されていません(Microsoft公式ドキュメント)。 ↩