INDEX MATCHとは、MATCH関数で「何番目にあるか」を調べ、INDEX関数でその位置の値を取り出す、2つの関数を組み合わせた検索の書き方です。 検索する列と取り出す列を別々に指定するので、検索列より左の値も取れますし、行と列の両方向で探す表にも使えます。

この記事では、同じ架空の商品表を使って、基本形・左側検索・行と列の交差検索・複数条件・照合の種類の違いを、数式と計算結果のセットで並べます。VLOOKUP・XLOOKUPとの使い分けと、エラーが出たときの直し方も表で引けるようにしました。

確認環境:数式の計算結果は LibreOffice Calc 24.2.7.2 のヘッドレス実行で求めた値です(確認日 2026-10-05)。Calc 24.2 には XLOOKUP が無いため、XLOOKUP の仕様と対応バージョンは Microsoft サポートの記載にもとづいています。

この記事の結論

  • XLOOKUPが使える版だけで使うファイルなら、XLOOKUPが短く書けます。
  • XLOOKUPが使えない版(Excel 2016・2019)と共有するファイルと、行と列の両方向で探す表では、INDEX MATCHを選びます。
  • INDEX MATCHの基本形は =INDEX(取り出す列,MATCH(検索値,検索する列,0)) です。最後の 0(完全一致)は省略しません。
  • 複数条件は、検索値と検索列を & で連結する方法と、MATCH(1,(条件1)*(条件2),0) の方法の2つがあります。

INDEX MATCH・VLOOKUP・XLOOKUPの早見表

比べる点 VLOOKUP XLOOKUP INDEX MATCH
書き方 =VLOOKUP(検索値,範囲,列番号,FALSE) =XLOOKUP(検索値,検索範囲,戻り範囲) =INDEX(取り出す列,MATCH(検索値,検索する列,0))
左側検索(検索列より左の値を取る) 向かない(検索値は範囲の最初の列に置く決まり) できる できる
列の挿入への強さ 列番号が数字のままだと別の列を指す 強い(列を範囲で指定) 強い(列を範囲で指定)
行と列の両方向の検索 列番号をMATCHで求めれば可能 XLOOKUPを2つ組み合わせる MATCHを2つ使って1つの式で書ける
複数条件 作業列を足す方法が中心 検索範囲に配列を渡せる & 連結、または (条件1)*(条件2)
対応バージョン Excel 2016 以降のどの版でも使える Excel 2016・2019 では使えない 以前からある関数どうしの組み合わせで、版を選ばない
既定の照合方法(省略時) 近似一致(TRUE) 完全一致(0) MATCHは「1」=検索値以下の最大値(昇順の表が前提)
見つからないときの表示 IFERRORなどで囲む 第4引数で指定できる IFERRORなどで囲む

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「INDEX MATCHの使い方|複数条件・左側検索とXLOOKUPの使い分け」

どれを使うかの判断表

条件 選ぶもの
ファイルを開く全員が XLOOKUP を使える版 XLOOKUP
Excel 2016・2019 の利用者にもファイルを渡す INDEX MATCH
商品×月のように、行と列の両方から1つの値を探す INDEX MATCH(MATCHを2つ)
検索列が表の左端にあり、列の構成が今後も変わらない VLOOKUP でも足りる
表に列を足したり並べ替えたりする予定がある INDEX MATCH か XLOOKUP
「数量が50以上なら割引10%」のような段階表を引く INDEX MATCH(照合の種類 1)か VLOOKUP の近似一致

XLOOKUPを含むブックを Excel 2016・2019 で開く場合があることは、Microsoft サポートの XLOOKUP のページにも注意書きがあります。渡す相手の版がはっきりしないときは、INDEX MATCHで書いておくと、どの版でも同じ結果になります。

この記事で使う商品表

A1からF9に次の表が入っているものとします。下のタブ区切りをコピーして、A1に貼り付けると同じ表になります。

A B C D E F
1 商品コード 商品名 分類 色・サイズ 単価 在庫
2 P-001 ノート 文具 A4 180 120
3 P-002 ノート 文具 B5 150 80
4 P-003 ボールペン 文具 黒 110 300
5 P-004 ボールペン 文具 赤 110 150
6 P-005 マグカップ 雑貨 白 680 40
7 P-006 マグカップ 雑貨 青 720 25
8 P-007 タオル 雑貨 白 450 60
9 P-008 付箋 文具 黄 220 200
商品コード   商品名 分類  色・サイズ   単価  在庫
P-001   ノート 文具  A4  180 120
P-002   ノート 文具  B5  150 80
P-003   ボールペン   文具  黒   110 300
P-004   ボールペン   文具  赤   110 150
P-005   マグカップ   雑貨  白   680 40
P-006   マグカップ   雑貨  青   720 25
P-007   タオル 雑貨  白   450 60
P-008   付箋  文具  黄   220 200

INDEX MATCHの基本形

まず2つの関数の役割を分けて見ます。

関数 書き方 返すもの
MATCH =MATCH(検索値,検索する範囲,照合の種類) 検索値が範囲の中で何番目にあるか(位置の番号)
INDEX =INDEX(範囲,行番号,列番号) 範囲の中の、指定した行・列にある値

商品コード「P-005」の単価を求める式と結果です。

=MATCH("P-005",A2:A9,0)                  → 5
=INDEX(E2:E9,5)                          → 680
=INDEX(E2:E9,MATCH("P-005",A2:A9,0))     → 680

MATCHが「A2:A9の5番目」と答え、INDEXが「E2:E9の5番目」の680を取り出します。MATCHの範囲とINDEXの範囲は、同じ行から始めて同じ行数にそろえるのが決まりごとです。

同じ単価をVLOOKUPで求めると =VLOOKUP("P-005",A2:F9,5,FALSE) で、結果は同じ680でした。違いが出るのは次の「左側検索」からです。

左側検索:検索列より左の値を取り出す

商品名「タオル」から、左にある商品コードを求めます。

=INDEX(A2:A9,MATCH("タオル",B2:B9,0))    → P-007
=VLOOKUP("タオル",A2:F9,1,FALSE)         → #N/A

VLOOKUPは、範囲の最初の列(ここではA列の商品コード)から検索値を探します。A列に「タオル」は無いので #N/A になりました。INDEX MATCHは検索する列(B列)と取り出す列(A列)を別々に指定するので、位置関係を気にせずに書けます。

単価から商品名を逆引きすることもできます。

=INDEX(B2:B9,MATCH(MAX(E2:E9),E2:E9,0))  → マグカップ
=INDEX(B2:B9,MATCH(110,E2:E9,0))         → ボールペン

2つ目の式の単価110は4行目と5行目の2件ありますが、返るのは上にある行の値です。MATCHは最初に見つかった位置を返します。

行と列の交差検索:MATCHを2つ使う

H1からK5に、商品名と月ごとの販売数の表があるとします。

H I J K
1 4月 5月 6月
2 ノート 30 42 35
3 ボールペン 88 90 120
4 マグカップ 12 9 15
5 タオル 20 18 26

「マグカップ」の「5月」の値は、行の位置と列の位置をそれぞれMATCHで求めます。

=INDEX(I2:K5,MATCH("マグカップ",H2:H5,0),MATCH("5月",I1:K1,0))   → 9

INDEXの第2引数が行番号、第3引数が列番号です。見出しの文字で列を探すので、月の列が増えても式を直さずに済みます。商品表でも同じ書き方が使えます。

=INDEX(A2:F9,MATCH("P-006",A2:A9,0),MATCH("在庫",A1:F1,0))       → 25

行番号に 0 を指定すると列全体、列番号に 0 を指定すると行全体が配列で返ります(Microsoft サポートの INDEX 関数のページの記載)。SUMと組み合わせると、1行分の合計が求められます。

=SUM(INDEX(I2:K5,MATCH("ボールペン",H2:H5,0),0))                 → 298

複数条件で検索する2つの方法

商品名「マグカップ」かつ色「青」の単価を求めます。

方法1:検索値と検索列を & で連結する

=INDEX(E2:E9,MATCH("マグカップ"&"青",B2:B9&D2:D9,0))             → 720

B列とD列をつないだ「マグカップ青」という文字列を、行ごとに作って探す考え方です。

連結だけだと、別の組み合わせが同じ文字列になることがあります。「AB」と「C」、「A」と「BC」の2行がある表で確かめました(T1:U2に値、V1:V2に取り出す値 1 と 2 が入っています)。

=INDEX(V1:V2,MATCH("A"&"BC",T1:T2&U1:U2,0))                      → 1(1行目の「AB」「C」に当たっている)
=INDEX(V1:V2,MATCH("A"&"|"&"BC",T1:T2&"|"&U1:U2,0))              → 2(ねらった行)

値に出てこない区切り文字(ここでは縦棒)をはさむと、組み合わせを取り違えません。

方法2:MATCH(1,(条件1)*(条件2),0) を使う

=INDEX(E2:E9,MATCH(1,(B2:B9="マグカップ")*(D2:D9="青"),0))       → 720

(B2:B9="マグカップ") は行ごとに TRUE/FALSE を返し、掛け算で 1/0 に変わります。両方の条件を満たす行だけが 1 になるので、その 1 を MATCH で探します。文字の連結ではないため取り違えが起きず、>= などの比較も書けます。

=INDEX(B2:B9,MATCH(1,(C2:C9="雑貨")*(F2:F9>=50),0))              → タオル

分類が「雑貨」で在庫が50以上の最初の行(8行目)の商品名が返りました。

掛け算(*)は「かつ」です。足し算(+)にすると意味が変わります。

=INDEX(E2:E9,MATCH(1,(B2:B9="マグカップ")+(D2:D9="青"),0))       → 680(片方だけ当たる6行目)

配列数式の確定方法と、Enterだけで済む書き方

方法1・方法2は、範囲どうしを計算する配列数式です。Microsoft サポートの INDEX 関数のページには、Microsoft 365 では通常の数式として入力でき、それより前の版では Ctrl+Shift+Enter で配列数式として確定する、と書かれています。

共有相手の版がそろっていないときは、条件の部分を INDEX(…,0) で囲む書き方にすると、Enterだけで確定できます。

=INDEX(E2:E9,MATCH(1,INDEX((B2:B9="マグカップ")*(D2:D9="青"),0),0))   → 720

Calcでは、この式を通常の数式として入力して720が返ることを確かめました。

2つの方法の選び方

条件 選ぶ方法
条件がすべて「等しい」で、値に区切り文字が出てこない & 連結(区切り文字つき)
「以上」「以下」などの比較が入る (条件1)*(条件2)
条件が3つ以上ある (条件1)*(条件2)*(条件3) と掛け足す
Ctrl+Shift+Enter が必要な版の利用者もいる INDEX(…,0) で囲む書き方

照合の種類 0・1・-1 の違い

MATCHの第3引数「照合の種類」は、Microsoft サポートの MATCH 関数のページで次のように説明されています。

照合の種類 探し方 表の並び
0 検索値と等しい最初の値 並び順は問わない
1(省略時の既定) 検索値以下の最大の値 昇順に並べておく
-1 検索値以上の最小の値 降順に並べておく

1:段階表から「以下で最大」を引く

N1からO5に、数量に応じた割引率の表(昇順)があるとします。

N O
1 数量(以上) 割引率
2 1 0
3 10 0.05
4 50 0.1
5 100 0.15
=MATCH(45,N2:N5,1)                       → 2
=INDEX(O2:O5,MATCH(45,N2:N5,1))          → 0.05
=INDEX(O2:O5,MATCH(50,N2:N5,1))          → 0.1
=INDEX(O2:O5,MATCH(100,N2:N5,1))         → 0.15
=MATCH(45,N2:N5,0)                       → #N/A
=MATCH(0,N2:N5,1)                        → #N/A

45は「10以上50未満」の段に当たり、割引率0.05(5%)が返ります。完全一致(0)では45が表に無いので #N/A です。表の最小値より小さい0も、当てはまる段が無いので #N/A になります。

-1:降順の表から「以上で最小」を引く

Q1からR5に、箱に入る数の表(降順)があるとします。

Q R
1 入る数(まで) 箱
2 100 特大
3 60 大
4 30 中
5 10 小
=INDEX(R2:R5,MATCH(45,Q2:Q5,-1))         → 大
=INDEX(R2:R5,MATCH(60,Q2:Q5,-1))         → 大
=INDEX(R2:R5,MATCH(61,Q2:Q5,-1))         → 特大
=INDEX(R2:R5,MATCH(10,Q2:Q5,-1))         → 小
=MATCH(120,Q2:Q5,-1)                     → #N/A

45個が入る最小の箱は「大」(60まで)です。61個になると「特大」に切り上がります。120は最大の100を超えるので #N/A です。

並びと種類が合っていないとき

=MATCH(45,Q2:Q5,1)                       → #N/A(降順の表に 1 を指定)
=MATCH(45,N2:N5,-1)                      → #N/A(昇順の表に -1 を指定)

照合の種類を省略するとどうなるか

省略すると 1 として扱われます。並べ替えていない商品名の列で試した結果です。

=MATCH("ノート",B2:B9,0)                 → 1
=MATCH("ノート",B2:B9)                   → 2
=INDEX(E2:E9,MATCH("ノート",B2:B9,0))    → 180
=INDEX(E2:E9,MATCH("ノート",B2:B9))      → 150
=MATCH("タオル",B2:B9)                   → #N/A

「ノート」は1番目と2番目にありますが、省略した式は2番目を返し、単価も別の行の150になりました。「タオル」は表にあるのに #N/A です。エラーにならずに別の行の値が返ることがあるので、完全一致で探すときは必ず 0 を書きます。

列を挿入しても結果が変わらないことを確かめる

商品表の「分類」と「色・サイズ」の間に1列(仕入先)を挿入して、挿入の前と後で3つの式を比べました。

挿入前の式 挿入前の結果 挿入後の式(自動で書き換わった形) 挿入後の結果
=VLOOKUP("P-005",A2:F9,5,FALSE) 680 =VLOOKUP("P-005",A2:G9,5,FALSE) 白
=INDEX(E2:E9,MATCH("P-005",A2:A9,0)) 680 =INDEX(F2:F9,MATCH("P-005",A2:A9,0)) 680
=VLOOKUP("P-005",A2:F9,MATCH("単価",A1:F1,0),FALSE) 680 =VLOOKUP("P-005",A2:G9,MATCH("単価",A1:G1,0),FALSE) 680

VLOOKUPの範囲は A2:G9 に広がりましたが、列番号の 5 は数字のままなので、5列目になった「色・サイズ」の値が返りました。INDEX MATCHは取り出す列の参照が E列からF列へ追従しています。VLOOKUPを使い続ける場合も、3つ目の式のように列番号をMATCHで求めると同じ強さになります。

症状別:エラーの原因と直した数式

症状 主な原因 再現した式と結果 直した式と結果
#N/A 検索値が表に無い =INDEX(E2:E9,MATCH("P-009",A2:A9,0)) → #N/A =IFERROR(INDEX(E2:E9,MATCH("P-009",A2:A9,0)),"該当なし") → 該当なし
#N/A 検索値の末尾に空白がある(A12に「P-005」+半角空白) =INDEX(E2:E9,MATCH(A12,A2:A9,0)) → #N/A =INDEX(E2:E9,MATCH(TRIM(A12),A2:A9,0)) → 680
#N/A 検索値が数値で、表の側が文字列(文字列の「1002」を数値の1002で検索) =MATCH(D1,A2:A3,0) → #N/A =MATCH(D1&"",A2:A3,0) → 2
#N/A 照合の種類と表の並びが合っていない =MATCH(45,Q2:Q5,1) → #N/A =MATCH(45,Q2:Q5,-1) → 2
#REF! INDEXの範囲より大きい行番号・列番号を渡している =INDEX(E2:E9,9) → #REF! 範囲を表の行数に合わせる
#REF! INDEXの範囲がMATCHの範囲より短い =INDEX(E2:E8,MATCH("P-008",A2:A9,0)) → #REF! =INDEX(E2:E9,MATCH("P-008",A2:A9,0)) → 220
#REF! 1列だけの範囲に列番号 2 を渡している =INDEX(E2:E9,MATCH("P-005",A2:A9,0),2) → #REF! 列番号を外すか、範囲を複数列にする
#VALUE! 行番号に文字列が入っている(MATCHで囲み忘れ) =INDEX(E2:E9,"5番目") → #VALUE! =INDEX(E2:E9,MATCH(…,…,0)) の形にする
ずれた値が返る INDEXとMATCHの範囲の開始行が違う =INDEX(E1:E9,MATCH("P-005",A2:A9,0)) → 110、=INDEX(E3:E9,MATCH("P-005",A2:A9,0)) → 720 =INDEX(E2:E9,MATCH("P-005",A2:A9,0)) → 680
ずれた値が返る 照合の種類を省略している =INDEX(E2:E9,MATCH("ノート",B2:B9)) → 150 =INDEX(E2:E9,MATCH("ノート",B2:B9,0)) → 180
ずれた値が返る 同じ値が複数行にある =INDEX(B2:B9,MATCH(110,E2:E9,0)) → 上の行のボールペン 条件を足して複数条件にする

数値と文字列の行は、会員番号が文字列で入った小さな表(A2に「1001」、A3に「1002」、D1に数値の1002)で確かめた結果です。

IFERRORとIFNAの違い

見つからないときの表示を変えるには、式全体をIFERRORかIFNAで囲みます。

=IFERROR(INDEX(E2:E9,MATCH("P-009",A2:A9,0)),"該当なし")   → 該当なし
=IFNA(INDEX(E2:E9,MATCH("P-009",A2:A9,0)),"該当なし")      → 該当なし
=IFERROR(INDEX(E2:E9,9),"該当なし")                        → 該当なし
=IFNA(INDEX(E2:E9,9),"該当なし")                           → #REF!

IFNAは #N/A だけを置き換えます。範囲の指定ミスによる #REF! はそのまま表示されるので、「見つからない」と「式の誤り」を見分けたいときはIFNAが向いています。

知っておくと便利な書き方

やりたいこと 数式 結果
前方一致で探す(「マグ」で始まる) =MATCH("マグ*",B2:B9,0) 5
1文字だけ任意にして探す =MATCH("マグ?ップ",B2:B9,0) 5
大文字と小文字を区別せずに探す =INDEX(E2:E9,MATCH("p-005",A2:A9,0)) 680
列全体を指定する =INDEX(E:E,MATCH("P-005",A:A,0)) 680
2つの列を取り出して掛ける(単価×在庫) =INDEX(E2:E9,MATCH("P-005",A2:A9,0))*INDEX(F2:F9,MATCH("P-005",A2:A9,0)) 27200

ワイルドカード(? と *)は、照合の種類が 0 で検索値が文字列のときに使えます。MATCHは大文字と小文字を区別しません。どちらも Microsoft サポートの MATCH 関数のページに記載があります。列全体を指定するときは、INDEXとMATCHの両方を列全体にそろえると、開始行のずれが起きません。

確かめて分かったこと

  • 照合の種類を省略した式は、エラーにならずに別の行を返すことがある。 「ノート」の検索で、0 を付けた式は180、省略した式は150でした。
  • & 連結は、区切り文字なしだと別の組み合わせに当たる。 「A」「BC」を探して「AB」「C」の行が返りました。
  • INDEXとMATCHの開始行が1行ずれると、エラーではなく隣の行の値が返る。 680のはずが110や720になります。行数だけが足りない場合は #REF! です。
  • 列を挿入すると、VLOOKUPの列番号5は数字のまま残り、結果が「白」に変わった。 INDEX MATCHと、列番号をMATCHで求めたVLOOKUPは680のままでした。
  • IFNAは #REF! を置き換えない。 範囲の指定ミスに気づける分、IFERRORより原因を追いやすくなります。
  • 昇順の表に -1、降順の表に 1 を指定すると #N/A になった。 段階表を引くときは、並びと種類をセットで確認します。

よくある質問

Q. INDEX MATCHとは何ですか? A. MATCHで検索値の位置を求め、INDEXでその位置の値を取り出す組み合わせです。=INDEX(取り出す列,MATCH(検索値,検索する列,0)) と書きます。

Q. INDEX MATCHとXLOOKUPの違いは何ですか? A. できることはほぼ重なりますが、XLOOKUPは Excel 2016・2019 で使えません。全員が使える版ならXLOOKUP、そうでなければINDEX MATCHと決めると迷いません。行と列の両方向で探す表は、INDEX MATCHのほうが1つの式で素直に書けます。

Q. INDEX MATCHで複数条件にするにはどう書きますか? A. =INDEX(取り出す列,MATCH(1,(条件1)*(条件2),0)) と書きます。条件が「等しい」だけなら、検索値と検索列を & で連結する方法も使えます。

Q. INDEX MATCHで #N/A が出て検索できないときは? A. まず検索値が表にあるかを確かめ、次に末尾の空白、数値と文字列の違い、照合の種類の順に見ます。TRIMで空白を取る、&"" で文字列にそろえる、第3引数に 0 を書く、のいずれかで直ることが多いです。

Q. MATCHの照合の種類は省略してもよいですか? A. 完全一致で探すときは省略しません。省略すると 1(検索値以下の最大値)として扱われ、並べ替えていない表では別の行の位置が返ることがあります。

まとめ

  • INDEX MATCHは「MATCHで位置、INDEXで値」。 基本形は =INDEX(取り出す列,MATCH(検索値,検索する列,0))。
  • XLOOKUPが使える版だけならXLOOKUP、Excel 2016・2019 と共有するファイルや行と列の両方向の表ではINDEX MATCH。
  • 左側検索は、検索する列と取り出す列を別々に指定するだけで書ける。
  • 複数条件は & 連結(区切り文字つき)か MATCH(1,(条件1)*(条件2),0)。比較が入るなら掛け算の方法。
  • 照合の種類は 0 を必ず書く。 段階表は昇順なら 1、降順なら -1。
  • 範囲は同じ行から同じ行数でそろえる。 ずれると隣の行の値や #REF! になる。
  • 見つからないときは IFNA で囲むと、範囲の指定ミスと見分けられる。

参考・出典

  • Microsoft サポート「MATCH 関数」https://support.microsoft.com/ja-jp/office/match-関数-e8dffd45-c762-47d6-bf89-533f4a37673a
  • Microsoft サポート「INDEX 関数」https://support.microsoft.com/ja-jp/office/index-関数-a5dcf0dd-996d-40a4-a822-b56b061328bd
  • Microsoft サポート「VLOOKUP 関数」https://support.microsoft.com/ja-jp/office/vlookup-関数-0bbc8083-26fe-4963-8ab8-93a18ad188a1
  • Microsoft サポート「XLOOKUP function」https://support.microsoft.com/en-us/office/xlookup-function-b7fd680e-6d10-43e6-84f9-88eae8bf5929

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「INDEX MATCHの使い方|複数条件・左側検索とXLOOKUPの使い分け」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?