VLOOKUPで「#N/A」「#REF!」「#VALUE!」が出た瞬間、突合や集計が止まり、締切や提出が頭をよぎって焦ってしまう方は少なくありません。しかも厄介なのは、エラーが出るだけでなく「エラーは出ないのに値が違う」ケースまで混ざることです。原因が分からないままIFERRORで隠してしまうと、未登録や参照崩れに気づけず、後工程で大きな手戻りにつながることもあります。
しかし、VLOOKUPの不具合は多くがパターン化されており、正しい順番で確認すれば短時間で復旧できます。ポイントは、参照範囲・列番号・完全一致の基本チェックで大半を片付け、次にスペースや型違いなど「一致しないデータの正体」を整形で見抜くことです。
この記事では、エラー表示から原因を逆引きできる診断手順を軸に、#N/A・#REF!・#VALUE!・#NAME?の直し方、値が間違う典型例、IFERRORの安全な使い分け、そして再発しにくい表の設計までを一気通貫で解説します。いま目の前のエラーを最短で解消し、次回から同じトラブルで止まらない状態を作りましょう。
※本コンテンツは「記事制作ポリシー」に基づき、正確かつ信頼性の高い情報提供を心がけております。万が一、内容に誤りや誤解を招く表現がございましたら、お手数ですが「お問い合わせ」よりご一報ください。速やかに確認・修正いたします。
VLOOKUPエラーを直す前に押さえる基本
VLOOKUPの仕組みと4つの引数
VLOOKUPは「表の左端列をキーにして縦方向に検索し、同じ行にある別列の値を返す」関数です。基本形は次のとおりです。
=VLOOKUP(検索値, 範囲, 列番号, 検索方法)
それぞれの引数を、エラー原因になりやすいポイントとセットで整理します。
検索値
探したいキーです(社員番号、商品コード、顧客IDなど)。
エラーが出るときは「検索値そのものが想定と違う(余計なスペース、型違い、全角半角の混在)」がよく起きます。
例:見た目は「123」でも、片方は文字列”123″、もう片方は数値123で一致しない。範囲
検索する表の範囲です。ここには「キー列」と「返したい値が入った列」を含める必要があります。
エラー原因として多いのは、範囲が狭すぎて返したい列が含まれていない、コピーで範囲がズレた、列追加で意図せず参照範囲が変になった、といったケースです。列番号
「範囲の左端列」を1として数えたときに、返したい列が何列目かを指定します。
ここはミスが非常に多く、列番号の数え間違い、列追加・削除後の放置、範囲変更に伴う不整合などが典型です。
例:A:Dの範囲なら列番号は1~4。列番号5を指定すると#REF!や#VALUE!の原因になります。検索方法
FALSEで完全一致、TRUEで近似一致です(省略すると近似一致扱いになる環境・状況があり得るため、原則は明示が安全です)。
値が間違うトラブルの大半は、ここを省略・TRUEのまま使ってしまうことが引き金になります。
VLOOKUPが壊れる原因を大別すると、次の2種類です。
引数の指定ミス(範囲・列番号・検索方法)
データの不整合(スペース、型、不可視文字、表の破損)
以降はこの分類に沿って、最短で原因を切り分けられるように解説します。
完全一致と近似一致で結果が変わる理由
VLOOKUPのトラブルで「エラーが出ている」ケースよりも、実は怖いのが「エラーは出ていないのに値が違う」ケースです。その中心にあるのが、完全一致と近似一致の違いです。
完全一致(FALSE)
検索値と完全に一致するキーが見つかったときだけ値を返します。見つからなければ#N/Aになります。
突合・名寄せ・コード参照のように「同じIDの行を引く」目的なら、基本はこれです。近似一致(TRUE)
検索値に最も近い(小さい側の)値を返すような挙動になります。用途としては、段階表(例:点数→評価、金額→手数料率)などで使われます。
ただし、近似一致は参照表が昇順に並んでいることが前提です。並びが崩れていると、意図しない値を返しやすくなります。
よくある事故の例です。
本当は社員番号を完全一致で引くべきなのに、検索方法を省略して近似一致になり、似た番号の行を拾ってしまう
料金表を近似一致で引いているが、途中で表を並べ替えて昇順が崩れ、別の区分の値を返してしまう
「#N/Aが出るのが嫌だからTRUEにした」「省略したまま動いているから気にしていない」は危険です。
突合作業では、#N/Aが出ること自体は「未登録・不一致を可視化している」という意味で、むしろ健全な状態です。まずはFALSEに統一し、それでも必要な場面だけ近似一致を使う、という順序が安全です。
左端列の制約と表の作り方
VLOOKUPには、設計上の大きな制約があります。検索値(キー)にする列が、範囲の一番左に存在していなければならないという点です。
たとえば、次のような表を想像してください。
A列:商品名
B列:商品コード
C列:単価
ここで「商品コードを検索して単価を返したい」のに、範囲をA:Cにして検索値をB列のコードで探そうとしても、VLOOKUPは範囲の左端A列(商品名)しかキーにできません。結果として#N/Aになったり、別の値を引いたりする原因になります。
この制約に対する基本方針は2つです。
表の設計を変える(キーを左端にする)
商品コードで引きたいなら、商品コード列を左端にする(列を入れ替える、別表を用意する)
この方法は分かりやすく、VLOOKUPを続けるなら最も手堅いです。VLOOKUP以外を使う
代表例がXLOOKUPやINDEX+MATCHです。これらは「左端列である必要がない」「返す列が左側でもよい」など、VLOOKUPの制約を回避できます。
ただし、職場の環境やExcelのバージョン、引き継ぎ事情もあるため、「どこまで置き換えるか」を判断する材料として後半で整理します。
VLOOKUPのエラー対処は、式だけをいじって直す場合もあれば、表の作りそのものを変えた方が早い場合もあります。まずは制約を理解し、「VLOOKUPで解決する問題なのか」を見極めることが重要です。
VLOOKUPエラーの診断手順
まず確認する3点 参照範囲 列番号 完全一致
エラー対応で一番の近道は、「当てずっぽうで直さない」ことです。最初の確認を固定し、上から順に潰すだけで、原因特定が速くなります。ここでは最初の30秒で見るべき3点を具体化します。
参照範囲が正しいか
範囲に「キー列」と「返したい列」が入っているか
範囲の開始位置がズレていないか(キー列の途中から始まっていないか)
行数が足りず、必要なデータが範囲外になっていないか
コピーした式の場合、参照範囲が移動していないか(固定されているか)
固定の考え方として、次のようにします。
コピーして使う参照表は、基本的に絶対参照にする:
$A$2:$D$1000行が増えるなら、テーブル化して範囲が自動で伸びるようにする
列番号が正しいか
列番号は「範囲の左端を1」として数えます。ここが曖昧だと、返す列がズレます。
返したい列が範囲の何列目かを数え直す
列追加・削除をしたなら、列番号が変わっていないかを必ず確認する
範囲を変えた場合も、列番号が合っているかを再確認する
完全一致(FALSE)になっているか
突合目的なら、原則FALSEです。
=VLOOKUP(検索値,範囲,列番号,FALSE)と明示する省略していないか(省略がトラブルの種になります)
近似一致が必要な業務(段階表)だけTRUEにする
この3点を直すだけで、#N/A・#REF!・誤値取得の多くが解消します。ここで直らなければ、次の「データの中身」を疑います。
次に疑う3点 スペース 型 不可視文字
「表にあるのに見つからない」「人間の目では一致しているのに#N/A」といったケースの原因は、ほぼデータ不整合です。特に多い3つを、確認方法と対処方法まで含めて整理します。
スペース(前後・連続・全角)の混入
外部システムのCSVや、Webからのコピー、別ブックからの貼り付けで起きやすいです。
確認のコツは、見た目ではなく長さで見ることです。
=LEN(A2)で文字数を確認する余計なスペースがあると、見た目より文字数が大きくなります
対処の定番はTRIMです。
=TRIM(A2)(前後の余分なスペース、連続スペースの整理)
ただし、TRIMは全角スペースには弱い場合があります。全角スペースが混ざる環境では、置換(全角スペース→空)や、入力ルールの統一も検討してください。
文字列と数値の型違い
これも非常に多い原因です。
片方は「数値としての123」
もう片方は「文字列としての”123″」
この場合、VLOOKUPの完全一致では一致しません。
確認のコツ:
左上に緑の三角が出ている(数値が文字列として扱われている可能性)
=ISTEXT(A2)や=ISNUMBER(A2)で型を判定する(判定列を作ると速い)
対処は「どちらに揃えるか」を決めることです。
数値に揃える:
=VALUE(A2)文字列に揃える:
=TEXT(A2,"0")(先頭ゼロが必要な場合は特に有効)
不可視文字(改行、タブ、制御文字)の混入
改行コードや制御文字が混ざると、TRIMだけでは取り切れず一致しないことがあります。
対処の定番はCLEANです。
=CLEAN(A2)(印刷できない文字の除去)
実務ではTRIMとCLEANを組み合わせた「整形キー」を作り、それで突合するのが確実です。
整形キー例:
=TRIM(CLEAN(A2))
まず「整形したら一致するか」を確認し、整形で直るなら、原因はデータ由来だと判断できます。根本対策は、入力ルールの統一や、取り込み時の前処理です。
最後に見る3点 列の追加削除 ソート 外部参照
引数もデータも問題なさそうなのにおかしい場合は、「運用上の事故」を疑います。ここでは、現場で頻発する3パターンを整理します。
列の追加・削除による参照崩れ
列を挿入したら列番号がズレた
範囲指定が想定外に変わった
他人が列を削除して参照先が消えた(#REF!)
対策としては、式を修正するだけでなく、表の運用ルールを決めることが重要です。
参照表はテーブル化し、列見出しで管理しやすくする
列追加・削除を想定するなら、VLOOKUPではなくXLOOKUPやINDEX+MATCHを検討する
ソート(並べ替え)で表自体が壊れた
VLOOKUP以前に、表の対応関係が壊れていることがあります。
典型は「列の一部だけ選択して並べ替えた」ケースです。商品コードと単価のペアがズレれば、どんな関数でも誤った単価を返します。
対策:
ソートは必ず表全体を選択して行う
テーブル化して、表の一体性が崩れにくい状態にする
重要な表は保護や共有ルールを決める
外部参照(別ブック・別ファイル)に起因する不整合
別ブック参照は便利ですが、次のような事故が起きがちです。
参照元ファイルが移動・改名され、リンクが切れる
参照元が閉じていて計算結果が更新されないように見える
ネットワークドライブの遅延や権限で参照が不安定
対策:
参照元を同じフォルダに置く、パス変更を避ける
参照元を開いて更新し、計算の整合を取る
重要なマスタは可能なら同一ブック内に集約する
この章の診断フローを上から回すだけで、原因の8割以上は特定できます。次章からは、エラー別に「原因×確認×直し方」を深掘りします。
VLOOKUPの#N Aエラーが出る原因と直し方
検索値が見つからないときの確認ポイント
#N/Aは「見つからない」ことを示します。ここで重要なのは、#N/Aを「悪」と捉えないことです。突合目的では、#N/Aは未登録や入力ミスを可視化する重要なシグナルになり得ます。まずは次のポイントを順番に確認します。
検索値が本当に存在するか
フィルターで絞り込む、検索(Ctrl+F)で探すなど、目視ではなく機能で確認すると確実です。
例:検索値に余計なスペースがあると、目視では同じに見えて見落とします。検索対象の列が範囲の左端にあるか
左端列制約により、表にあっても検索できないことがあります。
「キー列が左端か」を最初に疑うだけで、遠回りが減ります。完全一致(FALSE)で設計しているか
完全一致で見つからないなら#N/Aは自然です。
逆に#N/Aが嫌だから近似一致にしてしまうと、「見つからない問題」が「誤値を拾う問題」に変わり、事故が大きくなります。重複キーがないか
同じキーが複数あると、VLOOKUPは最初に見つかった行を返します。#N/Aではなく誤値の原因ですが、#N/A対応の過程で必ず確認しておくと安全です。参照表の範囲に、必要な行が含まれているか
新しいデータが追加されたのに範囲が固定のままだと、存在していても範囲外で見つかりません。
テーブル化しておくと、この事故は大きく減ります。
「存在確認」「左端列」「完全一致」「範囲の包含」を押さえた上で、それでも見つからない場合に、次の「データ整形」へ進むのが最短です。
表にあるのに見つからないときのデータ整形
表にあるのに#N/Aが出る場合、ほぼデータの見た目と実体が一致していません。ここでは、よくある原因と、すぐ試せる整形手順を、実務で使いやすい形でまとめます。
まず、最短のやり方は「整形列を作って、整形後の値同士で照合する」ことです。式を一発で複雑にするより、原因が見えるためトラブルシュートが速くなります。
手順1:検索値側の整形列を作る
=TRIM(CLEAN(A2))
A2が検索値なら、この整形結果を別セル(例:B2)に作ります。
手順2:参照表側のキー列にも整形列を作る
参照表のキー列がD列なら、E列などに
=TRIM(CLEAN(D2))を作り、下までコピーします。
手順3:整形列同士でVLOOKUPする
検索値側がB2、参照表の整形キーがE列から始まる範囲なら、例えば次のようになります。
=VLOOKUP(B2,参照表!$E$2:$H$1000,列番号,FALSE)
整形で一致した場合、原因は次のいずれかが濃厚です。
前後スペース(TRIMで改善)
不可視文字(CLEANで改善)
型違い(VALUE/TEXTで揃える必要)
型違いが疑わしい場合は、整形列を次のように変えて試すと切り分けが速いです。
数値に揃える:
=VALUE(TRIM(CLEAN(A2)))文字列に揃える(先頭ゼロが必要なコード):
=TEXT(A2,"0")や=TEXT(VALUE(A2),"0")
「整形で一致する」ことが分かったら、次は根本対策です。
入力ルール(数値/文字列、先頭ゼロの扱い)を明文化する
外部データ取り込み時に整形してから貼り付ける
マスタ側を整形済みの列で持つ(運用で安定させる)
場当たり的にIFERRORで隠すより、整形で一致させる方が、再発防止につながります。
エラーを表示しないIFERRORの使いどころ
IFERRORは「見栄えを整える」ために使われがちですが、誤用すると「異常を検知できないシート」になります。特に、請求・在庫・給与などミスの影響が大きい領域では、IFERRORの使い方を明確にしておく必要があります。
よくあるIFERRORのパターンと向き不向きは次のとおりです。
空欄にする
=IFERROR(VLOOKUP(...),"")
見た目は綺麗ですが、「未登録なのか、単に空欄なのか」が分からなくなります。
向くケース:見た目優先の一覧で、別途チェック列がある
向かないケース:未登録が重大な意味を持つ(請求漏れなど)未登録などのメッセージを出す
=IFERROR(VLOOKUP(...),"未登録")
未登録を可視化でき、後工程で対応しやすいです。
向くケース:突合の抜けを拾いたい、入力不備を洗い出したいエラーを別列で監視し、表示列は整える
例えば、表示列はIFERRORで空欄にしつつ、監視列で=IF(ISNA(VLOOKUP(...)),"要確認","OK")
のように検知する方法があります。
向くケース:見た目と監視を両立したい
基本方針としては、原因究明中はIFERRORを外し、直ってから必要に応じて付けるのが安全です。エラーを隠した状態では、改善したのか、ただ見えなくなっただけなのかが判断できません。
VLOOKUPの#REF! #VALUE! #NAME?を直すコツ
#REF!で参照が壊れたときの復旧
#REF!は「参照が無効」になったときのエラーです。VLOOKUPで特に多いのは、次の2つです。
列番号が範囲の列数を超えている
範囲がA:C(3列)なのに、列番号を4にしているなど。
対処:範囲を返したい列まで含めて広げる、または列番号を正しくする
切り分け:範囲の列数を数える(左端を1として何列あるか)
参照先が削除された、または範囲が壊れた
列削除、シート削除、参照表の構造変更などで、式が指していた場所が消えると起きます。
対処:参照範囲を選択し直す(手でドラッグし直すのが早い)
対処:列番号も数え直す(範囲を直しただけでズレることがある)
復旧のコツは「式を分解して、どこが破綻しているかを可視化する」ことです。
参照範囲だけを先に直す
次に列番号を直す
最後に検索方法をFALSEに固定する
この順番で戻すと、やみくもに触って悪化させにくくなります。
再発防止としては、列追加・削除が頻繁な表にVLOOKUPを直結させない、テーブル化や代替関数を検討する、といった設計改善が有効です。
#VALUE!になりやすい入力ミスと修正
#VALUE!は「値の型や構文が不正」なときに出やすいエラーです。VLOOKUPで多い原因を具体的に挙げます。
列番号が数値になっていない、または0以下
列番号は1以上の数値が必要です。
例:=VLOOKUP(A2,$D$2:$F$100,"2",FALSE)のように、列番号を文字列で渡す
→ 環境によっては想定外の挙動やエラーになります。
対処:列番号を数値で指定する(”2″ではなく2)。引数区切りや括弧のミス
コピペや編集の途中で、カンマが抜けたり括弧が閉じていなかったりすると、#NAME?だけでなく#VALUE!に繋がることもあります。
対処:引数を1つずつ区切って確認する。編集バー上で括弧の対応を確認する。検索方法引数に不正な値を入れている
TRUE/FALSE以外の値を入れると、意図と違う結果になったり、エラーを引き起こすことがあります。
対処:突合ならFALSEに固定し、省略しない。範囲が不正(文字列として渡してしまう等)
参照の編集ミスで、範囲が正しく指定できていない場合があります。
対処:範囲は手でドラッグして入れ直すと確実です。
#VALUE!は「式の形が崩れている」可能性が高いので、データより先に式の構造を疑うのが近道です。特に列番号は盲点になりやすいため、最初に確認してください。
#NAME?が出たときの見落としやすい原因
#NAME?は「Excelが名前を解釈できない」状態です。VLOOKUP周辺での原因は、かなり絞れます。
関数名のスペルミス
VLOOKUPをVLOOOKUPのように打ち間違える、または全角文字が混ざる、など。
対処:関数名を正しい綴りに直す。入力候補から選ぶとミスが減ります。文字列のダブルクォーテーション不足
例えば、エラー表示を文字で返すつもりが=IFERROR(VLOOKUP(...),未登録)
のように引用符がないと、未登録という「名前」を参照しようとして#NAME?になります。
対処:"未登録"のように引用符を付ける。名前定義(範囲名)が存在しない
範囲に名前を付けて使っている場合、名前が消えたり、別ブックで引き継がれなかったりすると起きます。
対処:数式内の名前が存在するか確認し、必要なら範囲指定に戻す。区切り記号・引数の記法が環境と合っていない
一部環境では区切りがカンマではなくセミコロンになるなど、設定差が影響する場合があります。
対処:その環境の標準に合わせて式を入力し直す(入力候補を使うと吸収しやすいです)。
#NAME?は「名前に関するミス」なので、関数名・引用符・範囲名の3点を確認すれば、かなりの確率で解決します。
VLOOKUPで値が間違うときの原因と再発防止
近似一致TRUEで誤った値を拾うパターン
値が間違うトラブルは、エラーよりも発見が遅れ、成果物に混入しやすい点で危険です。最優先で疑うべきは近似一致です。
近似一致が引き起こす典型的な誤り:
完全一致すべきコード照合で、似た値を拾う
例:検索値が1050なのに、表から1049の区分を拾ってしまう昇順が崩れている参照表で、誤った区分を拾う
例:段階表が途中で並べ替えられ、正しい境界が壊れている
対策は明確です。
突合・名寄せ・参照マスタは FALSEを必ず明示
=VLOOKUP(A2,$D$2:$F$100,2,FALSE)近似一致を使う場合は、参照表の昇順・境界条件・運用ルールをセットで管理する
例えば「境界値の重複を許さない」「表の並べ替えは固定」「更新担当を限定する」など。
近似一致は便利ですが、管理が甘いと誤値を生みます。「なぜTRUEにしているのか」を説明できないなら、まずFALSEに戻すのが安全です。
列番号ずれと範囲固定で起きる事故
次に多いのが、列番号と範囲固定の事故です。これらは「最初は正しかったのに、後から壊れる」タイプの代表です。
列番号ずれ
列を追加・削除しても、VLOOKUPの列番号は自動で意図を追いません。
例:単価列を追加した結果、列番号3で返していたものが、実は別の列を返すようになった。
対策:列追加・削除があり得る表では、列番号依存の設計を避ける(後述の代替関数、またはテーブル化で管理しやすくする)。範囲固定漏れ
オートフィルで式を下にコピーすると、相対参照の範囲はずれていきます。
例:=VLOOKUP(A2,D2:F100,2,FALSE)をコピーすると、D3:F101になり、参照表がずれていく
対策:参照表は絶対参照にする=VLOOKUP(A2,$D$2:$F$100,2,FALSE)範囲固定のやり過ぎで行追加に追従しない
固定しているがゆえに、参照表が増えたときに範囲外になり、#N/Aが増える
対策:テーブル化、または十分な行数を見込む、もしくは範囲を動的に管理する
ここは「固定する」「追従させる」という相反する要件が出やすいところです。最も現実的で事故が少ないのは、参照表をテーブル化して追従させる方法です。
壊れにくい設計 テーブル化と代替関数
VLOOKUPのトラブルを減らすには、都度直すより「壊れにくい設計」に寄せる方が結果的に速くなります。ここでは代表的な2つの方向性を整理します。
テーブル化で参照範囲の事故を減らす
テーブル化すると、行追加に追従しやすく、フィルターやソートも表の一体性を保ちやすくなります。
特に「参照表が更新され続ける」業務では、固定範囲のまま運用するより事故が減ります。
また、列見出しが明確になるため、表の管理がしやすくなります。代替関数を使ってVLOOKUPの制約を回避する
VLOOKUPの弱点は主に次の3点です。
左端列制約(キーが左端でないと検索できない)
列番号依存(列追加・削除で壊れやすい)
近似一致の誤用による誤値取得
これらを回避したい場合、次の方向が候補になります。
XLOOKUP:検索列と戻り列を分けて指定でき、列番号依存が薄い
INDEX+MATCH:柔軟で、戻り列が左側でも可能
表設計の見直し:キー列を固定し、参照用のマスタを別途整備する
ただし、どれが最適かは「環境」「引き継ぎ」「利用者の習熟度」に左右されます。チームで共有する帳票なら、誰が見ても壊しにくい形(テーブル化+FALSEの徹底+監視列)をまず整えるのが現実的です。
VLOOKUPエラーのよくある質問
空白なのに一致しないのはなぜ
空白に見えるのに一致しない原因は、次のどれかであることが多いです。
実際にはスペース(半角・全角)が入っている
改行やタブなど不可視文字が入っている
数式が
""(空文字)を返しているが、別のセルは完全な空白で扱いが違う片方が文字列、片方が数値で、空白と同様に見えているだけ
確認のコツは、目視ではなく関数で「実体」を確かめることです。
=LEN(A2)で文字数を確認する=A2=""の判定が想定どおりかを見る必要に応じて
TRIMやCLEANを適用する
空白問題は「見た目」と「値」がズレている典型です。整形列を作って比較すると、原因が掴みやすくなります。
0が返るのはエラーではないのか
0はエラーではありません。主に次のどちらかです。
参照した結果が0(単価0、数量0など)
計算結果が0(四則演算の結果など)
ただし注意点があります。IFERRORでエラー時に0を返す設計にしていると、「本当は未登録なのに0」になってしまい、見落としの原因になります。
未登録と0を区別したいなら、次のようにします。
エラー時は”未登録”など文字で返す
監視列で未登録を検知する(表示列は別に整える)
0が正常値としてあり得る業務ほど、IFERRORで0を返す設計は避けた方が安全です。
VLOOKUPより安全な方法はどれ
「安全」は目的によって変わりますが、判断の軸を明確にすると選びやすくなります。
キーが左端に置ける、表の列構造が安定している
→ VLOOKUPでも運用可能。ただしFALSE明示とテーブル化、監視列の導入がおすすめです。キーが左端に置けない、列追加・削除が頻繁、誤値の影響が大きい
→ XLOOKUPやINDEX+MATCHの検討価値が高いです。列番号依存を減らせます。チームの利用者が多く、引き継ぎ前提でシンプルさを重視したい
→ まずは表設計と運用ルール(入力統一、ソートルール、未登録表示の方針)を固める方が効果が出やすいです。
最終的には「どのトラブルが一番多いか(#N/Aなのか誤値なのか、参照崩れなのか)」を見て、設計を寄せるのが確実です。