更新: 2026年03月 · 7 分で読める · 3,420 文字
VLOOKUPが返すエラーの原因と即座の修正法
VLOOKUPはExcelで最頻出の関数ですが、#N/A、#REF!、#VALUE!などのエラーに直面することは珍しくありません。本記事では、VLOOKUPエラーの5つの主要な原因と、それぞれの対処法を実装例とともに解説します。これを読めば、エラー発生時に迷わず原因特定・修正できるようになります。
VLOOKUPエラーの全体像
VLOOKUPで発生するエラーは、その種類によって原因がほぼ決まっています。以下の表は主要なエラーと対応する原因です。
| エラー表示 | 主な原因 | 解決の優先順位 |
|---|---|---|
| #N/A | 検索値が見つからない | ★★★(最頻出) |
| #REF! | 参照範囲が無効 | ★★★ |
| #VALUE! | 列番号が数値でない、または検索値の型が不正 | ★★ |
| #NUM! | 列番号が範囲を超えている | ★★ |
| 予期しない数値が返される | 範囲指定のミスまたは完全一致モードの誤設定 | ★ |
原因別対処法
1. #N/Aエラー:検索値がテーブルに存在しない
状況:VLOOKUPが検索値を見つけられず、#N/Aが返される最も一般的なケースです。
よくあるハマりポイント:
- 空白や見えない文字(スペース)が含まれている
- データ型の不一致(テキストと数値)
- 範囲の最左列に検索値がない
対処法:以下のExcel数式を試してください。
' 方法1:IFERROR関数でエラーハンドリング
=IFERROR(VLOOKUP(A2,$C$2:$E$100,3,FALSE),"見つかりません")
' 方法2:TRIM関数で空白を除去してからVLOOKUP
=VLOOKUP(TRIM(A2),$C$2:$E$100,3,FALSE)
' 方法3:値が存在するか事前チェック(COUNTIF)
=IF(COUNTIF($C$2:$C$100,A2)=0,"見つかりません",VLOOKUP(A2,$C$2:$E$100,3,FALSE))
推奨される実装:実務ではIFERROR関数で#N/Aをキャッチするのが最短。TRIM関数を組み合わせると、スペース起因の不一致も防げます。
2. #REF!エラー:参照範囲が削除された
状況:VLOOKUP実行後に、参照先の列や行を削除すると#REF!が出ます。
よくあるハマりポイント:
- テーブルの列を挿入・削除した際に、VLOOKUP式が自動調整されない
- シート全体を削除してしまった
対処法:VLOOKUPの参照範囲を絶対参照にし、シート名も明示的に記述します。
' 正しい書き方:絶対参照を使用
=VLOOKUP(A2,マスタ!$A$1:$D$1000,3,FALSE)
' 列番号をINDEX/MATCH組み合わせで動的化(より堅牢)
=INDEX(マスタ!$A$1:$D$1000,MATCH(A2,マスタ!$A$1:$A$1000,0),3)
INDEX/MATCH組み合わせを使うと、列の挿入・削除の影響を受けにくくなります。
3. #VALUE!エラー:列番号が不正
状況:VLOOKUP関数の4番目の引数(列番号)がテキストや参照エラーになっている。
よくあるハマりポイント:
- 列番号を文字列として入力(例:"3"ではなく3を使用)
- COLUMN()関数の結果が意図した数値になっていない
対処法:
' 間違った例
=VLOOKUP(A2,$C$2:$E$100,"3",FALSE) ' "3"は文字列→エラー
' 正しい例
=VLOOKUP(A2,$C$2:$E$100,3,FALSE) ' 3は数値
' COLUMN関数を使う場合
=VLOOKUP(A2,$C$2:$E$100,COLUMN()-1,FALSE) ' 結果が必ず数値になる
4. #NUM!エラー:列番号が範囲を超えている
状況:参照範囲が3列なのに、4列目を指定している場合に発生。
対処法:参照範囲を確認し、列番号を修正します。
' 間違った例
=VLOOKUP(A2,$C$2:$E$100,5,FALSE) ' $C:$E は3列なのに5を指定
' 正しい例
=VLOOKUP(A2,$C$2:$E$100,3,FALSE) ' 最大3が指定可能
' 安全にするには、最大列数をCOLUMNS関数で取得
=IF(3>COLUMNS($C$2:$E$100),NA(),VLOOKUP(A2,$C$2:$E$100,3,FALSE))
5. 範囲指定のミス:部分一致と完全一致の混同
状況:VLOOKUP関数の5番目の引数をFALSE(完全一致)にすべきところ、TRUE(部分一致)にしてしまう。
よくあるハマりポイント:
- FALSEと0は同じ意味(完全一致)、TRUEと1は同じ意味(部分一致)
- 部分一致は検索列がソート済みであることが必須
対処法:
' 完全一致が必要な場合(ほとんどのケース)
=VLOOKUP(A2,$C$2:$E$100,3,FALSE)
=VLOOKUP(A2,$C$2:$E$100,3,0) ' FALSEと0は同一
' 範囲検索が必要な場合(検索列が昇順ソート済み)
=VLOOKUP(A2,$C$2:$E$100,3,TRUE)
=VLOOKUP(A2,$C$2:$E$100,3,1) ' TRUEと1は同一
VLOOKUPより優れた代替手段
Microsoft Excelの新バージョン(Excel 365以降)では、より柔軟な関数が提供されています。
XLOOKUP関数(推奨)
XLOOKUP は VLOOKUP の後継で、以下の利点があります:
' XLOOKUPの基本構文
=XLOOKUP(検索値, 検索配列, 戻り配列, [見つからない場合], [一致モード], [検索モード])
' 使用例:#N/Aを自動的に"見つかりません"に置き換え
=XLOOKUP(A2,$C$2:$C$100,$E$2:$E$100,"見つかりません")
' 複数列を左から検索可能
=XLOOKUP(A2,$C$2:$C$100,$D$2:$F$100,"見つかりません")
VLOOKUP vs XLOOKUP:VLOOKUPは左から右への検索のみですが、XLOOKUPは左右双方向検索が可能で、エラーハンドリングも組み込まれています。Excel 365を使用できる環境ではXLOOKUPを優先してください。
INDEX/MATCH組み合わせ
XLOOKUP非対応の環境では、INDEX/MATCH が堅牢な代替手段です。
' INDEX/MATCHの例
=IFERROR(INDEX($D$2:$D$100,MATCH(A2,$C$2:$C$100,0)),"見つかりません")
' 複数条件での検索にも対応可能
=IFERROR(INDEX($D$2:$D$100,MATCH(1,(A2=$C$2:$C$100)*(B2=$E$2:$E$100),0)),"見つかりません")
実践的なトラブルシューティングチェックリスト
VLOOKUPエラーが発生した場合、以下の順序で確認してください:
- 検索値の確認:TRIM関数で前後の空白を除去し、データ型(テキスト/数値)を統一
- 参照範囲の確認:最左列に検索値があるか、絶対参照($)が正しく設定されているか
- 列番号の確認:参照範囲内で指定した列番号が有効か、数値型か
- 一致モード確認:FALSE(完全一致)を使用しているか
- 代替手段検討:XLOOKUPやINDEX/MATCHの使用を検討
よくある質問
A. VLOOKUPはデフォルトで大文字と小文字を区別しません。区別が必要な場合は、EXACT関数とINDEX/MATCHを組み合わせてください:
A. INDEX/MATCHまたはXLOOKUPを使用します。以下はINDEX/MATCHの例です:
A. VLOOKUPは仕様上、左から右への検索のみです。右から左へ検索する場合はXLOOKUP、またはINDEX/MATCH組み合わせを使用してください。
まとめ
- #N/A エラー:検索値がテーブルに存在しない。TRIM関数で空白を除去し、IFERROR でエラーハンドリングを実装する
- #REF! エラー:参照範囲が削除された。絶対参照($)を使用し、可能ならばINDEX/MATCH に置き換える
- #VALUE! エラー:列番号がテキストまたは無効。列番号は常に数値型で指定する
- #NUM! エラー