Courses
VLOOKUP() は、列内で値を検索し、同じ行の別の列から一致する値を返す Google スプレッドシートの関数です。探したいものを渡し、どこを探すかを指定すると、必要なデータを返してくれます。
手作業での検索や照合に時間がかかる大きなデータセットで特に役立ちます。共有する値を使って2つの表を結び付けたいときは、VLOOKUP() が頼りになります。
このガイドでは、構文、手順、誤った結果が出る原因、そして INDEX MATCH() や XLOOKUP() といった代替手段を選ぶべき場面を解説します。
Google スプレッドシートの VLOOKUP() の構文は?
VLOOKUP() の構文は次のとおりです。
=VLOOKUP(search_key, range, index, [is_sorted])
各引数の意味は次のとおりです。
-
search_key:検索したい値 -
range:検索対象の表 -
index:結果を返す列番号 -
[is_sorted]:完全一致にするかどうかの指定
Google スプレッドシートで VLOOKUP() を行うには?
Google スプレッドシートで VLOOKUP() を使う手順は次のとおりです。
-
検索する値を決める:ID、名前、その他の一意な値など。
-
表の範囲を特定する:検索値を含む列が、その範囲の先頭列になるようにします。
-
返したいデータを選ぶ:結果の列(例:名前、価格、ステータス)。
-
新しいセルに
VLOOKUP()式を入力する:検索値、表の範囲、返したい列を参照します。 -
完全一致か近似一致かを指定する(
FALSEまたはTRUE):多くの場合、誤結果を避けるため完全一致を使います(後述)。
次のような表があるとします。
|
A (ID) |
B (Name) |
|
101 |
George |
|
102 |
Sarah |
|
103 |
Lily |
ID 102 の名前を見つけたい場合は、次のようにします。
=VLOOKUP(102, A2:B4, 2, FALSE)
これは Google スプレッドシートに次を指示します。
- A 列で 102 を探す
- B 列の値を返す
- 完全一致にする
結果は Sarah になります。

VLOOKUP() の例。画像提供:著者
VLOOKUP() の仕組み(ステップごとのロジック)
VLOOKUP() はシンプルな縦方向の検索プロセスに従います。選択した範囲の先頭列から始まり、最初に一致を見つけるまで上から下へ1行ずつ走査します。
一致を見つけたら、その行にとどまり、指定した列へ横に移動して値を返します。
手順を順に示すと次のとおりです。
- 範囲の先頭列から開始
- 列を下方向に検索
- 最初に一致した値を見つける
- 同じ行を横方向に移動
- 指定した列からデータを返す
従業員 ID E1007 の職位を見つけたいとします。次の式を使います。
=VLOOKUP("E1007", A:G, 5, FALSE)

Google スプレッドシートの VLOOKUP()。画像提供:著者
この式は次を行います。
-
A 列で
E1007を探す -
同じ行を横方向に移動する
-
5 列目(Job Title)を返す
-
結果は Software Engineer
注意:VLOOKUP() は左から右にしか検索できません。範囲の先頭列が検索列でない場合、この関数は機能しません。その場合はデータを並べ替えるか、別の関数を使ってください。これについては後ほど説明します。
VLOOKUP() の完全一致と近似一致
完全一致は値が同一の場合にのみ結果を返します。近似一致は、通常はソート済みデータに基づいて、完全一致が見つからないときに最も近い値を返します。
VLOOKUP() では最後の引数で制御します。最後の引数である FALSE または TRUE は、多くの人が間違えます。TRUE は無害に見えますが、そうではありません。
- FALSE は完全一致のみを意味します。値がなければ #N/A を返し、これはむしろ有用です。
- TRUE は完全一致がないときに直前の小さい値を返します。一見フォールバックに思えますが、実際には静かな誤答と言ったほうが正確です。さらにデータがソートされていることを前提にします。ソートされていない場合、結果は未定義です。
税率表や評定区分のように段階的な参照で、設計上近似が正しい振る舞いである場合にのみ TRUE を使うのがおすすめです。その他ほとんどの場面では FALSE を使ってください。
完全一致(FALSE)
これは VLOOKUP() に「この値が完全に一致したときだけ結果を返す」よう指示します。例えば、=VLOOKUP("E1005", A:G, 7, FALSE) は E1005 を探し、7 列目の給与を返し、90000 という結果になります。
値が存在しない場合は #N/A エラーになります。

VLOOKUP() の完全一致。画像提供:著者
近似一致(TRUE)
これは VLOOKUP() に「完全一致が見つからない場合は直前の小さい値を返す」よう指示します。便利に聞こえますが、時に静かに誤った答えを返します。
例えば、E1011 はデータセットに存在しません。最後の従業員 ID は E1010 です。したがって、=VLOOKUP("E1011", A:G, 7, TRUE) を使うと、VLOOKUP() はエラーを返さず、最も近い小さい一致である E1010 の値を返します。セルには 88000 と表示されます。
つまり E1011 が欠けていても、TRUE により近似一致が許可されているため、VLOOKUP() は結果を返してしまいます。

VLOOKUP() の近似一致。画像提供:著者
同じデータが順不同で、式に存在する従業員 ID を入力したとして、次のようにするとします:=VLOOKUP("E1011", A:G, 7, TRUE)。
この場合、検索列がソートされていないため、近似一致に依存する式は誤った給与を返します。

未ソートのリストにより VLOOKUP() の近似一致がエラーを起こす例。画像提供:著者
VLOOKUP() のよくあるエラーと対処法
ここでは、VLOOKUP() でよく遭遇する問題とその解決策を紹介します。
#N/A エラー
#N/A エラーは、VLOOKUP() が指定した値を見つけられなかったことを意味します。
例えば、この式:=VLOOKUP("E9999", A:G, 7, FALSE)
もし E9999 が範囲の先頭列に存在しなければ、式は #N/A を返します。
シートでの入力に余分なスペースや書式の違いがある場合にも発生します。
対処法:
-
値が範囲の先頭列に存在することを確認する
-
可能なら値を手入力せず正しいセル参照を使う
-
文字列をハードコードする場合は引用符で囲む
-
先頭・末尾の空白を除去する
-
完全一致が必要な場合のみ
FALSEを使う
列インデックスの誤り
列インデックスは、選択範囲内のどの列から返すかを VLOOKUP() に伝えます。インデックスの数値が大きすぎると、式は #REF! を返します。
=VLOOKUP("E1005", A:G, 8, FALSE) は #REF! を返します。範囲 A:G は 7 列しかないためです。

列インデックスの誤りによるエラー。画像提供:著者
列番号が有効でも、意図しない列を指していると誤った結果になることもあります。
例えば:
=VLOOKUP("E1005", A:G, 5, FALSE)
これは給与ではなく職位を返します。
対処法:
- 選択範囲の先頭列から列番号を数える
- 列番号が返したい値に対応しているか確認する
- その列が範囲内に存在することを確認する
近似一致の問題
TRUE を使うと、VLOOKUP() は完全一致を求める代わりに「直前の小さい一致」を探します。
=VLOOKUP("E1011", A:G, 7, TRUE) と入力し、データセットに E1011 が存在しない場合、エラーの代わりに E1010 の 88000 を返します。
見た目は正しそうでも、完全一致ではありません。
対処法:
-
厳密な結果が必要なときは
FALSEを使う -
データがソートされており近似で問題ない場合にのみ
TRUEを使う
範囲の問題
VLOOKUP() は、選択した範囲が式の意図と一致していないと動作しないことがあります。
例えば、=VLOOKUP("E1005", A:C, 7, FALSE) は #REF! を返します。範囲 A:C が 3 列しかないのに、式は 7 列目を要求しているためです。
もう一つのよくある問題は、検索列が範囲の先頭列でない場合です。
次の式を見てください。
=VLOOKUP("E1005", B:G, 7, FALSE)
ここでは、範囲の先頭列は A 列ではなく B 列です。VLOOKUP() は選択範囲の先頭列しか検索しないため、E1005 を見つけられません。
対処法:
- 検索列が範囲の先頭列であることを確認する
- 返したい列が範囲に含まれていることを確認する
- 式を確定する前に選択範囲を再確認する

範囲の誤りによるエラー。画像提供:著者
Google スプレッドシートでシートをまたいで VLOOKUP() を使う
範囲の前にシート名を付けることで、別シートからデータを取得できます。
書式は次のとおりです。
=VLOOKUP(search_key, SheetName!range, index, FALSE)
SheetName! の部分が、どのシートを検索するかを指定します。
データが Employees というシートにあり、別のシートで作業しているとします。従業員 ID E1005 の部署を見つけるには、次のようにします。
=VLOOKUP("E1005", Employees!A:G, 4, FALSE)
ここで:
-
Employees!A:Gは Employees シートを参照 -
4は Department 列を返す
この式は E1005 の部署を返します。

VLOOKUP() で別シートを参照。画像提供:著者
シート名にスペースがある場合
シート名にスペースが含まれる場合は、次のようにシングルクォートで囲みます。
=VLOOKUP("E1005", 'Employee Data'!A:G, 7, FALSE)
クォートがないと式は動作しません。
Google スプレッドシートの VLOOKUP() と INDEX MATCH の比較
VLOOKUP() は固定の列で検索して位置ベースでデータを返すのに対し、INDEX MATCH は行・列参照を直接使って値を見つけるため、表構造が変わっても動作します。
VLOOKUP:短く書けるが壊れやすい
すでに見たように、=VLOOKUP("E1005", A:G, 7, FALSE) は E1005 の給与を返します。
次のような場合にうまく機能します。
- 検索列が左側にある
- 表構造が変わらない
構造が変わると問題が始まります。
例えば:
- 新しい列を挿入する
- 給与列が 7 から 8 に移動する
- 式は依然として 7 を参照している
この結果、エラーも出さずに誤った値を返すようになります。
INDEX MATCH:長いが安定
同じ検索を INDEX MATCH で行うと次のとおりです。
=INDEX(G:G, MATCH("E1005", A:A, 0))
ここで:
-
MATCH()は A 列でE1005の位置を見つける -
INDEX()はその位置の G 列の値を返す
この方法は列番号に依存しないため、表が変わっても動作し続けます。

INDEX MATCH は VLOOKUP() より堅牢にデータを扱える。画像提供:著者
実際に役立つ場面
データが左から右に並んでいない場合は INDEX MATCH を使います。例えば、A 列に従業員 ID、C 列に姓があるとします。姓で検索して従業員 ID を返したい場合は、右から左への検索になります。
VLOOKUP() は表を並べ替えないと対応できませんが、INDEX MATCH なら直接対応できます。
=INDEX(A:A, MATCH("Wilson", C:C, 0))
データを並べ替える必要はありません。
Google スプレッドシートの VLOOKUP() と XLOOKUP の比較
VLOOKUP() は固定構造内での検索に制限がある一方、XLOOKUP() は任意の方向に検索できます。2022 年に Google スプレッドシートに追加され、多くのケースでより良い選択肢になっています。
例えば、姓の Wilson から 従業員 ID を見つけたいとします。これは右から左への検索です。VLOOKUP() は表の並べ替えなしには対応できませんが、XLOOKUP() なら可能です。
=XLOOKUP("Wilson", C:C, A:A)
この式は次を行います。
- 姓(C 列)を検索
- 従業員 ID(A 列)を返す

Google スプレッドシートの XLOOKUP()。画像提供:著者
XLOOKUP() が優れている点:
- 任意の方向(左・右)に対応
- 列番号を使わない
- 既定で完全一致を返す
- 一致しない場合のカスタム出力を指定できる
まとめ
アドバイスを一つだけ挙げるなら、練習用ではなく、実際に大事にしているスプレッドシートに VLOOKUP() を組み込んでみてください。データが重要だと、エラーの重みが変わります。TRUE が人の給与を静かに間違えるのを初めて経験したとき、FALSE の意義を忘れなくなります。
慣れてきたら、マッチタイプを変えたり、範囲を調整したりして、結果の一貫性が崩れるタイミングに気づいてください。たいていその時こそ、INDEX MATCH() や XLOOKUP() のような柔軟な選択肢が適切になります。
複雑なテーマをわかりやすくすることが好きなコンテンツストラテジストです。Splunk、Hackernoon、Tiiny Host などの企業で、読者にとって魅力的で有益なコンテンツの制作を支援してきました。
FAQs
`VLOOKUP()` でワイルドカードを使えますか?
はい。完全一致で使用する場合、検索キーに *(任意の文字列)や ?(任意の1文字)を使えます。
例:=VLOOKUP("E10*", A:G, 2, FALSE)
Google スプレッドシートで `VLOOKUP()` は大文字小文字を区別できますか?
いいえ。VLOOKUP() は大文字小文字を区別しません。「apple」と「Apple」は同じ値として扱われます。大文字小文字を区別した検索を行うには、FILTER() や EXACT() などの関数を使用してください。
なぜ `VLOOKUP()` が空白を返すことがあるのですか?
一致したセルが空の場合に発生します。これは式自体は正しく動作していますが、表示するデータがないことを示します。
`VLOOKUP()` は名前付き範囲を参照できますか?
はい。A:G の代わりに、名前付き範囲(例:EmployeeData)を作成して式で使用できます。
やり方の例:
=VLOOKUP("E1005", EmployeeData, 7, FALSE)
