なぜVLOOKUPだけでは不十分なのか?
VLOOKUP関数は非常に便利ですが、**「検索キーが常に範囲の一番左の列になければならない」**という大きな弱点があります。この制約のため、データ構造によっては使えない場面が出てきます。

そこで活躍するのが、INDEX関数とMATCH関数の組み合わせです。この2つを組み合わせることで、VLOOKUPの弱点を克服し、どんなデータ構造でも自由に情報を抽出できるようになります。
INDEX関数:地図の「座標」を教える関数
INDEX関数は、指定した地図の特定の場所にある「宝物(データ)」を見つけるようなものです。
- 基本形:
=INDEX(地図, 縦の座標, 横の座標)
たとえば、宝の地図で「B-2」という座標にある宝物を探したいとします。このとき、=INDEX(地図全体, 2, 2)
と指定すると、縦の2番目、横の2番目にあるデータ(宝物)を正確に取り出してくれるのです。
MATCH関数:宝の「座標」を探す関数
次に、MATCH関数は、宝の「名前」を教えると、それが地図上のどこにあるのか、つまり「座標」を教えてくれる関数です。
- 基本形:
=MATCH(宝の名前, 地図の端から端まで, 探し方)
たとえば、「リンゴ」という宝物の名前を教えると、=MATCH("リンゴ", A列, 0)
のように指定することで、A列の上から何番目に「リンゴ」があるかを数字で教えてくれます。この関数は、宝物そのものではなく、その「位置番号」を返してくれるのがポイントです。
INDEX関数とMATCH関数の組み合わせ:最強の「宝探し」コンビ
この2つの関数を組み合わせることで、「宝の名前」だけで「宝物の情報」を自由自在に探し出せるようになります。
VLOOKUP関数は、検索する宝の名前が常にリストの「一番左」になければならないという制限があります。これは、宝探しのルールが「必ず地図の左端から探せ」と決まっているようなものです。
しかし、INDEX関数とMATCH関数を使えば、この制限がなくなります。
- まず、MATCH関数で「宝の名前」からその**「行番号(縦の座標)」**を特定します。
- 次に、その「行番号」をINDEX関数に渡し、取り出したい**「列番号(横の座標)」**を指定します。
これにより、検索キーがどの列にあっても、自由自在にデータを抽出できるようになります。まるで、どんな名前の宝物でも、どんな場所にあっても、ピンポイントで探し出せる魔法のようなコンビなのです。
VLOOKUPの弱点を克服する!具体的な使用例
先ほどの「顧客リスト」を使い、店舗名(C列)から店番(B列)を抽出するというVLOOKUPでは不可能な例を見てみましょう。

1. MATCH関数で「店舗名」の行番号を特定する
店番を表示したいセル(例:M2)に、MATCH関数を以下のように入力します。
=MATCH(L2, C:C, 0)
L2
: 検索キー(店舗名「富士フーズ 新宿支店」が入力されたセル)C:C
: 検索範囲(店舗名が入力されているC列全体)0
: 完全一致
この関数は、「富士フーズ 新宿支店」がC列の何行目にあるか(この例では4行目)を返します。
※以下の図のC列から「富士フーズ 新宿支店」を探します。

※「富士フーズ 新宿支店」が4行目に見つかりました。関数の結果は4行目の「4」となります。

2. INDEX関数で「店番」を抽出する
先ほどのMATCH関数を、INDEX関数の「行番号」として組み合わせます。
=INDEX(B:B, MATCH(L2, C:C, 0))
B:B
: 抽出したい値(店番)があるB列全体MATCH(L2, C:C, 0)
: MATCH関数で求めた行番号(この例では4)
この関数により、B列の4行目にある値(「1003」)が抽出されます。

これで、検索キーが左端にない場合でも、自由に情報を抽出できるようになります。

追加の例題:担当者名から店舗住所を抽出してみよう!
ここでは、担当者名(I列)からその担当者が所属する店舗の住所(E列)を抽出してみましょう。VLOOKUP関数では、検索キーである「担当者名」が一番左の列にないため、この操作は不可能です。しかし、INDEXとMATCHを組み合わせれば簡単に実現できます。
目的: 「担当者名」を検索キーにして、「店舗住所」を抽出する
1. MATCH関数で担当者名の行番号を特定する
抽出結果を表示したいセル(例:M5)に、以下のように入力します。
=MATCH("中島 拓也", H:H, 0)
"中島 拓也"
: 検索したい担当者名。セル参照を使ってもOKです。H:H
: 検索範囲(担当者名が入力されているH列全体)0
: 完全一致

この式は、「中島 拓也」がH列の何行目にあるかを返します。顧客リストを確認すると、この式は22という値を返します。
2. INDEX関数で店舗住所を抽出する
次に、先ほどのMATCH関数をINDEX関数に組み込みます。
=INDEX(E:E, MATCH("中島 拓也", H:H, 0))
E:E
: 抽出したい値(店舗住所)があるE列全体MATCH(...)
: MATCH関数で求めた行番号(ここでは22)

※注意!表自体に項番がありますがあくまでもシートの行番号で数えます。

この関数により、E列の22行目にある**「岩手県盛岡市大通1-11-11」**が抽出されます。
このように、INDEX関数とMATCH関数の組み合わせは、VLOOKUPの制約を完全に克服し、どんなデータ構造にも柔軟に対応できる強力なスキルです。ぜひ、実際の業務で試してみてください。
VLOOKUPとINDEX/MATCHの使い分け
VLOOKUP関数 | INDEX/MATCH関数 | |
得意なこと | 検索キーが左端にある場合に、手軽に情報を抽出する。 | 検索キーの位置を問わず、自由に情報を抽出する。複雑なデータ構造にも対応できる。 |
弱点 | 検索キーが必ず左端にないといけない。 | 関数が2つになるため、少し複雑に感じる。 |
VLOOKUP関数は、シンプルで分かりやすいので、基本的な場面では今でも大活躍します。しかし、「検索キーが左にない」「複数の条件で検索したい」といった場面では、INDEX関数とMATCH関数の組み合わせが真価を発揮します。
まずはVLOOKUPをマスターし、その限界を感じた時に、このINDEX/MATCHの組み合わせに挑戦してみてください。あなたのスプレッドシートスキルが一段と向上するはずです。
この記事の前に見るVLOOKUP関数の記事は→
スプレッドシートのVLOOKUP関数を徹底解説!初心者でもわかる使い方と活用事例
そのほかの記事は→
コメント