VLOOKUPが#N/Aになる原因と直し方
エラー別トラブルシューティング完全版
VLOOKUPのエラーには必ず原因がある。エラー種類別に原因と対処法を体系的に整理する。
GASで検索処理を書くときも「見つからなかった場合」の処理が必要です。try-catch や undefined チェックは、IFERRORと同じ発想です。
GASで自動化を学ぶ →VLOOKUPエラーの全体像
VLOOKUPで出るエラーは主に4種類です。まずエラー名を確認して、該当する原因に進んでください。
| エラー | 意味 | 最多の原因 |
|---|---|---|
| #N/A | 値が見つからない | 検索値がマスターにない、または型の不一致 |
| #REF! | 参照エラー | 列番号が検索範囲の列数を超えている |
| #VALUE! | 値の型エラー | 列番号に数値以外が入っている |
| 間違った値 | エラーではないが結果が違う | 第4引数がTRUE(近似一致)になっている |
#N/A の原因と対処
原因1:データ型の不一致(最多)
検索値が数値なのにマスターが文字列、またはその逆。見た目は同じ「001」でも型が違うと一致しません。
確認方法:セルを選択してセルの書式を確認。数字が左寄りなら文字列、右寄りなら数値です。
// 検索値が文字列、マスターが数値の場合
=VLOOKUP(VALUE(A2), マスター!A:C, 2, FALSE) // A2を数値に変換
// 逆パターン:検索値が数値、マスターが文字列の場合
=VLOOKUP(TEXT(A2, "000"), マスター!A:C, 2, FALSE) // ゼロ埋め3桁の文字列に変換
原因2:スペースが混入している
コピペしたデータや外部から取り込んだデータにスペースが紛れ込んでいる場合。「田中 」と「田中」は別の値として扱われます。
// TRIM で前後スペースを除去してから検索
=VLOOKUP(TRIM(A2), マスター!A:C, 2, FALSE)
// マスター側も疑われる場合はARRAYFORMULAとTRIMを組み合わせてマスターを整形済みの列で参照する
原因3:検索値がマスターに本当に存在しない
入力ミスや登録漏れが原因。COUNTIFで確認するのが確実です。
// マスターにA2の値が何件あるか確認
=COUNTIF(マスター!A:A, A2)
// 0なら存在しない → 登録漏れか入力ミス
原因4:検索範囲の左端列がキー列になっていない
VLOOKUPは必ず検索範囲の左端列でキーを探します。マスターのB列がキーなのに A列から範囲を指定すると見つかりません。
// NG:B列がキーなのにA列から範囲を取っている
=VLOOKUP(A2, マスター!A:D, 3, FALSE) // ← A列で検索してしまう
// OK:B列から始める範囲に修正
=VLOOKUP(A2, マスター!B:D, 2, FALSE) // ← B列で検索
対処の定番:IFERRORで#N/Aを処理する
// #N/Aを空白に
=IFERROR(VLOOKUP(A2, マスター!A:C, 2, FALSE), "")
// #N/Aを「未登録」に
=IFERROR(VLOOKUP(A2, マスター!A:C, 2, FALSE), "未登録")
// #N/Aのみ処理(他のエラーはそのまま表示したい場合)
=IFNA(VLOOKUP(A2, マスター!A:C, 2, FALSE), "未登録")
IFERRORとIFNAの違い:IFERRORはすべてのエラーを捕捉します。IFNAは#N/Aのみ。#REF!などは表示させたい場合はIFNAを使います。
#REF! の原因と対処
列番号が検索範囲の列数を超えているときに発生します。
// 検索範囲がA:C(3列)なのに列番号が4
=VLOOKUP(A2, マスター!A:C, 4, FALSE) // ← #REF!
// 修正:列番号を3以内に収める、または範囲を拡張
=VLOOKUP(A2, マスター!A:D, 4, FALSE) // ← D列まで含めれば4列目でOK
マスターに列を挿入した後にこのエラーが増える場合は、検索範囲を「全列指定(A:D)」にするか、XLOOKUPに移行するのが根本解決です。
間違った値が返る(エラーではない)
原因:第4引数がTRUE(近似一致)になっている
第4引数を省略するとデフォルトでTRUEになります。TRUEは「検索値以下で最大の値を返す」動作で、昇順ソートされていないと予測不能な値を返します。
// NG:第4引数省略(TRUEが適用される)
=VLOOKUP(A2, マスター!A:C, 2)
// OK:必ずFALSEを明示
=VLOOKUP(A2, マスター!A:C, 2, FALSE)
原因:検索範囲が固定されていない(コピー時にずれる)
数式をコピーしたときに検索範囲がずれてしまうケースです。絶対参照($)で固定してください。
// NG:コピーすると範囲がずれる
=VLOOKUP(A2, B2:D100, 2, FALSE)
// OK:$で検索範囲を絶対参照に固定
=VLOOKUP(A2, $B$2:$D$100, 2, FALSE)
それでも直らないときの確認チェックリスト
- 検索値のデータ型(数値 vs 文字列)を確認したか
- TRIM で前後スペースを除去したか
- 第4引数を FALSE にしたか
- 検索範囲の左端列がキー列になっているか
- 列番号が検索範囲の列数以内か
- 検索範囲に絶対参照($)をつけてコピーしているか
上記を全部確認しても解決しない場合、VLOOKUPの制約(左側検索不可、重複キーは最初の1件のみ)が原因の可能性があります。その場合はXLOOKUPまたはINDEX+MATCHへの切り替えを検討してください。
この知識をGASで活かす
GASでデータ照合処理を書くときも「見つからなかった場合のハンドリング」が必要です。エラーへの向き合い方はスプレッドシートもGASも同じです。
Free Newsletter
AIを業務に活かしたいなら
SMR-Labメルマガ
毎週火曜10時、コピペで使えるChatGPTプロンプト・
GASテンプレートをお届け。登録は1分・完全無料。
