doodle-on-web

自分で調べたことや、仕事の中で質問されたことなどをまとめています。

VLOOKUPを卒業しよう|INDEX×MATCHで左側検索・2条件検索を完全攻略

スポンサーリンク


VLOOKUPを卒業しよう|INDEX×MATCHで左側検索・2条件検索を完全攻略

「列を追加したら、数式が全部壊れた」「左側の列の値を取りたいのに、VLOOKUPでは取れない」——こんな経験はありませんか?

VLOOKUPは手軽で便利ですが、実務で使い続けるとその限界に何度もぶつかります。この記事を読み終えたら、左側の列への検索・2条件での絞り込み・横方向データへの対応、この3つがすべて自分で書けるようになります。乗り換えのハードルは思っているより低いので、ぜひ最後まで読んでみてください。


なぜ今、INDEX×MATCHなのか

VLOOKUPには3つの構造的な弱点があります。

  • 検索列は必ず左端でなければならない
  • 列番号を数値で指定するため、列を追加・削除すると数式が壊れる
  • 縦方向専用のため、横方向検索は別途HLOOKUPが必要

INDEX×MATCHはこれらをすべて解決します。検索列の位置を問わず、縦横どちらにも対応でき、列を追加しても数式は壊れません。一度身につければ、スプレッドシート作業の質が一段上がります。


記事全体で使うサンプルテーブル

以降の説明は、次の「社員マスタ」テーブルを一貫して使います。データ構造を頭に入れておくと、各パターンがすんなり理解できます。

A列(社員番号) B列(社員名) C列(部署) D列(役職)
1001 山田 営業部 主任
1002 田中 開発部 一般
1003 佐藤 人事部 主任
1004 鈴木 開発部 一般

データは2行目から5行目(A2:D5)に入力されているとします。


INDEX関数とMATCH関数——組み合わせ前の基礎確認

MATCH関数:「何番目にあるか」を返す

=MATCH(検索値, 検索範囲, 照合の種類)

完全一致で使うときは、第3引数に必ず 0 を指定します。

=MATCH("田中", B2:B5, 0)  → 2(B列の2番目)

INDEX関数:「指定した位置の値」を返す

=INDEX(配列, 行番号, [列番号])
=INDEX(C2:C5, 2)  → "開発部"(C列の2番目)

この2つを組み合わせると、「MATCHで位置を調べ、INDEXでその位置の値を取り出す」という流れになります。


基本パターン:社員名から部署を検索

G1セルに「田中」と入力し、H1セルに所属部署を表示したい場合:

=INDEX(C2:C5, MATCH(G1, B2:B5, 0))

処理の流れ: 1. MATCH(G1, B2:B5, 0) → 「田中」はB列の 2番目2 を返す 2. INDEX(C2:C5, 2) → C列の2番目 = 「開発部」 を返す

これがINDEX×MATCHの核心です。


実務パターン集

パターン①:左側の列を返す(VLOOKUPの限界を超える)

「社員名(B列)で検索して、社員番号(A列)を取り出す」というケースは、VLOOKUPでは不可能です。INDEX×MATCHなら一行で解決します。

=INDEX(A2:A5, MATCH(G1, B2:B5, 0))

返り値の列(A列)が検索列(B列)より左にあっても問題ありません。INDEXは「どの列から取り出すか」、MATCHは「何行目かを探す」と役割が完全に分離しているためです。


パターン②:2条件での完全一致検索

「部署が"開発部"かつ役職が"一般"の社員名を知りたい」——実務ではこのような複数条件での検索が頻繁に発生します。

=INDEX(B2:B5, MATCH(1, (C2:C5=G1)*(D2:D5=H1), 0))

Excelの場合: Ctrl + Shift + Enter で配列数式として確定(Excel 365・2021以降は通常のEnterでOK)

数式の仕組みを理解する:

  • (C2:C5=G1) → 部署が一致する行は TRUE(=1)、しない行は FALSE(=0)の配列を返す
  • (D2:D5=H1) → 役職が一致する行も同様の配列を返す
  • 2つの配列を *(掛け算) でつなぐと、両方が1(TRUE)の行だけが1になる
  • MATCH(1, ..., 0) で「1が何番目にあるか」を探すことで、2条件が同時に一致する行を特定できる

この*による掛け算がAND条件の正体です。OR条件にしたい場合は+(足し算)を使います。


パターン③:横方向データへの検索(TRANSPOSEの出番)

売上テーブルのようにデータが横(行)方向に並んでいる場合も、MATCHを横向きに使えば対応できます。

B列(1月) C列(2月) D列(3月) E列(4月)
1行目(ヘッダー) 1月 2月 3月 4月
2行目(売上) 100 150 120 180
=INDEX(B2:E2, MATCH("3月", B1:E1, 0))  → 120

では TRANSPOSE はいつ必要になるのか。月名が縦(列)方向のリストとして別シートに存在し、それを横向きの検索範囲に合わせたいときです。

たとえばA5:A8に縦で月名が入力されている場合:

=INDEX(B2:E2, MATCH("3月", TRANSPOSE(A5:A8), 0))

TRANSPOSE でA5:A8の縦並びを横並びに変換してからMATCHに渡します。「元のデータが縦なのか横なのか」が食い違うときに使う調整役、と覚えておきましょう。


パターン④:IFERROR でエラーをやさしく処理

検索値が見つからないと #N/A エラーが表示されます。ユーザーに見せる画面では必ずIFERRORで包んでおきましょう。

=IFERROR(INDEX(C2:C5, MATCH(G1, B2:B5, 0)), "該当なし")

よくあるミスと対処法

症状 主な原因 対処法
#N/A が出る 検索値にスペースが混入している =TRIM(G1) で空白を除去してから検索
意図しない値が返る MATCHの第3引数を省略している 完全一致は必ず , 0) を明示する
2条件検索が機能しない 配列数式として確定していない Ctrl+Shift+Enter で確定(旧Excel)
TRANSPOSEが反映されない 旧バージョンで動的配列非対応 同様に Ctrl+Shift+Enter で確定

まとめ

  • INDEX×MATCH はVLOOKUPの上位互換。左側列の検索も、列の追加・削除にも強い
  • MATCHの第3引数は完全一致なら 必ず0 を指定する
  • 2条件検索(条件1)*(条件2)の掛け算で実現できる——この仕組みを理解すると3条件以上にも応用できる
  • TRANSPOSE は縦横のデータ構造が食い違うときの調整役として使う
  • IFERROR でエラー処理を忘れずに仕上げる

最初の1週間は「パターン①と②だけ使う」と決めて練習するのがおすすめです。手を動かすうちに、数式の読み方が自然に身につきます。


この記事は「Lookupシリーズ」の一部です。XLOOKUPやOFFSETを使った応用編もあわせてご覧ください。