M365Con 2027 – 無料オンラインカンファレンス · 11–22 Jan 2027 · 120 sessions→ m365con.net

ブログ · Mirko Peters

Excel の INDEX MATCH: 数式、例、よくあるエラー

By ·

Excel の INDEX MATCH を解説します。数式、各関数の仕組み、左方向と二元の検索、複数条件、よくあるエラーを取り上げ、VLOOKUP との比較も紹介します。

Automatically translated with AI from the original post. Read the English original

Excel の INDEX MATCH は、2 つの関数から組み立てる検索用の数式です。=INDEX(return_range, MATCH(lookup_value, lookup_range, 0))。MATCH はリストの中で値がある位置を求め、INDEX は別のリストの同じ位置にある項目を返します。この記事は、VLOOKUP 数式の限界に突き当たっている Excel ユーザーや、INDEX MATCH を多用するブックを引き継いで仕組みを理解したい方を対象としています。各関数を個別に確認し、組み合わせ方、左方向の検索、二元の検索、2 つの条件の使い方、そしてエラーの意味を解説します。

重要なポイント

  • INDEX MATCH は、1 つの数式に 2 つの関数を組み合わせたものです。=INDEX(return_range, MATCH(lookup_value, lookup_range, 0))。MATCH が位置を求め、INDEX がその位置の項目を返します。
  • 完全一致にするには、MATCH の 3 番目の引数に 0 を指定します。既定値の 1 のままにすると、MATCH はデータが昇順に並んでいると見なします。
  • 検索範囲と戻り値の範囲を別々に指定できるため、INDEX MATCH は検索列の左側を検索できます。VLOOKUP ではこれはできません。
  • 2 つの条件を指定する場合は、ヘルパー列で列を結合するか、MATCH の内部で 2 つの比較を掛け合わせる数式を使います。
  • 数式を IFNA で囲むと、#N/A はメッセージに置き換えられ、その他のエラーは引き続き表示されます。これにより、実際のミスを隠さずに済みます。

INDEX MATCH は、XLOOKUP が登場するずっと前からすべてのバージョンの Excel で使えたため、古いブックに数多く残っています。今でも使えることが、これを学ぶ主な理由です。以下の詳細は、Microsoft の MATCH、INDEX および VLOOKUP のページに基づいています。

INDEX の役割

INDEX は、範囲内の位置から値を返します。Microsoft のページでは、配列形式を INDEX(array, row_num, [column_num]) と示しています。

  • array は、値を取り出す範囲です。
  • row_num は、その範囲内の行です。
  • column_num は、その範囲内の列です。範囲が 1 列だけの場合は省略できます。

番号は、シート全体ではなく範囲の左上のセルから数えます。Microsoft の例では、1 列目に Apples と Bananas、2 列目に Lemons と Pears が入ったブロックを使っています。=INDEX(A2:B3,2,2) は Pears を返し、=INDEX(A2:B3,2,1) は Bananas を返します。

同じページから覚えておきたい点が 2 つあります。row_num または column_num が範囲外を指している場合、INDEX は #REF! エラーを返します。また、row_num または column_num に 0 を指定すると、INDEX は列全体または行全体を返します。現在の Microsoft 365 では通常どおり Enter キーを押します。古いバージョンでは、Ctrl+Shift+Enter で配列数式として入力します。

INDEX だけでは、位置が既にわかっている必要があります。そこで MATCH の出番です。

MATCH の役割

MATCH は範囲を検索し、位置を返します。Microsoft の構文は MATCH(lookup_value, lookup_array, [match_type]) です。項目そのものは返さず、範囲内での相対的な位置だけを返します。

3 番目の引数によって、一致の方法が決まります:

  • 0 は、最初の完全一致を検索します。検索範囲は昇順・降順のどちらでも構いません。通常はこの方法を最もよく使うことになります。
  • 1 は、引数を省略した場合の既定値でもあり、検索値以下の最大値を検索します。検索範囲は昇順に並べておく必要があります。
  • -1 は、検索値以上の最小値を検索します。検索範囲は降順に並べておく必要があります。

Microsoft の例では、B2:B5 に値 25、38、40、41 が入っています。=MATCH(39,B2:B5,1) は、次に小さい値 38 の位置である 2 を返します。=MATCH(41,B2:B5,0) は 4 を返します。そして =MATCH(40,B2:B5,-1) は #N/A を返します。これらの値は降順に並んでいないためです。

ページに記載されているその他の動作についても触れておきます。文字列の一致では大文字と小文字は区別されないため、"apple" と "APPLE" は同じものとして扱われます。一致の種類が 0 で検索値が文字列の場合、? は任意の 1 文字に、* は任意の文字列にそれぞれ一致します。また、これらの文字の前にチルダ (~) を付けると、その文字そのものを検索します。MATCH が何も見つけられなかった場合は、#N/A を返します。

既定値の 1 は、つまずきやすいポイントです。第 3 引数を省略すると、MATCH はデータが並べ替え済みであると黙って想定し、エラーを出さずに誤った位置を返すことがあります。ID、名前、コードなどを検索するほとんどの場合は、必ず 0 を入力してください。

組み合わせて使う

パターンは常に同じです。MATCH を INDEX の中に入れ、行番号を指定します。

=INDEX(return_range, MATCH(lookup_value, lookup_range, 0))

A2:A100 に従業員 ID、B2:B100 に氏名、C2:C100 に部署が入っているシートを例にします。F2 に ID を入力して、部署を取得したいとします。

  1. 結果を表示するセル(たとえば G2)をクリックします。
  2. =INDEX(C2:C100, と入力し、回答の取得元を指定します。
  3. MATCH(F2,A2:A100,0)) を追加し、ID の検索場所を指定します。
  4. Enter キーを押します。

完成した数式は =INDEX(C2:C100,MATCH(F2,A2:A100,0)) です。MATCH は A2:A100 から F2 を見つけ、たとえば 14 という位置を返します。INDEX はその後、C2:C100 の 14 番目の項目を返します。

範囲は同じ長さで、同じ開始行にそろえてください。MATCH が A2:A100 を検索している一方で INDEX が C3:C101 を参照すると、位置は誤った行を指してしまい、結果が黙って間違います。両方の範囲で開始行と終了行をそろえ、数式を下にコピーする予定がある場合は、$A$2:$A$100 のように絶対参照(ドル記号)で固定してください。

左方向の検索と VLOOKUP との違い

Microsoft の VLOOKUP のページでは、構文は VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup]) と示されています。検索値は範囲の先頭列になければならず、range_lookup を省略すると、並べ替え済みのデータを前提とした近似一致になると説明されています。また、同ページでは XLOOKUP の利用も勧められています。

同じ処理を両方の方法で示します。A 列に ID、B 列に氏名が入っている場合です。

  • =VLOOKUP(F2,A2:B100,2,FALSE)
  • =INDEX(B2:B100,MATCH(F2,A2:A100,0))

INDEX MATCH には 2 つの実用的な利点があります。1 つ目は、左方向に検索できることです。氏名が B 列にあり、A 列の ID を取得したい場合は、範囲を入れ替えるだけです。=INDEX(A2:A100,MATCH(F2,B2:B100,0)) となります。VLOOKUP ではこれはできません。検索値を範囲の先頭列に置く必要があるためです。2 つ目は、戻り値の列を数えるのではなく、直接指定できることです。VLOOKUP では、数式内の 2 は「範囲の 2 番目の列」を意味します。範囲内に列を挿入すると、この数値は別の列を指すようになります。INDEX MATCH では、参照は他の参照と同様に自動で調整されます。

INDEX MATCH の方が高速だという記述も目にするでしょう。Microsoft のページにはそのような主張はなく、差が意味を持つのは非常に大きなブックだけです。速度を理由に選ぶのではなく、柔軟性を理由に選んでください。

双方向検索

双方向検索は、ある行と ある列が交差する位置の値を検索します。たとえば、ある製品の特定の月の売上です。行用と列用の 2 つの MATCH 関数を使用します。

=INDEX(B2:M20,MATCH(P1,A2:A20,0),MATCH(Q1,B1:M1,0))

ここでは B2:M20 に数値、A2:A20 に製品名、B1:M1 に月の見出し、P1 と Q1 に調べたい製品と月が入っています。1つ目の MATCH で行を、2つ目の MATCH で列を求め、INDEX がその交点の数値を返します。戻り範囲が A1 ではなく B2 から始まっている点に注意してください。ラベル範囲と位置を揃えるためで、両方の MATCH 範囲も数値範囲と同じ行または列から始まっている必要があります。

2つの条件で照合する

MATCH は検索値を1つしか受け取れません。レコードが「カテゴリ」と「ステータス」のように2つの項目で特定される場合は、次の2つの方法があります。

作業用の列を使う。 2つの項目を結合する列を追加します。たとえば D2 に =A2&"|"&B2 と入力し、下にコピーします。そのうえで、結合したテキストを検索します。

=INDEX(C2:C100,MATCH(F2&"|"&G2,D2:D100,0))

区切り文字は重要です。区切り文字がないと、「AB」と「C」も「A」と「BC」も、どちらも「ABC」になってしまいます。作業用の列は読みやすく、確認もしやすく、すべてのバージョンで動作します。

配列数式を使う。 作業用の列を使わない場合は、2つの比較を掛け合わせることができます。

=INDEX(C2:C100,MATCH(1,(A2:A100=F2)*(B2:B100=G2),0))

それぞれの比較は TRUE または FALSE を返します。掛け合わせると、両方が真の場合のみ 1 になり、MATCH は最初の 1 を探します。この方法は Microsoft の INDEX と MATCH のページには載っていないため、小さい範囲で試してから使ってください。古いバージョンの Excel では、INDEX の配列結果について Microsoft が説明しているのと同じように、Ctrl+Shift+Enter で入力する必要がある場合があります。現在の Microsoft 365 では Enter キーだけで十分です。

ワイルドカードと近似値

一致の種類を 0 にして文字列を検索する場合、MATCH はワイルドカードを受け付けます。=INDEX(B2:B100,MATCH("Jan*",A2:A100,0)) は、「Jan」で始まる最初の項目の隣にある値を返します。部分的なコードを検索するときに便利です。MATCH は最初に見つかった時点で検索を止めるため、パターンは具体的に指定してください。

税率区分や手数料の段階などには、あえて既定の一致の種類 1 を使います。しきい値は昇順に並べておきます。A2:A4 に 0、1000、5000 を、B2:B4 に料率を入力すると、=INDEX(B2:B4,MATCH(E2,A2:A4,1)) は E2 を超えない最大のしきい値に対応する料率を返します。並べ替え済みの既定値が正しい選択になる、数少ない用途の1つです。

エラーを修正する

  • #N/A。 MATCH が該当する値を見つけられませんでした。入力ミス、末尾のスペース、文字列として保存された数値がないか確認してください。「100」と 100 は別の値として扱われます。一致の種類が 0 になっているかを確認し、一致の種類 1 または -1 を使う場合は、データが実際に並べ替えられているかも確認してください。
  • #REF!。 INDEX が範囲外の行または列を指定しました。数式で使っている行や列を削除したときにも発生します。MATCH の範囲と INDEX の範囲が同じサイズであることを確認してください。
  • エラーは出ないのに結果が誤っている。 多くの場合、MATCH の 0 の指定が抜けているか、範囲の開始行が揃っていないことが原因です。
  • コピーした後に結果が誤っている。 範囲が固定されていなかったため、コピー時に範囲がずれています。範囲に $ を付けてください。

エラーを別のメッセージに置き換えるには、Microsoft の IFNA 関数を使います。数式が #N/A を返すときに指定した値を表示し、それ以外のエラーはそのまま表示されます。

=IFNA(INDEX(C2:C100,MATCH(F2,A2:A100,0)),"Not found")

検索では IFERROR より IFNA を優先してください。IFERROR はすべてのエラーを隠すため、範囲の破損による #REF! も「見つからない」という通常の結果のように見えてしまいます。IFNA は想定しているケースだけを対象にします。Microsoft は IFNA を Excel 2016 以降で利用できるとしています。

INDEX MATCH か XLOOKUP か

ファイルを開くすべての人が最新の Microsoft 365 を使っているなら、XLOOKUP は1つの関数で同じ処理ができ、見つからない場合のメッセージも組み込まれています。Excel での XLOOKUP については、別のガイドで取り上げています。ただし、Microsoft の XLOOKUP のページでは Excel 2016 と 2019 への対応が明確ではなく、Excel for the web も記載されていません。INDEX MATCH はそのすべてで動作します。そのため、選択は実務的な判断になります。最新バージョン向けのファイルでは XLOOKUP を使い、古いバージョンを使う人にファイルを渡す場合や、すでに INDEX MATCH を使っているブックを保守する場合は INDEX MATCH を使います。

よくある間違い

  • MATCH の 0 を省略し、既定値に任せてしまうこと。
  • INDEX と MATCH で、範囲のサイズや開始行を揃えないこと。
  • 数式を下にコピーする前に、$ で範囲を固定し忘れること。
  • 作業用の列で、区切り文字を入れずに条件を結合すること。
  • すべてを IFERROR で囲み、壊れた数式が欠損データのように見えてしまうこと。
  • INDEX MATCHですべての一致を返すと期待しても、返されるのは最初の一致だけです。

関連トピック

  • XLOOKUP。 新しい検索関数で、検索方向と見つからない場合の引数が組み込まれています。
  • 複数の結果をまとめて取得。 INDEX MATCHが返すのは最初の一致だけです。FILTER関数は、対応するバージョンですべての一致を返すためのツールです。
  • テーブルと名前付き範囲。 構造化参照と名前を使うと検索式が読みやすくなり、データの増加に合わせて範囲も広がります。
  • 大きなシートのパフォーマンス。 列全体ではなく範囲を限定して指定し、範囲はできるだけ絞り込んでください。
  • 大文字と小文字を区別する検索。 MATCHは大文字と小文字を区別しないため、大文字と小文字を区別する検索には別の方法が必要です。回避策は、頼る前に必ずテストしてください。

次のステップ

VLOOKUPの数式を1つINDEX MATCHに書き換え、既知の値をいくつか使って結果を比較してください。次に、同じ数式を左側の値を検索するように変えて試してください。両方を試せば、Excelでどのような場合にINDEX MATCHがより適したツールになるかがわかります。

Entities in this article

Microsoft Excel

Related articles

RSS