ExcelのINDEX関数は、表の中から「何行目・何列目」を指定して値を取り出す関数です。
「VLOOKUPだと左側の列を検索できない」「もっと柔軟にデータを取り出したい」と思ったことはありませんか? INDEX関数を覚えると、こうした悩みをスッキリ解決できます。
この記事では、INDEX関数の基本構文から、MATCH関数との組み合わせ方、VLOOKUP・XLOOKUPとの使い分け、よくあるエラーの対処法まで、実務で使える具体例をまじえて解説していきます。
INDEX関数とは?
読み方と語源
読み方は「インデックス関数」です。英語の「index」は「索引・目次」を意味します。表の中から目次のように位置を指定してデータを引っ張ってくる、というイメージですね。
INDEX関数でできること
INDEX関数は、指定した行番号・列番号の位置にあるセルの値を返す関数です。
たとえば「売上管理表の3行目・2列目の値を取り出したい」というケースで活躍します。VLOOKUPのように検索値を使うのではなく、行と列の番号をダイレクトに指定するのが特徴です。
対応環境は、Excel for Microsoft 365、Excel 2024、Excel 2021、Excel 2019、Excel 2016、Excel for the web、Excel for Macです。幅広いバージョンで使えるので安心してください。
配列形式とセル参照形式
実はINDEX関数には「配列形式」と「セル参照形式」の2種類があります。
- 配列形式:
=INDEX(配列, 行番号, [列番号])— 通常使うのはこちら - セル参照形式:
=INDEX(参照, 行番号, [列番号], [領域番号])— 複数の離れた範囲を切り替えて扱いたいときに使う
実務ではほぼ配列形式で事足りるので、この記事では配列形式を中心に解説します。
INDEX関数の書き方(構文と引数)
基本構文
INDEX関数の構文は次のとおりです。
=INDEX(配列, 行番号, [列番号])
引数は3つありますが、列番号は省略できます。配列が1列だけの場合は、行番号だけで値を取り出せるということですね。
引数の詳細
各引数の意味を表にまとめました。
| 引数 | 必須/任意 | 説明 |
|---|---|---|
| 配列 | 必須 | 値を取り出す対象のセル範囲、または配列定数を指定します |
| 行番号 | 必須(※) | 配列の中で値を取り出したい行の位置を数値で指定します |
| 列番号 | 任意 | 配列の中で値を取り出したい列の位置を数値で指定します |
※列番号を指定する場合は、行番号に 0 を指定することで省略に相当する扱いになります。
ポイントを補足しておきます。
- 行番号に「0」を指定すると、列全体の値を配列として返します
- 列番号に「0」を指定すると、行全体の値を配列として返します
- 行番号・列番号に配列の範囲外の数値を指定すると、
#REF!エラーになります
INDEX関数の基本的な使い方
指定した行・列の値を取得する
まずは一番シンプルな使い方です。次のような社員名簿があるとします。
| A | B | C | |
|---|---|---|---|
| 1 | 名前 | 部署 | 内線番号 |
| 2 | 田中 | 営業部 | 1001 |
| 3 | 佐藤 | 経理部 | 2001 |
| 4 | 鈴木 | 人事部 | 3001 |
ここから「佐藤の内線番号(2行目・3列目)」を取得するには、次のように書きます。
=INDEX(A2:C4, 2, 3)
結果は 2001 が返ります。配列 A2:C4 の2行目・3列目、つまりセルC3の値を取り出しているわけです。
もうひとつ例を見てみましょう。配列が1列だけの場合は、列番号を省略できます。
=INDEX(A2:A4, 3)
この場合は「鈴木」が返ります。1列の範囲から3番目の値を取り出す、というシンプルな使い方です。
行番号・列番号に0を指定して行全体・列全体を返す
行番号または列番号に「0」を指定すると、行全体や列全体の値を配列として取得できます。
=INDEX(A2:C4, 0, 2)
この数式は、2列目(B列)の全データ、つまり「営業部」「経理部」「人事部」を配列として返します。SUM関数やAVERAGE関数と組み合わせると便利ですよ。
=SUM(INDEX(A2:C4, 0, 3))
こうすると、3列目(内線番号)の合計を返します。ちょっとむずかしく見えますが、やっていることはシンプルです。「0」は「全部ちょうだい」という意味だと覚えておけばOKです。
INDEX関数とMATCH関数の組み合わせ
INDEX関数の真価は、MATCH関数と組み合わせたときに発揮されます。ここが一番実務で役立つパートなので、しっかり押さえておきましょう。
INDEX+MATCHの基本パターン
MATCH関数は、指定した値が範囲内の何番目にあるかを返す関数です。この「何番目か」をINDEX関数の行番号に渡すことで、検索値に対応するデータを柔軟に取り出せます。
基本パターンはこちらです。
=INDEX(取り出したい範囲, MATCH(検索値, 検索する範囲, 0))
先ほどの社員名簿で、「佐藤」の内線番号を検索値から取得する場合はこうなります。
=INDEX(C2:C4, MATCH("佐藤", A2:A4, 0))
処理の流れを分解すると、次のようになります。
MATCH("佐藤", A2:A4, 0)→ 「佐藤」はA2:A4の2番目なので2を返すINDEX(C2:C4, 2)→ C2:C4の2番目の値2001を返す
MATCH関数の第3引数「0」は完全一致を意味します。ほとんどの場合は「0」を指定すると覚えておいてください。
MATCH関数の詳しい使い方は、こちらの記事で解説しています。
MATCH関数で範囲内から値を検索し、相対的な位置を取得する
2方向のINDEX+MATCH(クロス検索)
MATCH関数を行番号と列番号の両方に入れると、「縦軸と横軸から交差するセルを取り出す」クロス検索ができます。
たとえば、商品×月のマトリクス表から「商品B」の「3月」の売上を取り出すには、こう書きます。
=INDEX(B2:D5, MATCH("商品B", A2:A5, 0), MATCH("3月", B1:D1, 0))
行方向と列方向、どちらの検索も柔軟にできるのがINDEX+MATCHの強みです。XLOOKUPが使えない環境でも、この組み合わせなら同じことが実現できます。
VLOOKUPとの違い・使い分け
「VLOOKUPがあるならINDEX+MATCHは要らないのでは?」と思うかもしれません。実は、INDEX+MATCHにはVLOOKUPにない大きなメリットがあります。
| 比較項目 | VLOOKUP | INDEX+MATCH |
|---|---|---|
| 検索方向 | 左端列のみ検索可能 | どの列でも検索可能 |
| 列の挿入・削除 | 列番号がずれてエラーの原因になる | 範囲指定なので影響を受けにくい |
| 処理速度 | データ量が多いと遅くなりやすい | VLOOKUPより高速な場合がある |
| 数式の読みやすさ | シンプルで直感的 | 慣れるまでやや複雑 |
特に重要なのが検索方向です。VLOOKUPは検索値が左端列にないと使えませんが、INDEX+MATCHなら検索列と取得列を自由に指定できます。
たとえば「内線番号から名前を逆引きしたい」という場合、VLOOKUPでは対応できませんが、INDEX+MATCHなら簡単です。
=INDEX(A2:A4, MATCH(2001, C2:C4, 0))
結果は「佐藤」が返ります。検索列が右側にあっても問題なく動くのが、INDEX+MATCHの強みです。
VLOOKUPの詳しい使い方はこちらの記事で解説しています。
VLOOKUP関数を徹底解説!初心者でも使いこなせる完全ガイド
XLOOKUPとの使い分け
Excel for Microsoft 365やExcel 2021以降をお使いなら、XLOOKUP関数という新しい選択肢もあります。VLOOKUPの制限を解消した後継関数で、左方向の検索もスピルにも対応しています。
| 関数 | 対応バージョン | 左方向検索 | 数式のシンプルさ |
|---|---|---|---|
| VLOOKUP | 全バージョン | × | 〇 |
| INDEX+MATCH | 全バージョン | 〇 | △ |
| XLOOKUP | 365 / 2021以降 | 〇 | ◎ |
使い分けの目安は次のとおりです。
- Excel 2021以降 or Microsoft 365 → XLOOKUPを第一候補に
- Excel 2019以前も含めて使うファイル → INDEX+MATCHが安全
- シンプルな左端検索だけ → VLOOKUPでもOK
XLOOKUPの詳しい使い方はこちらで解説しています。
3つの関数をまとめて比較したい場合は、こちらの記事もあわせてどうぞ。
VLOOKUP・XLOOKUP・INDEX+MATCHを徹底比較
よくあるエラーと対処法
INDEX関数で発生しやすいエラーと、その原因・対処法をまとめました。
#REF! エラー
#REF! エラーは、行番号や列番号が配列の範囲を超えているときに発生します。
=INDEX(A2:C4, 5, 1)
この例では、A2:C4は3行しかないのに行番号に「5」を指定しているため、#REF! エラーになります。
対処法: 配列の行数・列数を確認してください。ROWS関数やCOLUMNS関数で範囲のサイズを確認すると安心です。
=ROWS(A2:C4) → 3(行数)
=COLUMNS(A2:C4) → 3(列数)
#VALUE! エラー
#VALUE! エラーは、行番号や列番号に数値以外の値(文字列など)を指定した場合に発生します。
=INDEX(A2:C4, "二", 1)
対処法: 行番号・列番号には必ず数値を指定してください。セル参照を使っている場合は、参照先のセルが数値になっているか確認しましょう。
#N/A エラー(INDEX+MATCH連携時)
INDEX単体ではあまり出ませんが、MATCHと組み合わせたときに #N/A が出ることがあります。これはMATCH側で検索値が見つからなかったサインです。
=INDEX(C2:C4, MATCH("高橋", A2:A4, 0))
A列に「高橋」がいなければ、MATCHが #N/A を返し、そのままINDEXにも伝わってしまいます。
対処法: IFERROR関数でラップして、見つからなかった場合のメッセージを指定しておくと実務で使いやすくなります。
=IFERROR(INDEX(C2:C4, MATCH("高橋", A2:A4, 0)), "該当なし")
エラー値の種類と対処方法の詳細は、こちらの記事でまとめています。
まとめ
この記事では、ExcelのINDEX関数について解説しました。ポイントを振り返っておきましょう。
- INDEX関数は、行番号と列番号を指定して表から値を取り出す関数
- 基本構文は
=INDEX(配列, 行番号, [列番号]) - MATCH関数との組み合わせで、検索値に対応するデータを柔軟に取得できる
- 2方向のINDEX+MATCHなら、クロス表からの検索も可能
- VLOOKUPでは対応できない「左方向の検索」や「逆引き」も可能
- Excel 2021以降なら、より簡潔なXLOOKUPも選択肢に
#REF!は範囲外、#VALUE!は数値以外、#N/AはMATCH側の検索失敗が主な原因
INDEX+MATCHは最初はちょっと複雑に感じるかもしれませんが、パターンを覚えてしまえば応用が利く強力な組み合わせです。ぜひ実際のデータで試してみてください。
