くまおやぢの雑記帳

人生は、やろうと思った瞬間がスタートライン。Excel・Access・ガジェット・スマホ関係のネタを綴っています。あなたの「できる」を応援します。

INDEX・MATCH関数の使い方と応用:VLOOKUPを超える柔軟な検索術

 

 

 

01.はじめに

Excelでデータを検索・参照する関数としてはVLOOKUP関数が広く知られています。しかし、VLOOKUPにはいくつかの制約があり、「使いにくい」「遅い」といった声もあります。

例えば、検索キー(基準となる値)が参照したいデータより左側にないと機能しないため、データのレイアウトによっては使い勝手が悪くなります。

また、多用すると処理が重くなり、大量データではパフォーマンスの問題が生じることもあります。

こうした問題を解決する方法として注目されるのが、INDEX関数とMATCH関数の組み合わせです。INDEX+MATCHはVLOOKUPの弱点を補完し、より柔軟な検索を可能にする強力な手法です。

実際、「INDEXとMATCHの組み合わせ数式はVLOOKUPの完全上位互換になる」と評する意見もあるほどで、習得難易度も大きく変わらないため積極的に活用すべきだとされています。

本記事では、Excel初級〜中級者の方を対象に、INDEX関数・MATCH関数の基本から応用までを解説し、VLOOKUPでは難しかった柔軟な検索術を身につけるお手伝いをします。

02.INDEX関数とMATCH関数の基本構文と使い方

まずはそれぞれの関数の役割と基本的な使い方を確認しましょう。

INDEX関数とは:指定した範囲の中で「行番号」と「列番号」が交差する位置にある値を返す関数です。基本構文は次の通りです。

=INDEX(範囲, 行番号, [列番号])
  • 範囲:検索対象となるセル範囲(行列方向にデータが含まれた範囲)
  • 行番号:範囲内の何行目の値を取ってくるか指定
  • 列番号:範囲内の何列目の値を取ってくるか指定(範囲が1列のみの場合、省略可能)

例えば、セル範囲に対して=INDEX(B2:D5, 3, 2)と指定すると、「B2:D5の中で3行目・2列目に位置するデータ」を取得します。

MATCH関数とは:指定した値が範囲内で何番目に位置するか(行番号または列番号)を返す関数です。基本構文は次の通りです。

=MATCH(検索値, 検査範囲, [照合の種類])
  • 検索値:探したい値(文字列や数値)
  • 検査範囲:検索する範囲(一列もしくは一行に絞る必要があります)
  • 照合の種類:一致条件を指定(0=完全一致、1=以下最大値を検索、-1=以上最小値を検索)

通常は完全一致を求める0を指定するのが安全策です。例えば、=MATCH("ぶどう", C2:C5, 0)とすると、範囲内で「ぶどう」が何番目(何行目)にあるかを返します。

(※MATCH関数では、縦の範囲を指定する場合は列方向だけ、横の行を探す場合は行方向だけを指定する必要があります。複数行×複数列の範囲を指定するとエラーになりますので注意してください。)

INDEXとMATCHの組み合わせ:この2つを組み合わせることで、「まずMATCHで値の位置(行番号や列番号)を見つけ、その結果をINDEXに渡して該当する値を取り出す」という処理が可能になります。基本形は次のようになります。

=INDEX(取り出したい列範囲, MATCH(検索値, 検索する列範囲, 0))

上記の例では、MATCH(検索値, 検索する列範囲, 0)が指定範囲内で検索値が見つかった行番号を返し、その行に対応する取り出したい列範囲の値をINDEXが返すという流れです。たとえば、下図のように「A列に商品名、B列に在庫数」がある表から特定の商品名の在庫を取り出す場合、次のような数式になります。

=INDEX(B2:B6, MATCH("商品C", A2:A6, 0))

この数式は、MATCH("商品C", A2:A6, 0)でA2:A6の中から「商品C」が見つかった行番号を取得し、INDEX(B2:B6, ○行目)でB列(在庫数)の対応する行の値を取得します。

これにより、「商品Cの在庫数」を自動的に引き出すことができます。VLOOKUPと異なり、検索列(商品名の列)が表の左端になくても機能する点に注目してください。

 

 

 

03.VLOOKUP関数との違いと制限

次に、従来から使われているVLOOKUP関数とINDEX+MATCHの違いを見ていきましょう。最大の違いは「検索できる範囲や方向の柔軟性」にあります。

検索方向と範囲の柔軟性

VLOOKUP関数は指定した範囲の一番左端の列で検索を行い、右方向に指定列数だけ進んだ列から値を返すという動作をします。そのため、検索キーとなる列は必ず表の左側になければなりません。

例えば、キーが表の右端にあるような場合、VLOOKUPでは目的の値を直接取り出すことができず、範囲を組み替えるか関数を入れ替える必要がありました。これに対し、INDEX+MATCHの組み合わせでは「検索する列」と「取り出す列」を独立して指定できるため、キー列がどの位置にあっても必要なデータを参照できます。

言い換えれば、表の左から右にしか検索できないVLOOKUPに対して、INDEX+MATCHは表のどの列からでも検索を開始できるという柔軟性があります。

列挿入・削除への強さ

また、VLOOKUPでは「列インデックス番号」を明示的に指定する必要があります(例:=VLOOKUP(キー, 範囲, 3, FALSE)の「3」が、キーから数えて3列目を返す指定)。この列番号指定は、元の表に列を挿入・削除した際にズレてしまい、正しい値を返さなくなるリスクがあります。

実務では、後から列の追加が発生したり項目順が変わったりすることも多いですが、そのたびに数式中の列番号を修正するのは手間です。

INDEX+MATCHであれば、あらかじめ抽出対象の列そのものを範囲指定しているため列番号の指定が不要で、列の追加・順番変更によって数式が狂う心配が少なく、メンテナンスが容易です

複雑な条件への対応

さらにVLOOKUPは基本的に単一のキーでしか検索できず、「複数の条件に合致するデータを探す」ことが困難です。条件を増やそうとすると、ヘルパー列を使ってキーを結合するか、他の関数と組み合わせる必要がありました。

一方、INDEX+MATCHは後述する工夫により複数条件での検索も比較的柔軟に実現できます(詳細は「4. INDEX・MATCHの代表的な応用パターン」で解説)。

処理速度と負荷

機能面だけでなくパフォーマンス面でも違いがあります。一般的に、INDEX+MATCHの方が大量データに対して高速になる場合があると言われています。

VLOOKUPは検索値を見つけるために指定範囲内のすべての列をスキャンしますが、INDEX+MATCHでは必要な列だけを個別に指定できるため効率的に検索できるためです。特に何万件ものデータを扱う場合や、複数の値を一度に参照するようなケースでは、この速度差が顕著になることがあります。

実際、VLOOKUPを多用したファイルが極端に重くなるケースも報告されています。そのため、パフォーマンス重視の場面でもINDEX+MATCHが有利と言えるでしょう。

以上のように、VLOOKUP関数には便利な反面いくつかの制約があり、それを補う形でINDEX+MATCH関数の組み合わせが優れた柔軟性を発揮します。

ただし、INDEX+MATCHはメリットばかりではなく、式が長く複雑になりがちというデメリットもあります。次章以降では、この組み合わせを実際にどのように活用するか、具体的なパターンや注意点を交えて説明していきます。

04.INDEX・MATCHの代表的な応用パターン(列の順番変更への対応・複数条件検索・動的範囲)

ここからは、INDEX+MATCH関数を使った少し発展的な活用テクニックを紹介します。代表的なパターンとして、「列の順番変更に強い検索」「複数条件に基づく検索」「動的な範囲の指定」の3つを順に見ていきます。

列の追加・順序変更に強い検索

このパターンは、前章でも触れた「列番号指定が不要」な利点を最大限に活かす方法です。例えば、部署別の社員一覧から社員コードをキーに社員名を引いてくる場面を考えます。通常のVLOOKUPでは社員コード列が一番左にないといけませんが、INDEX+MATCHであれば社員コード列が表の右端にあっても問題ありません。以下のように、抽出したい「社員名」の列と、検索に使う「社員コード」の列をそれぞれ直接指定してMATCH→INDEXとつなげるだけです。

=INDEX(社員名の列範囲, MATCH(検索したい社員コード, 社員コードの列範囲, 0))

このようにしておけば、途中で列の並び替えや新規列の追加があっても、参照範囲さえ適切に指定しなおせば式の修正は最小限で済みます(多くの場合、Excelが列挿入に追随して参照範囲を自動調整してくれます)。VLOOKUPのように「何列目か」をハードコーディングしていないため、レイアウト変更に強いのが特徴です:contentReference[oaicite:23]{index=23}。

複数条件に基づく検索

INDEX+MATCHを使うことで、複数の条件を同時に満たすデータを検索することも可能です。例えば、商品マスタから「店舗=A店」かつ「品目=みかん」に合致する価格を探したいケースを考えてみましょう。

単純なVLOOKUPでは対応できませんが、INDEX+MATCHなら次のような式で実現できます。

=INDEX(価格の列範囲, MATCH(店舗&品目, 店舗列&品目列, 0))

実際のセル参照に置き換えると、例えば店舗名がF3セル、品目名がG3セルに入力されている場合、価格一覧から該当する値段を引く式は=INDEX(D:D, MATCH(F3&G3, B:B&C:C, 0))となります。

この数式では、MATCH(F3&G3, B:B&C:C, 0)が「B列の店名とC列の品名を結合した仮想的な検索列」の中から「F3の値とG3の値を結合した文字列」を探し、その行番号を返しています。

そしてINDEX関数がD列(価格)のその行にある値を取り出す仕組みです。ポイントは、MATCH関数の検索範囲で複数の列を&で連結することで複数条件を一つのキーに見立てている点です。

この方法を使えば、2つ以上の条件をANDで結合して一致するレコードを探せます。例えば上記の式は「店舗がA店でなおかつ品目がみかん」という両方の条件を満たす最初の行を見つけ、その価格を返しています。

なお、INDEX+MATCHでは標準では一致する最初の1件しか抽出できません(複数該当がある場合は最初のもの)。複数ヒットする全ての値を取り出したい場合は、配列数式やFILTER関数(Excelのバージョンによる)などより高度な手法が必要になります。

動的な範囲の指定

INDEX+MATCHを活用すると、データの増減に応じて柔軟に範囲を指定することも可能です。これは「動的範囲」と呼ばれるテクニックで、データが追加・削除されても数式を修正せずに対応できるメリットがあります。

一つの方法は、Excelのテーブル機能名前付き範囲と組み合わせるやり方です。データ範囲をテーブル化しておけば、新しい行を追加してもテーブル名で指定した範囲が自動的に拡張されます。その結果、INDEXやMATCHで参照している範囲も自動で広がり、常に最新のデータをカバーします。

別の方法として、OFFSET関数やINDEX関数そのものを利用した動的範囲指定もあります。例えば、A列に連続したデータが入る場合にその末尾までを範囲とするには、=OFFSET(A1, 0, 0, COUNTA(A:A), 1)のような式で「データの個数分だけ高さを持つ範囲」を作り出せます。

これを名前付き範囲「データ一覧」などに登録しておけば、=INDEX(データ一覧, MATCH(X, データ一覧, 0))のように常に追加分まで含めた範囲でMATCH検索が可能です。

OFFSETを使わずにINDEX関数で動的範囲を作るテクニックもあります。一例として、A列の最終データ行を取得するには=INDEX(A:A, COUNTA(A:A))とする方法です。

これは「A列全体から、データ件数番目の値(=最終データ)を指すINDEX」という考え方で、他の関数と組み合わせて柔軟な範囲指定に応用できます。

いずれの方法にしても、動的範囲を用いることでデータ量の変化に対応したシート設計が可能になり、メンテナンスの手間を減らすことができます。

05.よくあるエラーと対処法

INDEX+MATCHを初めて使う際に戸惑いやすいエラーや問題と、その対処法をまとめます。

#N/A エラー(値が見つからない)

検索値に一致するデータが見つからない場合に発生します。スペルミスや全角半角の違い、余分な空白文字などが原因であることが多いです。対策として、まず検索値とデータが正しく一致しているか確認しましょう。それでも解消しない場合、存在しない値を検索している可能性があります。必要に応じてIFERROR関数でエラー時に空白やメッセージを表示するようにすると、見つからなかった場合でも分かりやすくなります:contentReference[oaicite:29]{index=29}。

#REF! エラー(無効な参照)

INDEX関数で指定した行番号・列番号が範囲のサイズを超えている場合などに発生します。例えば、MATCHの結果得られた数値がINDEXの範囲行数を超えていると#REF!になります。このエラーが出た場合、INDEX関数の範囲とMATCH関数の検索範囲がズレていないか確認してください。基本的にINDEXの参照範囲とMATCHの検索範囲は開始行・終了行を揃えておく(同じサイズの範囲を指定する)必要があります。

#VALUE! エラー

MATCH関数の検索範囲に複数行×複数列を指定した場合など、不正な入力に対して発生します。「照合の種類」に0を指定しているのにデータが昇順ソートされていない状態で1や-1を指定した場合なども誤った結果やエラーの原因となります。

MATCH関数は基本的に単一の行または列を指定し、0(完全一致)を指定するのが無難です。こうしたエラーを防ぐには、まず参照範囲や指定が正しいか丁寧に確認することが重要です。また、IFERROR(数式, エラー時の値)でエラー発生時の動作をフォローしたり、検査値や範囲に入力ミスがないかデータを整理することも有効です。

慣れてくるとエラーの原因特定もスムーズになりますので、一つひとつ対処法を覚えていきましょう。

 

 

 

06.実務での活用シーン(照合・マスタ参照など)

INDEX+MATCH関数の組み合わせは、その柔軟性から実務の様々なシーンで役立ちます。以下にいくつか典型的な活用例を紹介します。

マスタデータ参照

社員名簿や商品マスタなど、基準表から情報を引っ張ってくる用途で活躍します。例えば、売上明細に商品コードだけがある場合に、別シートのマスタから商品名や単価を自動で引き当てるといったことが容易にできます。

手作業でコピペする代わりに、商品コードをキーに=INDEX(マスタの単価列, MATCH(商品コード, マスタのコード列, 0))といった式を用いるだけで、常に最新のマスタ情報を参照できます。

これにより、マスタを更新すれば関連する全シートの情報も自動更新され、入力ミス防止と作業時間短縮に繋がります。

データ照合・突合

二つのリストの付き合わせにも利用できます。一方のリストに存在するが他方に存在しないデータを洗い出す場合、MATCH関数で相互に検索をかけて#N/Aになるものをチェックするといったアプローチが考えられます。

例えば、前年と今年の顧客リストを比較し、今年新たに追加された顧客を見つけたい場合、前年リストに対して今年の顧客IDをMATCHで探し、エラーになるものが「新規顧客」と判断できます。

このように、INDEX+MATCHは検索値の有無確認にも使えるので、データ突合の効率化に役立ちます。

条件に合うデータの抽出

前述の複数条件検索の例のように、特定の条件を満たすレコードから値を取り出すのにも便利です。フィルターを使えば手動でもできますが、関数で設定しておけば条件を変えるだけで自動的に結果が切り替わります。

例えば、部署名と役職を指定すると該当する社員の名前一覧が取得できるようなシートを作れば、人事情報の検索がワンクリックで済むようになるでしょう。

(※この場合はINDEX+MATCHに加えてFILTERやSUMIFS関数など他の関数も組み合わせる応用になります)

他シート・他ブックからの参照

INDEX+MATCHは参照範囲さえ指定できれば他のシートやブックにも適用できます。例えば、毎月別シートに分かれている売上データから指定月の値だけを引っ張ってくる、といったことも可能です。

INDIRECT関数と組み合わせれば、ユーザが入力したシート名をもとに動的に参照先を切り替えることもできます。これにより、複数シートに分散したデータの統合参照や、ブック間リンクの自動化が図れます。

このように、INDEX+MATCHの組み合わせは単なる値検索に留まらず、実務の様々な「照合」「参照」作業を自動化・効率化するキーとなります。日常的に行っている手作業の照合処理を一度関数で構築してしまえば、次回からはデータを更新するだけで結果が自動反映されるため、大幅な時間短縮が期待できます。

07.関数の組み合わせによる時短・自動化

さらに応用編として、INDEX+MATCHを他の関数と組み合わせることで得られる時短テクニックを紹介します。ここでは、知っておくと便利な組み合わせパターンをいくつか挙げます。

IFERROR関数との組み合わせ

前述のエラー処理でも触れましたが、IFERROR(○○, "代替値")を活用することで、検索結果が見つからなかった場合でもスムーズに次の処理に移れます。

例えば=IFERROR(INDEX(..., MATCH(...)), "該当なし")とすれば、#N/Aエラーの代わりに「該当なし」など任意のメッセージを表示できます。報告書作成などでエラー表示を出したくない場合に重宝します。

MATCH結果の再利用

同じ検索を複数回行う場合、MATCHの結果を一度計算してそれを再利用することで計算負荷を減らすことができます。例えば、一つのキーに対して名前・住所・電話番号と3つの項目を取り出したいなら、通常VLOOKUPでは3回検索を行いますが、INDEX+MATCHであればまずMATCHで行番号を求め、それを3つのINDEXで共通利用するという方法が取れます。

実装方法はいくつかありますが、MATCH部分を別のセルに計算させておき=INDEX(名前列, $Z$1), =INDEX(住所列, $Z$1)のように参照するか、あるいは最新のExcelであれば=LET(row, MATCH(...), INDEX(名前列, row))のように一時変数としてMATCH結果を利用することもできます。これにより無駄な重複計算を避け、全体の処理を軽量化できます。

他関数との組み合わせ

INDEX+MATCHは単体でも強力ですが、他の関数と組み合わせることでさらに自動化の幅が広がります。例えば、MATCHで見つけた行番号をOFFSET関数に渡して動的にセル範囲を取得したり、SMALL/LARGE関数と組み合わせて上位N件の値を抽出したりすることも可能です。

また、Excel 365以降で利用できるXLOOKUP関数は、実はINDEX+MATCHの組み合わせを1つの関数で実現したようなものです。XLOOKUPを使えば左右どちら方向への検索も複数範囲からの検索も簡潔に書けますが、旧バージョンを使っている場合や他関数との連携を工夫したい場合には、INDEX+MATCHの知識が役に立ちます。

このように、INDEX+MATCHを核に据えつつIFERRORやLET関数、さらには他の検索系関数と組み合わせることで、Excelでのデータ参照作業は格段に効率化・自動化できます。

単純な検索だけで満足せず、「この処理はもっと一発でできないか?」と考えながら組み合わせ技を習得していくと、日々の業務スピードが飛躍的に向上するでしょう。

08.まとめ(復習と導入のすすめ)

最後に、本記事の内容を簡単に振り返りましょう。INDEX関数とMATCH関数を組み合わせることで、Excelにおける検索・参照の柔軟性が飛躍的に高まることを見てきました。

  • INDEX関数は指定した行列から値を取り出す関数、MATCH関数は指定した範囲内で値の位置を探す関数。それぞれの基本構文と使い方を押さえました。
  • VLOOKUP関数との違いとして、INDEX+MATCHは検索列が左端に無くても使え、列番号指定が不要なため表構造の変更にも強いこと、そして場合によっては処理速度が速いことを学びました。
  • 応用編では、列の順序変更に強い検索の設定方法、&演算子を使った複数条件検索、OFFSET等を利用した動的な範囲指定など、実務で役立つテクニックを紹介しました。
  • 運用上ありがちなエラー(#N/Aや#REF!など)の原因と対処法も確認し、IFERROR関数によるエラーハンドリングの重要性に触れました。
  • 実務シーンではマスタ参照やデータ突合など様々な場面でINDEX+MATCHが活躍しうること、さらに他関数と組み合わせることで一層の効率化が可能になる点も述べました。

VLOOKUP関数は確かに便利な関数ですが、本記事で解説したようにINDEX+MATCH関数の組み合わせはそれを上回る柔軟性と応用力を持っています。

最初は少し複雑に感じるかもしれませんが、慣れてしまえば手放せない強力な武器となるでしょう。

ぜひこの機会にINDEX+MATCH関数を自分のExcel業務に取り入れてみてください。業務効率化の切り札として、大いに活躍してくれるはずです。