はじめに:そのVLOOKUPのエラー、原因は「左側」にあった
「検索したい値は右にあるのに、返したい値が左の列にある…」
Excelを業務で使っていると、一度は必ずぶつかる壁です。実際、VLOOKUPを使いこなしているユーザーの多くが、このシーンで初めて限界を感じると言われています。
VLOOKUPの仕様上、検索キーより左側の列にある値は取得できません。列番号は必ず1以上の正の整数を指定する構造のため、左方向への参照は原理的に不可能なのです。
この記事を読み終えると、INDEXとMATCHを組み合わせるだけで、左方向を含むあらゆる方向の検索を自在に扱えるようになります。数式の分解・実践例・よくあるミスまでまとめて解説しますので、ぜひ手を動かしながら読み進めてください。
📌 本記事はLookupシリーズの一本です。シリーズ一覧は記事末尾をご覧ください。
INDEX・MATCHの役割をひとことで理解する
まず、2つの関数がそれぞれ何をするのかを押さえましょう。
MATCH関数:「何行目にあるか」を調べる
=MATCH(検索値, 検索範囲, 照合の種類)
| 引数 | 説明 |
|---|---|
| 検索値 | 探したい値 |
| 検索範囲 | 1行または1列の範囲 |
| 照合の種類 | 0 で完全一致 |
INDEX関数:「指定した位置の値」を取り出す
=INDEX(配列, 行番号, [列番号])
指定した範囲の中から、行番号・列番号で指定したセルの値を返します。
2つを組み合わせるイメージ
🏠 MATCHは「住所を調べる係」、INDEXは「その住所に荷物を取りに行く係」
MATCHが「C列の3行目にある」と住所を特定し、INDEXがその住所を使って実際の値を取得する、というチームプレーです。この流れさえつかめれば、数式の構造は自然と読めるようになります。
左方向検索の実践例:氏名→社員IDの逆引き
サンプルデータ
実務では数百行のデータを扱うことがほとんどですが、まずは構造を理解するために小さなテーブルで見ていきます。
| A列:社員ID | B列:部署 | C列:氏名 |
|---|---|---|
| 1001 | 営業部 | 田中 太郎 |
| 1002 | 開発部 | 鈴木 花子 |
| 1003 | 人事部 | 佐藤 一郎 |
やりたいこと:「氏名(C列)」から「社員ID(A列)」を逆引きする
VLOOKUPでは「C列で検索 → A列を返す」という左方向の参照はできません。ここでINDEX・MATCHを使います。
数式の組み立て
=INDEX(A2:A4, MATCH("鈴木 花子", C2:C4, 0))
ステップで追う動作の流れ:
MATCH("鈴木 花子", C2:C4, 0)→ C列の中で「鈴木 花子」は 2番目 →2を返すINDEX(A2:A4, 2)→ A列の2番目の値1002を返す
検索キーより左にある列の値を、方向を問わず取り出せました。
セル参照と絶対参照で実用的に仕上げる
実務のファイルでは、検索値をセルに入力して動的に結果を切り替えられるようにするのが基本です。
例:F2セルに氏名を入力し、G2に社員IDを返す
=INDEX($A$2:$A$4, MATCH(F2, $C$2:$C$4, 0))
$(絶対参照)で範囲を固定し、数式をコピーしても参照がずれない- F2の値を変えるだけで自動的に検索結果が更新される
やってしまいがちなミスと対処法
❌ ミス1:MATCHとINDEXの参照範囲の行数がズレている
=INDEX(A2:A10, MATCH(F2, C2:C8, 0)) ← 行数が合っていない!
MATCHが「5番目」と返しても、INDEXの参照範囲が短ければ意図しない行の値を返すことがあります。必ず両者の行範囲を揃えるか、列全体(A:A)を指定する習慣をつけましょう。
❌ ミス2:エラー処理なしでファイルを共有する
検索値が見つからないと#N/Aエラーが表示されます。自分だけが使うファイルならまだしも、他者に渡すファイルや集計に使うシートでは、エラーがそのまま連鎖して計算結果を壊す危険があります。
IFERRORで必ずラップしましょう。
=IFERROR(INDEX($A$2:$A$4, MATCH(F2, $C$2:$C$4, 0)), "該当なし")
これで一致するデータがない場合は「該当なし」と表示され、下流の計算も安全に保てます。
【発展編】複数条件での検索
ここからは難易度が一段上がります。基本の使い方に慣れてから取り組むことをおすすめします。
「部署が開発部」かつ「氏名が鈴木 花子」という複数条件で検索したい場合は、以下のように記述します。
=INDEX(A2:A4, MATCH(1, (B2:B4="開発部")*(C2:C4="鈴木 花子"), 0))
- Excel 2019以前:
Ctrl + Shift + Enterで配列数式として確定 - Excel 365・2021以降:通常の
Enterで動作
条件を*でつなぐことで「かつ(AND)」の絞り込みができます。
別シートを参照する場合
=IFERROR(INDEX(Sheet1!$A$2:$A$100, MATCH(F2, Sheet1!$C$2:$C$100, 0)), "該当なし")
シート名をシート名!の形で明示するだけで、別シートも問題なく参照できます。
VLOOKUPとINDEX・MATCHの比較まとめ
| 項目 | VLOOKUP | INDEX・MATCH |
|---|---|---|
| 左方向の検索 | ❌ 不可 | ✅ 可能 |
| 列の追加・削除への耐性 | 弱い(列番号がずれる) | 強い(列名で指定) |
| 数式の可読性 | 高い(シンプル) | やや低い(2関数の組み合わせ) |
| 処理速度 | やや速い | やや遅い(大量データ時) |
| 覚えやすさ | 簡単 | 慣れが必要 |
まとめ:3つをセットで覚えれば怖くない
INDEX・MATCHは、VLOOKUPの「左側が取れない」という弱点を完全にカバーする手法です。
- MATCH:「何行目にあるか」を数値で取得する
- INDEX:その行番号を使って値を取り出す
- IFERROR:エラーをハンドリングして安全なファイルにする
この3つをセットで習慣化するだけで、列の並び順に縛られない柔軟な検索式が書けるようになります。最初はVLOOKUPより複雑に感じても、2〜3回書けば構造は体に染みつきます。ぜひ手元の業務ファイルで試してみてください。
📚 Lookupシリーズの次回は「XLOOKUP関数」を解説予定です。INDEX・MATCHをさらに直感的にしたような関数で、Excel 365ユーザーには特におすすめです。お楽しみに!