「社員番号から名前を引っ張りたいけど、VLOOKUPだと左側の列は検索できない」。スプレッドシートでこんな壁にぶつかったことはありませんか。
列の並びを変えれば対応できますが、元の表を崩すのは避けたいですよね。
そんなときに頼りになるのがINDEX関数です。行番号と列番号を指定するだけで、表のどこからでも値を取得できます。この記事では、INDEX関数の基本から実践的な使い方まで解説します。MATCH関数との組み合わせやVLOOKUPとの使い分けもカバーします。
スプレッドシートのINDEX関数とは?
INDEX関数(読み方: インデックス関数)は、範囲内の指定した行・列の位置にある値を返す関数です。名前はIndex(索引・見出し)が由来で、「表の中から座標を指定してピンポイントで値を取り出す」イメージです。
INDEX関数にできることをまとめると、次のとおりです。
- 行番号と列番号を指定して、表から値を1つ取得する
- 行番号に0を指定して、列全体を配列として返す
- MATCH関数(検索値の位置番号を返す関数)と組み合わせて柔軟な検索を行う
- VLOOKUPでは不可能な左方向への検索を実現する
NOTE
Googleスプレッドシートではarea_num(区画番号)引数に対応していません。Excelから数式を移行する場合はご注意ください。
INDEX関数の書き方(構文と引数)
基本構文
INDEX関数の構文はこちらです。
=INDEX(参照, [行], [列])
引数は3つあります。行と列はどちらも省略できます。
引数の説明
| 引数 | 必須/省略可 | 意味 | 指定例 |
|---|---|---|---|
| 参照 | 必須 | 値を取り出す対象の範囲 | A2:D5 |
| 行 | 省略可 | 範囲内の行番号(1から数える) | 2 |
| 列 | 省略可 | 範囲内の列番号(1から数える) | 3 |
行と列にはそれぞれ特殊な指定方法があります。
- 0を指定した場合: 行に0を指定すると列全体、列に0を指定すると行全体を配列として返します
- 省略した場合: 省略すると1が指定されたものとして扱われます
INDEX関数の基本的な使い方
行番号と列番号を指定して値を取得する
次の社員管理表を例に見てみましょう。A1:D5にデータが入っているとします。
| 社員番号 | 名前 | 部署 | 内線番号 |
|---|---|---|---|
| 1001 | 田中 | 営業部 | 3001 |
| 1002 | 佐藤 | 経理部 | 3002 |
| 1003 | 鈴木 | 人事部 | 3003 |
| 1004 | 高橋 | 総務部 | 3004 |
データ部分(A2:D5)から2行目・3列目の値を取得するにはこう書きます。
=INDEX(A2:D5, 2, 3)
結果は「経理部」です。A2:D5の2行目は佐藤の行、3列目は部署の列なので、その交差する値が返ります。
もう1つ試してみましょう。3行目・2列目を指定します。
=INDEX(A2:D5, 3, 2)
結果は「鈴木」です。行と列の番号は範囲の左上を起点にカウントする点がポイントです。
行番号・列番号に0を指定する
行番号に0を指定すると、指定した列全体が配列として返ります。
=INDEX(A2:D5, 0, 2)
この数式は名前列(B列のデータ部分)を丸ごと返します。SUM関数やAVERAGE関数の引数として使うと便利です。
同様に列番号に0を指定すると、指定した行全体が返ります。
=INDEX(A2:D5, 1, 0)
結果は田中の行全体(1001, 田中, 営業部, 3001)です。
INDEX+MATCHの組み合わせ(実践パターン)
INDEX関数の真価は、MATCH関数と組み合わせたときに発揮されます。MATCH関数は検索値が範囲内の何番目にあるかを返す関数です。
INDEX+MATCHの基本パターン
基本の構文はこちらです。
=INDEX(戻り値の範囲, MATCH(検索値, 検索範囲, 0))
MATCH関数の第3引数「0」は完全一致を意味します。
先ほどの社員管理表で、社員番号1003の部署を取得してみましょう。
=INDEX(C2:C5, MATCH(1003, A2:A5, 0))
処理の流れを順に見ていきます。
- MATCH(1003, A2:A5, 0) → A2:A5の中で1003は3番目 → 「3」を返す
- INDEX(C2:C5, 3) → C2:C5の3番目 → 「人事部」を返す
VLOOKUPと似た動きですが、検索列と戻り値の列を別々に指定できるのが大きな違いです。
左列への逆引き検索(VLOOKUPでは不可能)
INDEX+MATCHが最も活躍するのが、左方向への検索です。
たとえば「経理部の社員番号を知りたい」とします。部署(C列)で検索して社員番号(A列)を返す、つまり右から左への検索です。VLOOKUP関数では左方向の検索ができないため、この場面ではINDEX+MATCHの出番です。
=INDEX(A2:A5, MATCH("経理部", C2:C5, 0))
処理の流れは次のとおりです。
- MATCH(“経理部”, C2:C5, 0) → C2:C5の中で経理部は2番目 → 「2」を返す
- INDEX(A2:A5, 2) → A2:A5の2番目 → 「1002」を返す
検索範囲と戻り値の範囲を自由に設定できるため、列の位置に制約がありません。
2次元検索(行と列の両方をMATCHで検索)
ちょっとむずかしく見えますが、行と列の両方をMATCHで動的に指定することもできます。
「社員番号1002の内線番号を取得したい」とします。行の位置も列の位置もMATCHで自動判定する数式です。
=INDEX(A2:D5, MATCH(1002, A2:A5, 0), MATCH("内線番号", A1:D1, 0))
処理の流れを見てみましょう。
- MATCH(1002, A2:A5, 0) → 「2」(2行目)
- MATCH(“内線番号”, A1:D1, 0) → 「4」(4列目)
- INDEX(A2:D5, 2, 4) → 「3002」を返す
列の見出し名で検索するため、途中に列が追加されても数式が壊れません。大きな表を扱うときに重宝するパターンです。
VLOOKUPとINDEX+MATCHの使い分け
どちらを使うべきか迷う方も多いと思います。比較表で整理しましょう。
| 特徴 | VLOOKUP | INDEX+MATCH |
|---|---|---|
| 左方向検索 | 不可 | 可能 |
| 列追加への耐性 | 弱い(番号がズレる) | 強い(列名で検索) |
| 数式の読みやすさ | シンプル | やや複雑 |
| 処理速度(大量データ) | やや遅い | 速い |
| デフォルトの一致方式 | 近似一致(TRUE) | 完全一致(0指定) |
| 複数列を一括で返す | 不可 | 不可 |
どちらを選ぶべき?
判断基準はシンプルです。
- 検索列が範囲の左端にある単純な表引き → VLOOKUPで十分
- 左方向への検索が必要 → INDEX+MATCHを使う
- 列の追加・削除が頻繁にある表 → INDEX+MATCHが安全
- 大量データ(数万行以上)を扱う → INDEX+MATCHのほうが高速
なお、Googleスプレッドシートでは2022年以降、XLOOKUP関数(VLOOKUPより柔軟な検索関数)が使えます。左方向検索やエラー時の既定値指定など、INDEX+MATCHの利点の多くをカバーしています。新しく数式を作るならXLOOKUPも選択肢に入れてみてください。
VLOOKUPの詳しい使い方は「スプレッドシートのVLOOKUP関数の使い方」で解説しています。横方向の検索が必要な場合は「スプレッドシートのHLOOKUP関数の使い方」も参考にしてください。
INDEX関数でよくあるエラーと対処法
#REF! エラー
行番号または列番号が範囲の大きさを超えているときに出ます。
たとえばA2:D5は4行4列の範囲です。行番号に5以上、列番号に5以上を指定すると#REF!エラーになります。範囲のサイズと指定した番号を見直してください。
#VALUE! エラー
行番号や列番号に負の数や文字列を指定すると発生します。
MATCH関数の結果が正しく数値を返しているか確認しましょう。セル参照先が空白や文字列になっていないかもチェックポイントです。
#N/A エラー(MATCH使用時)
INDEX+MATCHの組み合わせで起きやすいエラーです。MATCH関数が検索値を見つけられないときに発生します。
| 原因 | 対処法 |
|---|---|
| 検索値がデータに存在しない | データを追加するか、IFERRORで対処 |
| データ型の不一致(数値と文字列) | 検索値と検索範囲のデータ型を揃える |
| 余分なスペースが含まれている | TRIM関数で空白を除去する |
IFERROR関数(エラー時に別の値を返す関数)で囲めば、エラー表示を防げます。
=IFERROR(INDEX(C2:C5, MATCH(1005, A2:A5, 0)), "見つかりません")
社員番号1005はデータに存在しないため、「見つかりません」が表示されます。
INDEX関数のまとめ
INDEX関数のポイントを振り返ります。
- 構文は =INDEX(参照, 行, 列) の3引数。行と列は省略可
- 行・列番号は範囲の左上を起点に1から数える
- MATCH関数と組み合わせると、VLOOKUPでは不可能な左方向検索ができる
- 2次元検索なら行・列の両方をMATCHで指定する
- エラー対策にはIFERROR関数を組み合わせるのが定番
まずはINDEX+MATCHの基本パターンから試してみてください。一度覚えれば、VLOOKUPの制約に悩まされることがなくなります。
