VLOOKUP関数の使い方|基本から#N/Aエラーの直し方まで

執筆者:

カテゴリ:

VLOOKUPは、表の中から目的の値を探して、同じ行の別の列を取り出す関数です。「商品コードから商品名を引く」「社員番号から部署名を引く」といった、表と表を突き合わせる作業で使います。

スプレッドシートで最もよく使われる関数のひとつですが、同時にエラーで詰まりやすい関数でもあります。この記事では基本の使い方に加えて、#N/A が出たときの原因の切り分け方まで扱います。

書式

=VLOOKUP(検索キー, 範囲, 列番号, [検索の型])
引数 内容
検索キー 探したい値。セル参照でも直接入力でも可
範囲 探しに行く表の範囲。左端の列が検索対象になる
列番号 範囲の左端を1として、取り出したい列が何番目か
検索の型 FALSE=完全一致 / TRUE=近似一致(省略時はTRUE)

4つ目の引数は必ず FALSE を書いてください。 省略すると近似一致になり、意図しない値が返ります。理由は後述します。

基本の使い方

こんな商品マスタがあるとします。

A B C
1 商品コード 商品名 価格
2 A-101 ボールペン 150
3 A-102 ノート 320
4 B-201 ハサミ 480
5 B-202 ホチキス 890

ここから「B-201」の商品名を取り出します。

=VLOOKUP("B-201", A2:C5, 2, FALSE)

結果:ハサミ

引数を順番に読むとこうなります。

  1. 1. "B-201" を探す
  2. 2. A2:C5左端の列(A列)から探す
  3. 3. 見つかった行の2列目(B列)を返す
  4. 4. FALSE なので完全に一致するものだけ

価格が欲しいなら、列番号を 3 に変えます。

=VLOOKUP("B-201", A2:C5, 3, FALSE)   → 480

実務での書き方

実際には検索キーをセルで指定し、数式を下方向にコピーします。このとき範囲は絶対参照($付き)にするのが必須です。

=VLOOKUP(E2, $A$2:$C$5, 2, FALSE)

$ を付けないと、下にコピーしたときに範囲がずれて A3:C6A4:C7…と下がっていき、表の下のほうがヒットしなくなります。これが「途中から急に#N/Aになる」典型的な原因です。

範囲の指定は $A$2:$C$5 のように行を固定してもいいですが、行が増える可能性があるなら A:C と列全体で指定するほうが安全です。

=VLOOKUP(E2, A:C, 2, FALSE)

4つ目の引数を省略してはいけない理由

FALSE を省略すると TRUE(近似一致)として扱われます。近似一致は範囲の左端列が昇順に並んでいる前提で動き、検索キー以下の最大値を拾います。

先ほどの表で =VLOOKUP("B-999", A2:C5, 2) とすると、完全一致する「B-999」は無いのに、エラーにならず ホチキス(B-202の行)が返ります。間違いに気づけないのが最大の問題です。

近似一致には「点数から評価を出す」といった正当な用途もありますが、意図して使う場合以外は必ず FALSE を書いてください。

エラーの原因と対処

#N/A が出る

「見つからなかった」という意味です。原因は次のどれかがほとんどです。

1. 検索キーが範囲の左端列にない

VLOOKUPは範囲の左端列しか検索しません。商品名から商品コードを引く(=右から左)ことはできません。→ XLOOKUPINDEX+MATCH を使ってください。

2. 余分なスペースが入っている

"B-201 " のように末尾に半角スペースがあると一致しません。見た目では気づけないので、疑わしいときは検索キーを TRIM() で囲みます。

=VLOOKUP(TRIM(E2), A:C, 2, FALSE)

3. 数値と文字列が食い違っている

101(数値)と "101"(文字列)は別物として扱われます。片方がセルの左寄せ、もう片方が右寄せになっていたらこれです。

4. 範囲がずれている

前述の絶対参照の問題です。

#N/A を空欄にしたい場合は IFERROR で包みます。

=IFERROR(VLOOKUP(E2, A:C, 2, FALSE), "")

ただし原因を確かめる前にIFERRORで隠すのは危険です。本当は取得できるはずのデータが黙って消えます。まず原因を特定してから包んでください。

#REF! が出る

列番号が範囲の列数を超えています。範囲が A:C(3列)なのに列番号に 4 を指定した、というケース。

結果が全部同じ値になる

検索キーを絶対参照にしてしまっている可能性があります。$E$2 ではなく E2 です。範囲とは逆なので混同しやすいところです。

列を挿入すると壊れる問題

VLOOKUPの列番号は「範囲の左から何番目」という位置で指定します。そのため、表の途中に列を挿入すると、数式の指す列がずれて壊れます。

対策は2つあります。

  • XLOOKUP を使う(列番号ではなく範囲で指定するのでずれない)
  • MATCH で列番号を動的に求める
=VLOOKUP(E2, A:C, MATCH("価格", A1:C1, 0), FALSE)

Excelとの違い

書式と挙動はExcelと同じです。ただしExcelでは VLOOKUP の後継として XLOOKUP が推奨されており、スプレッドシートでも同様に XLOOKUP が使えます。新しく作るならXLOOKUPのほうが素直です。

両者の使い分けは VLOOKUPとXLOOKUPの違い にまとめています。

まとめ

  • – 書式は =VLOOKUP(検索キー, 範囲, 列番号, FALSE)
  • 4つ目の引数 FALSE は必ず書く
  • – 範囲は絶対参照か列全体で指定する
  • – 検索できるのは範囲の左端列だけ
  • #N/A の多くはスペース・型違い・範囲ずれが原因

関連する関数

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です