Excel VLOOKUPで値があるのに#N/Aになる(式は間違っていないのに)|文字列と数値の不一致を解消する方法

Excel VLOOKUPで値があるのに#N/Aになる(式は間違っていないのに)

この記事では、VLOOKUPで#N/Aなのに値が存在する原因を特定し、「区切り位置」「VALUE関数」「””(空文字連結)」を使った解決方法まで解説します。

VLOOKUPで検索すると#N/A。でもマスタを見ると、確かに値はある。式も間違っていない。「Excel壊れた?」――そんなときは落ち着いてください。この症状、かなりの確率で「文字列の123」と「数値の123」がぶつかっているだけです。

実際にはVLOOKUPの故障ではなく、Excelが「123(数値)」と「123(文字列)」を別のデータとして扱っていることが原因です。

VLOOKUP関数で式は合ってるのに#N/Aエラー

 

  1. 急いでいる人向け:まずこれを試す
  2. まず確認:あなたの症状はこれ?(30秒)
  3. なぜ起きる?「123」と「123」が別物になる仕組み
    1. VLOOKUPで#N/Aの原因が文字列か数値か確認する方法(TYPE関数)
    2. パッと見でも分かるサイン
  4. 直す前に決める:元データを変えていいか?
  5. 解決法A:元データの形式を統一する
    1. 方法A-1:まずは「区切り位置」を試す(最も解決率が高い)
    2. 方法A-2:緑の三角から「数値に変換する」
  6. 解決法B:数式の中で形式を揃える(元データを触らずに)
    1. 方法B-1:検索値を「数値」に変換する(マスタが数値のとき)
    2. 方法B-2:検索値を「文字列」に変換する(マスタが文字列のとき)
    3. 空白や制御文字もまとめて除去する
  7. よくある落とし穴と対処
    1. 落とし穴1:先頭ゼロのコードは「数値に変換」すると壊れる
    2. 落とし穴2:VALUEが効かない(英字や記号が混ざっている)
    3. 落とし穴3:形式は合っているのに直らない → 空白・全角半角を疑う
    4. 落とし穴4:XLOOKUPに変えても、この問題は起きる
  8. 運用改善:CSV取り込み時にPower Queryでデータ型を固定する
  9. よくある質問(FAQ)
    1. Q. セルの表示形式を「標準」に変えたのに直りません。
    2. Q. 文字列と数値、どちらに揃えるのが正解ですか?
    3. Q. 形式を変えたのに反映されません。
    4. Q. MATCH関数やXLOOKUPでも同じ現象が起きますか?
    5. Q. VLOOKUPのFALSEをTRUEにすると直りますか?
    6. Q. CSVを開くたびに毎回#N/Aになります。
  10. まとめ:1分チェックリスト

急いでいる人向け:まずこれを試す

原因の理屈より先に直したい人は、これだけ試してください。特にCSV取り込みデータでは、この操作だけで解決するケースが少なくありません。

  1. 検索値の列、またはマスタの検索列を1列だけ選択する。
  2. [データ]タブ → [区切り位置]をクリック。
  3. ウィザードが開いたら、何も変えずに[次へ]→[次へ]→[完了]。

これで直れば解決です。直らなければ、検索値とマスタの両方に同じ操作をしてみてください。それでもダメなら、この先の原因別の対処を読み進めてください。

(※区切り位置は1列ずつしか実行できません。複数列または行方向をまとめて選ぶとエラーになります。)

まず確認:あなたの症状はこれ?(30秒)

次のうち、2つ以上当てはまれば、このページの原因(数値と文字列の不一致)である可能性が高いです。

  • VLOOKUPの結果が#N/Aになる
  • でもマスタには、その値が確かに存在している
  • そのデータはCSV取り込み・基幹システム出力・Webからのコピペのいずれかで用意した

 

なぜ起きる?「123」と「123」が別物になる仕組み

Excelでは、同じ「123」でも内部的に数値の123文字列の”123″という、まったく別のものとして扱われることがあります。見た目はそっくりですが、VLOOKUPは厳密に一致を判定するため、この2つを「別の値」とみなします。結果、マスタに数値の123しかなければ、文字列の”123″で検索しても「見つからない=#N/A」となるわけです。

典型的なのは、検索値が文字列・マスタが数値(またはその逆)になっているパターン。どちらが文字列でどちらが数値なのかを最初に見極めるのが、解決への近道です。

VLOOKUPで#N/Aの原因が文字列か数値か確認する方法(TYPE関数)

一番確実なのは、関数でデータ型そのものを調べることです。別のセルに =TYPE(A1) と入力すると、次の値が返ります。

結果意味
1数値
2文字列

検索値とマスタを一度に比べたいときは、次のように並べると原因発見が早くなります。

=TYPE(A1)&"/"&TYPE(B1) → 結果が 1/12/2 なら一致、2/11/2 なら形式の食い違いです。

例えば、検索値が TYPE=2(文字列)、マスタ側が TYPE=1(数値)なら、見た目が同じ「123」でも一致しません。

VLOOKUPで「値があるのに#N/A」の場合、まずこのTYPE関数で検索値とマスタの型が一致しているか確認してください。原因特定の近道です。

=ISTEXT(A1)=ISNUMBER(A1)TRUE/FALSE を見る方法でも構いません。)

パッと見でも分かるサイン

サイン文字列のとき数値のとき
セル内の配置左寄せになりやすい右寄せになりやすい
セル左上の緑の三角「数値が文字列として保存されています」と出ることがある出ない
先頭のアポストロフィ'123 のように ' が付くことがある付かない

直す前に決める:元データを変えていいか?

解決法は大きく2系統あります。ここを最初に決めると迷いません。

解決法A:元データの形式を統一する解決法B:数式の中で形式を揃える
向いている場面元のセルを直接書き換えてOKなとき元データを残したい/触れない(共有ブック等)とき
やること「区切り位置」やエラーチェックで形式を変換VLOOKUPの中で VALUE&"" で変換
メリット一度直せば以降の式もすべて軽くなる元データを汚さず、再取り込みにも強い
注意点毎回CSVを落とす運用だと毎回直す必要あり数式が少し長くなる/先頭ゼロに注意

解決法A:元データの形式を統一する

検索値・検索範囲の両方を同じ形式(「G/標準」または「文字列」)に揃えます。片方だけでは一致しません。

方法A-1:まずは「区切り位置」を試す(最も解決率が高い)

データタブの「区切り位置」
[データ]タブの[区切り位置]から形式を変換します。
  1. 形式を揃えたい列を1列だけ選択する。
  2. [データ]タブ → [区切り位置]をクリック。
  3. ウィザードが開いたら、何も変えずに[次へ]→[次へ]と進む。
  4. [列のデータ形式]で「G/標準」または「文字列」を選び、[完了]をクリック。

期待される結果:左寄せだった数字が右寄せ(数値)に変わる、または逆に文字列に統一される。これを検索値の列とマスタの検索列の両方に行います。

区切り位置指定ウィザード
最後の画面で「G/標準」または「文字列」を選んで[完了]。

方法A-2:緑の三角から「数値に変換する」

「数値が文字列として保存されています」の緑の三角が出ているときは、これが最速です。

  1. 対象セルをまとめて選択する。
  2. 左上に出る[!]アイコンをクリック。
  3. 数値に変換する」を選ぶ。

期待される結果:文字列の数字が一括で数値に変わる。ただしこの方法は「文字列→数値」専用で、逆方向には使えません。


解決法B:数式の中で形式を揃える(元データを触らずに)

元データを書き換えたくない・できない場合は、VLOOKUPの式の中で形式を吸収します。どちらの形式に合わせるかで書き方が変わります。

方法B-1:検索値を「数値」に変換する(マスタが数値のとき)

検索値が文字列、マスタが数値のときは VALUE で数値に変換します。

=VLOOKUP(VALUE(C1), A1:B10, 2, FALSE)

短く書くなら C1*1C1+0--C1 でも同じです。

=VLOOKUP(C1*1, A1:B10, 2, FALSE)

方法B-2:検索値を「文字列」に変換する(マスタが文字列のとき)

マスタが文字列、検索値が数値のときは、検索値を文字列に変換します。一番手軽で確実なのは、末尾に空文字を連結する &"" です。

=VLOOKUP(C1&"", A1:B10, 2, FALSE)

桁を固定して揃えたいとき(例:4桁コード)だけ、TEXT 関数で桁数を指定します。単に文字列化したいだけなら &"" で十分です。

=VLOOKUP(TEXT(C1,"0000"), A1:B10, 2, FALSE)

空白や制御文字もまとめて除去する

後述の「空白」対策も同時に効かせるなら、こう書けます。

=VLOOKUP(TRIM(CLEAN(C1))&"", A1:B10, 2, FALSE)

※TRIMやCLEANは検索値側だけでなく、マスタ側に空白や制御文字が入っている場合もあります。検索値を掃除してもヒットしないときは、マスタ側も確認してください。


よくある落とし穴と対処

落とし穴1:先頭ゼロのコードは「数値に変換」すると壊れる

0012340567 のように先頭にゼロが付くコードは要注意です。数値に変換すると先頭ゼロが消えて 1234 になり、かえって一致しなくなります。社員番号・商品コード・郵便番号はこのパターンが多いです。

このタイプは、数値ではなく「文字列」に揃えるのが正解です。解決法B-2の &""TEXT(C1,"0000") を使い、検索値もマスタも文字列で統一してください。「とりあえず数値に変換」はコードデータでは禁じ手です。

落とし穴2:VALUEが効かない(英字や記号が混ざっている)

VALUE は「数字だけの文字列」を数値に変換する関数です。A-123 のように英字や記号が混ざった値に使うと #VALUE! エラーになります。コードに英字が含まれる場合は、数値化せず、両方を文字列のまま揃えてください。

落とし穴3:形式は合っているのに直らない → 空白・全角半角を疑う

形式を揃えても一致しないときは、目に見えない余分な空白全角・半角の違いが原因のことがあります。

  • 空白を除去 → TRIM 関数:=VLOOKUP(TRIM(C1), A1:B10, 2, FALSE)
  • 全角を半角に → ASC 関数(逆は JIS 関数)
  • 印刷されない制御文字を除去 → CLEAN 関数

落とし穴4:XLOOKUPに変えても、この問題は起きる

「新しいXLOOKUPなら?」と思われがちですが、結論から言うとXLOOKUPでも同じく一致しません。たとえば次の式でも、検索値が文字列の「123」・検索列が数値の123なら見つかりません。

=XLOOKUP(A1, D:D, E:E)

XLOOKUPは便利ですが、数値と文字列の違いまでは自動補正してくれないのです。とはいえ安心してください。XLOOKUPでこのエラーが出たときも、対処はこの記事と同じ(形式を揃える/VALUE&"" を使う)でそのまま通用します。


運用改善:CSV取り込み時にPower Queryでデータ型を固定する

毎回同じCSVを取り込むたびに「区切り位置」を実行しているなら、そもそも型がズレない仕組みにしたほうが効率的です。

「毎回CSVを落とすので、その都度直すのが面倒」という場合は、対症療法より取り込みの段階で型を固定するのが本筋です。現在はPower Query(パワークエリ)を使うのが主流で確実です。

  1. [データ]タブ → [データの取得] → ファイルからCSVを選ぶ。
  2. プレビューで該当列のヘッダーの型アイコンをクリックし、データ型を「テキスト」(コードなら文字列)に指定する。
  3. [読み込み]で取り込む。以降は同じ手順で更新すれば、毎回同じ型で入ってくる。

一度クエリを作っておけば、次回からはデータを差し替えて[更新]するだけ。形式違いの#N/Aを根本から防げます。

毎月・毎週同じCSVを取り込む業務なら、VLOOKUPを直すよりPower Queryを覚えたほうが結果的に楽になることもあります。


よくある質問(FAQ)

Q. セルの表示形式を「標準」に変えたのに直りません。

表示形式を変えただけでは、文字列の123は文字列のままです(見た目が変わるだけでデータ型は変わりません)。「区切り位置」や VALUE 関数で、実際のデータ型を変換してください。これは本当に多いつまずきです。

Q. 文字列と数値、どちらに揃えるのが正解ですか?

先頭ゼロや英字を含むコードなら文字列、純粋に計算にも使う数量・金額なら数値がおすすめです。「コード(識別用)」か「数量(計算用)」かで判断してください。

Q. 形式を変えたのに反映されません。

再計算されていない可能性があります。F9 キーで再計算し、検索値・マスタの両方が同じ形式になっているか確認してください。

Q. MATCH関数やXLOOKUPでも同じ現象が起きますか?

起きます。原因はVLOOKUPではなく、Excelが数値と文字列を別のデータとして扱う仕様だからです。MATCH、XLOOKUP、INDEX+MATCHでも同様に発生し、対処法もこの記事と同じです。

Q. VLOOKUPのFALSEをTRUEにすると直りますか?

直りません。FALSEは完全一致、TRUEは近似一致の検索ですが、いずれも文字列と数値の不一致は解消されません。むしろTRUEは意図しない値を返すことがあるため、FALSEのまま原因(形式の不一致)を解決することをおすすめします。

Q. CSVを開くたびに毎回#N/Aになります。

CSVをダブルクリックで開くと、Excelが自動的に数値・文字列を判定してしまいます。毎回発生する場合は、Power Queryや[データの取得]から取り込み、対象列を最初からテキスト型に固定するのがおすすめです。


まとめ:1分チェックリスト

VLOOKUPで値があるのに#N/Aになる場合、最も多い原因は「文字列」と「数値」の不一致です。特にCSVやシステム出力データでは頻繁に発生します。まずはTYPE関数でデータ型を確認し、区切り位置・VALUE関数・””で形式を統一しましょう。

原因特定から解決までの流れを整理すると、次のとおりです。

#N/A が出るマスタに値は存在する=TYPE() で確認結果が 1/2 や 2/1(形式不一致)「区切り位置」または VALUE / "" で形式を統一

  1. =TYPE()(または ISTEXT)で、検索値とマスタが文字列か数値かを判定する。
  2. 元データを直してよいなら → 解決法A(区切り位置/エラーチェックで変換、1列ずつ)。
  3. 元データを触りたくないなら → 解決法BVALUE または &"" で数式内変換)。
  4. 先頭ゼロ・英字を含むコードは、必ず「文字列」に揃える
  5. それでも直らなければ、空白・全角半角TRIM / ASC で潰す。
  6. 毎回CSVを取り込むなら、Power Queryで型を固定して再発を防ぐ。

VLOOKUPで#N/Aなのに値がある場合、まず疑うべきは「文字列と数値の不一致」です。式を何度見直しても解決しないときは、TYPE関数でデータ型を確認してみてください。原因が分かれば、ほとんどのケースは数分で解決できます。

編集長
古見遊 正

流通業で働きながら、2004年からWindowsを使い続けている80年代生まれのサラリーマン。ExcelとPowerPointを極め、仕事の効率化を追求中。苦手だったWordも克服中!Excelを使いこなせるだけで周囲から『神扱い』されるけれど、そのせいで『システムに詳しい人』だと勘違いされがち。でも、それが新しい知識を得るきっかけになった。そんな経験を活かして、Excel・PowerPoint・Word・Windowsの時短ワザ&仕事術を発信中!

古見遊 正をフォローする
ExcelのエラーExcel関数

コメント

タイトルとURLをコピーしました