【Excel】INDEX関数とMATCH関数の組み合わせで柔軟なデータ検索

この記事は約6分で読めます。

今回は、ExcelのINDEX関数とMATCH関数を組み合わせて、VLOOKUP関数では対応できない複雑なデータ検索を実現する方法について紹介します。

INDEX関数とMATCH関数の基本

Excelでのデータ検索といえばVLOOKUP関数が定番ですが、「検索値より左側にあるデータは抽出できない」「列を挿入・削除すると数式が壊れる」といった弱点を持っています。
これらの弱点を完全に克服し、より柔軟で壊れにくい検索の仕組みを作ることができるのが、INDEX関数とMATCH関数の組み合わせ(インデックス・マッチ)です。
それぞれ単体では単純な機能しか持ちませんが、2つを掛け合わせることで、縦横無尽に表の中を検索できる非常に強力なツールとなります。

INDEX関数とは

INDEX関数は、「指定した範囲の中で、上から〇行目、左から〇列目にあるセルの値を返す」関数です。
構文:=INDEX(配列, 行番号, [列番号])
例えば、=INDEX(A1:C10, 3, 2)
と入力すると、「A1からC10の表の中で、上から3行目、左から2列目(つまりB3セル)」の値を取り出してくれます。
「位置(座標)」を教えてあげれば、その場所にある「データ」を持ってくるのがINDEX関数の役割です。

MATCH関数とは

MATCH関数は、INDEX関数とは逆で、「指定した値が、範囲の中で上から(または左から)何番目にあるかを返す」関数です。
構文:=MATCH(検査値, 検査範囲, [照合の型])
例えば、A列に社員番号が並んでいる中で、「1005」という社員番号を探したい場合、=MATCH(1005, A1:A10, 0)
と入力すると、「1005は上から5番目にありますよ」と「5」という数値を返してくれます。(最後の「0」は完全一致を意味します)
「データ」を教えてあげれば、その「位置(何番目か)」を教えてくれるのがMATCH関数の役割です。

INDEX関数とMATCH関数を組み合わせる仕組み

この2つの関数の特性を理解すると、なぜ組み合わせることで検索ができるのかが見えてきます。
VLOOKUP関数は「社員番号1005の人の、氏名を教えて」という一つの命令で動きます。
インデックス・マッチでは、これを2つのステップに分解します。
ステップ1(MATCH関数):「社員番号1005は、名簿の上から何行目にいる?」→「5行目です」
ステップ2(INDEX関数):「じゃあ、氏名の列の、上から5行目にあるデータを持ってきて」→「山田太郎です」
数式にすると以下のようになります。
=INDEX(氏名の列, MATCH(探したい社員番号, 社員番号の列, 0))
INDEX関数の「行番号」を指定する部分に、そっくりそのままMATCH関数の数式をはめ込んでいるのがポイントです。

INDEX関数とMATCH関数を組み合わせる手順

実際に、「商品コード(G2セル)」から「商品名」を検索する数式を作る手順を解説します。
データ元の表は、A列に商品コード、B列に商品名、C列に単価が入力されているとします。

数式の組み立て方

抽出したい結果を表示させるセル(例:H2)を選択します。
1. まず、最終的に欲しいデータは「商品名」なので、「=INDEX(」と入力し、商品名が入力されているB列全体(B:B)を選択します。カンマを打ちます。
 ここまでの数式:=INDEX(B:B,
2. 次に、何行目の商品名が欲しいのかをMATCH関数に探させます。「MATCH(」と入力し、検索値となるG2セルをクリックし、カンマを打ちます。
 ここまでの数式:=INDEX(B:B, MATCH(G2,
3. G2セルの商品コードをどこから探すかを指定します。データ元の表の商品コードが入力されているA列全体(A:A)を選択し、カンマを打ちます。
 ここまでの数式:=INDEX(B:B, MATCH(G2, A:A,
4. 最後に、完全一致で探すための「0」を入力し、MATCH関数のカッコ「)」と、INDEX関数のカッコ「)」を閉じてEnterキーを押します。
 完成した数式:=INDEX(B:B, MATCH(G2, A:A, 0))

VLOOKUP関数に対する3つの大きなメリット

インデックス・マッチの数式は少し長く見えますが、これを使うことで得られる実務上のメリットは計り知れません。

検索値の左側にあるデータを抽出できる

VLOOKUP関数は「検索値がある列の一番左側」から右方向へしかデータを抽出できません。
もし表のC列に「商品コード」、A列に「商品名」がある場合、VLOOKUPでは商品コードから商品名を探すことができず、表のレイアウトをいじって商品コードを一番左のA列に移動させる必要がありました。
インデックス・マッチなら、=INDEX(A:A, MATCH(G2, C:C, 0))
のように、「どこから探すか(C:C)」と「どこから抽出するか(A:A)」を完全に独立して指定できるため、表のレイアウトを一切変更せずに左側のデータを引っ張ってくることができます。

列の挿入や削除で数式が壊れない

VLOOKUP関数で「左から3列目」というように列番号を数値(3)で指定していると、表の途中に新しい列を挿入した場合、欲しいデータが「4列目」にずれてしまい、間違ったデータが表示されるという致命的なエラーが起きます。
インデックス・マッチでは、列番号を数値で指定するのではなく、「氏名の列(B:B)」のように列そのものを指定しているため、途中に列が挿入されてB列がC列に移動しても、Excelが自動的に数式を=INDEX(C:C,
…)に修正してくれ、計算結果が崩れません。
頻繁にフォーマットが変わる資料において、非常に安全で堅牢な数式と言えます。

処理速度が速くファイルが重くならない

VLOOKUP関数は、指定した範囲全体(例えばA列からZ列まで)を一度Excelのメモリに読み込んでから検索するため、何万行もあるデータを何千件も検索させると、計算処理に非常に時間がかかり、ファイルがフリーズする原因になります。
インデックス・マッチは、検索する列(A列)と抽出する列(Z列)の「2つの列」だけをピンポイントで読み込むため、不要なデータをメモリに抱え込まず、処理速度がVLOOKUP関数に比べて圧倒的に速くなります。
大規模なデータ分析や集計を行う現場では、この処理速度の差が作業効率に直結します。

まとめ

ExcelのINDEX関数とMATCH関数を組み合わせて、柔軟で強力なデータ検索を行う方法について解説しました。
「=INDEX(抽出したい列, MATCH(検索値, 検索する列,
0))」という基本の形を覚えてしまえば、VLOOKUP関数の弱点であった「左側の検索ができない」「列の挿入で壊れる」「処理が重い」といった問題をすべて解決できます。
最初は2つの関数がネスト(入れ子)になっていることに抵抗を感じるかもしれませんが、ステップごとに分解して「位置を探す」「データを持ってくる」という役割を理解すれば、決して難しくありません。
近年登場したXLOOKUP関数も同じ強みを持っていますが、古いバージョンのExcelを使っている環境や、誰に共有しても確実に動く数式を作りたい場面では、このインデックス・マッチの組み合わせは依然として最強の検索テクニックです。
データ構造をクリーンに保ち、エラーに強い実務レベルのExcelシートを作成するために、ぜひ習得してみてはいかがでしょうか。