#N/Aエラーの直し方|探した値が見つからないときに確認する6か所

執筆者:

カテゴリ:

#N/Aエラーの直し方のイメージ

目的別

#N/Aエラーの直し方

Excel関数辞典

#N/A は 「探したけれど、見つからなかった」という報告です。 数式が壊れているわけではありません。指定どおりに探して、無かった。それだけを伝えています。

ですから直し方は1つしかありません。なぜ見つからなかったのかを突き止めることです。 出るのはほとんどが VLOOKUP、XLOOKUP、 MATCH の3つです。

このページの中身(25項目)
  1. まず、検索値だけを取り出して確かめる
  2. 1. 見た目は同じでも、文字が違う
  3. 2. 探す範囲が、思っているところからずれている
  4. 3. 探す値が、範囲のいちばん左の列に無い
  5. 4. 探す先が空欄、または範囲がまだ埋まっていない
  6. 5. 4つ目の引数を省略している、またはTRUEにしている
  7. 6. XLOOKUP や MATCH の検索方法が合っていない
  8. #N/A のまま残してよい場合がある
  9. #N/A だけを見つけて数える
  10. 症状から原因を引く
  11. 関数別:#N/A が出る場面
  12. 実際に来そうな相談と、その読み解き
  13. 直す前のチェックリスト
  14. よくある質問
  15. 実際の表で追ってみる
  16. まとめて直す手順
  17. エラーの行を目立たせておく
  18. VLOOKUP をやめるという選択
  19. 直った後に確認すること
  20. 探される側(マスタ)に原因があることもある
  21. キーが1列で足りないとき(複合キー)
  22. 業務でよく出るパターン別
  23. #N/A を出さない設計にする
  24. この3つのエラーは、どこが違うのか
  25. エラーを消す前に

まず、検索値だけを取り出して確かめる

原因を探す前に、切り分けを1つだけしてください。 別のセルに =COUNTIF(探した範囲, 検索値) と書きます。

ここが 0 なら、範囲の中に本当に無いということです。原因は下の1〜4。 1以上 なのに #N/A が出るなら、探し方の指定が違います。原因は5〜6です。

1. 見た目は同じでも、文字が違う

いちばん多い原因です。人の目には同じに見えても、シートは別物として扱います。

  • 末尾に半角スペースが入っている(他システムからの貼り付けで頻発します)
  • 全角の「A123」と半角の「A123」
  • ハイフンに見えて、実は長音符「ー」やダッシュ「−」
  • 数字なのに文字列として入っている(左寄せになっているのが目印)

確認のしかた

=LEN(A2) で文字数を比べます。見た目が5文字なのに6と出れば、余分な文字があります。 どこにあるかまで見たいなら =CODE(MID(A2,1,1)) のように1文字ずつコードを出します。

直し方

両側の空白は TRIM、全角半角は JIS や ASC、 文字列と数値の食い違いは VALUE で揃えます。 検索値と範囲の両方に同じ処理をかけてください。片方だけでは揃いません。

=VLOOKUP(TRIM(A2),$F$2:$H$100,3,FALSE) のように、その場で整えることもできます。 ただし範囲側が汚れている場合は、範囲側を直さないと解決しません。

2. 探す範囲が、思っているところからずれている

数式を下にコピーしたときに、範囲まで一緒にずれていく形です。 1行目は合っているのに、下のほうだけ #N/A になるなら、これを疑います。

確認のしかた

#N/A が出ているセルをダブルクリックすると、参照している範囲に色が付きます。 その枠が、探したい表からはみ出していないか見てください。

直し方

範囲を $F$2:$H$100 のように 行と列の両方に $ を付けて固定します。 VLOOKUPの記事で、どこに $ を付けるかを図で説明しています。

3. 探す値が、範囲のいちばん左の列に無い

VLOOKUP は、指定した範囲のいちばん左の列しか探しません。 社員番号で探したいのに、範囲の左端が氏名になっていれば、必ず #N/A です。

直し方

範囲の開始列を、探す値が入っている列に合わせます。 列の並びを変えられない場合は XLOOKUP を使ってください。 左方向にも探せます。INDEX と MATCH の 組み合わせでも同じことができます。

4. 探す先が空欄、または範囲がまだ埋まっていない

検索値のセルが空欄なら、VLOOKUPは空欄という値を探しに行き、見つからずに #N/A を返します。 入力前の行が並んでいる表では、これが延々と続きます。

直し方

入力前を表示しないなら、=IF(A2="","",VLOOKUP(A2,$F$2:$H$100,3,FALSE)) のように、先に空欄かどうかを判定します。 IFERROR で包むより、こちらのほうが安全です。 IFERRORは「入力前」も「本当に見つからない」も同じように隠してしまいます。

5. 4つ目の引数を省略している、またはTRUEにしている

VLOOKUPの4つ目は、省略するとTRUE(近い値でよい)になります。 このとき、範囲の左端が昇順に並んでいないと結果が保証されません。 見つかるはずのものが #N/A になったり、まったく別の行を拾ったりします。

直し方

完全に一致するものだけを探すなら、4つ目に FALSE を書きます。 省略しないでください。VLOOKUPの記事に、 TRUEを使ってよい場面(金額の段階表など)もまとめています。

6. XLOOKUP や MATCH の検索方法が合っていない

MATCH の3つ目の引数は、省略すると1(以下の最大値)になります。 完全一致で探すなら 0 を書きます。

XLOOKUP は既定が完全一致なので、この点は起きません。 代わりに、検索範囲と戻り範囲の行数が違うと正しく動きません。 どちらも同じ行数になっているか確かめてください。

#N/A のまま残してよい場合がある

グラフを描くとき、#N/A のセルは点として描かれません。 0で埋めると線が床まで落ちますが、#N/A ならその区間が空きます。 まだ実績が出ていない月を線でつなぎたくないときは、あえて残す使い方があります。

#N/A だけを見つけて数える

表のどこに残っているかを数えるなら =COUNTIF(範囲,"#N/A") ではなく、 =SUMPRODUCT(--ISNA(範囲)) を使います。 ISNA は #N/A だけを判定し、他のエラーは無視します。

「#N/A のときだけ別の表示にしたい」なら IFNA です。 IFERRORと違い、#REF! や #VALUE! は隠しません。 本当の壊れを見逃さずに済みます。

症状から原因を引く

見えている症状疑うところ
1行目は合っているが、下の行だけ #N/A範囲が固定されていない(原因2)
全部の行が #N/A検索値の型か、範囲の左端の列(原因1・3)
特定の数件だけ #N/Aその値だけ表記がずれている(原因1)
入力前の空欄の行だけ #N/A空欄を先に判定していない(原因4)
COUNTIFでは1件あるのに #N/A検索方法の指定(原因5・6)
元データを更新した直後から #N/A並び順が変わり、TRUE検索が崩れた(原因5)

関数別:#N/A が出る場面

関数出る場面最初に見るところ
VLOOKUP左端の列に検索値が無い 範囲の開始列と、4つ目の引数
XLOOKUP見つからず、4つ目も指定していない 4つ目に「該当なし」を入れる
MATCH3つ目を省略して並び順に依存している 3つ目に0を書く
HLOOKUP先頭行に検索値が無い 範囲の1行目
INDEX+MATCHMATCH側が先に #N/A になっている MATCHだけ取り出して確認
FILTER条件に合う行が1件も無い 2つ目の「見つからないとき」の指定

INDEX+MATCH の形は、外側の INDEX ではなく内側の MATCH が原因であることがほとんどです。 MATCH の部分だけを別のセルにコピーして、単独で動かしてみてください。

実際に来そうな相談と、その読み解き

「昨日まで動いていたのに、今朝から全部 #N/A」

数式は触っていないのに壊れた場合、変わったのはデータ側です。 元データを差し替えたときに、社員番号が数値から文字列に変わった、 先頭に ' が付いた、といったことが起きます。 検索値の側と範囲の側で =ISNUMBER() を比べてください。片方だけ FALSE のはずです。

「同じ名前なのに、1人だけ引けない」

ほぼ確実に表記の違いです。姓と名の間が全角空白と半角空白で違う、 「髙」と「高」のような異体字、といったところです。 =EXACT(A2,F5) で比べると、見た目が同じでも FALSE が返ります。 EXACT は大文字小文字も区別するので、判定に使えます。

「表を並べ替えたら結果が変わった」

4つ目の引数を省略していた(=TRUE)ときに起きます。 TRUEは「並んでいる前提で、近い値を返す」動きなので、 並び順が変われば結果も変わります。#N/A になることも、 別の行の値を返すこともあります。後者のほうが厄介です。エラーが出ないからです。

直す前のチェックリスト

  • =COUNTIF(範囲, 検索値) が 0 か 1以上かを先に見た
  • 検索値と範囲の両方に =ISNUMBER() を当てて、型を比べた
  • 範囲に $ を付けて固定した
  • VLOOKUPなら、範囲の左端が検索する列になっている
  • 4つ目の引数に FALSE を書いた
  • 空欄の行は、IF(A2="","",…) で先に外した

よくある質問

#N/A と #REF! は何が違いますか

#N/A は「探したが無かった」、#REF! は「参照先そのものが消えた」です。 #N/A のとき数式は無事ですが、#REF! は数式の中身が書き換わっています。 #REF!の直し方を見てください。

IFERROR で消してもいいですか

入力前の行を隠す目的なら、IFNA のほうが安全です。 IFERROR は #REF! や #VALUE! も一緒に隠すため、本当の壊れに気づけなくなります。

数式は合っているのに、空白のセルで #N/A になります

検索値のセルが空欄だと、空欄という値を探しに行きます。 =IF(A2="","",VLOOKUP(...)) の形で、先に空欄を外してください。

大文字と小文字は区別されますか

VLOOKUPやMATCHでは区別されません。abc と ABC は同じ扱いです。 区別したい場合は EXACT と組み合わせます。

ワイルドカードは使えますか

4つ目を FALSE にしていても、"*" と "?" は効きます。 =VLOOKUP("田中*",範囲,3,FALSE) のように前方一致で探せます。 逆に、値そのものに * が含まれていると意図せず一致するので注意してください。

スプレッドシートとExcelで違いはありますか

#N/A の意味は同じです。ただしスプレッドシートは 「値がありません」といった説明が吹き出しで出ます。Excelは記号だけです。 また FILTER の該当0件のとき、 Excelは #CALC!、スプレッドシートは #N/A を返します。

実際の表で追ってみる

次のような注文表があり、右の商品マスタから単価を引いているとします。

行A列(商品コード)C列(単価の数式)結果
2A-1001=VLOOKUP(A2,$F$2:$G$50,2,FALSE)1,200
3A-1002 =VLOOKUP(A3,$F$2:$G$50,2,FALSE)#N/A
4A-1003=VLOOKUP(A4,$F$2:$G$50,2,FALSE)#N/A
51004=VLOOKUP(A5,$F$2:$G$50,2,FALSE)#N/A
6(空欄)=VLOOKUP(A6,$F$2:$G$50,2,FALSE)#N/A

4行とも同じ #N/A ですが、原因は全部違います。

  • 3行目:末尾に半角スペース。=LEN(A3) が7を返します(正しくは6)。
  • 4行目:先頭のAが全角。=CODE(LEFT(A4,1)) で確認できます。
  • 5行目:マスタ側が A-1004 なのに、コードだけを入力している。 桁を揃える運用が抜けています。
  • 6行目:入力前。エラーではなく「まだ何も無い」状態です。

この4つを一度に見分けるために、隣の列に確認用の式を並べます。

=LEN(A2)&" / "&IF(ISNUMBER(A2),"数値","文字")&" / "&COUNTIF($F$2:$F$50,A2)

「文字数 / 型 / マスタでの件数」が1つのセルに並びます。 件数が0なら値の問題、1以上なら探し方の問題です。

まとめて直す手順

Googleスプレッドシートの場合

  1. 作業列を1本足し、=TRIM(JIS(A2)) のように整えた値を作る
    (半角に揃えたいなら =TRIM(ASC(A2)))
  2. 作業列を選択してコピー
  3. 元の列に「編集 → 特殊貼り付け → 値のみ貼り付け」
  4. 作業列を削除する

手順3で「値のみ」を選ばないと、数式ごと貼られて自分自身を参照し、循環参照になります。

Excelの場合

  1. 対象の列を選ぶ
  2. データタブ → 区切り位置 → 次へ → 次へ → 列のデータ形式で「G/標準」→ 完了
  3. これで、文字列として入っていた数字が数値に変わる
  4. 空白や全角が残る場合は、作業列で =TRIM(ASC(A2)) を作って値貼り付け

エラーの行を目立たせておく

直したあとも、新しく入力した行で再発します。 条件付き書式を1回設定しておけば、出た瞬間に色が付きます。

  • 範囲を選ぶ
  • 条件付き書式 → カスタム数式(Excelは「数式を使用して…」)
  • =ISNA(C2) と書き、背景色を指定する

ISNA にしておくと、#N/A だけが色付きます。 ISERROR にすると他のエラーも一緒に色が付くので、 何が起きているのか分からなくなります。

VLOOKUP をやめるという選択

#N/A の原因の多くは、VLOOKUP の制約(左端しか探せない、列番号がずれる)から来ます。 表の作りを変えられるなら、そもそも別の書き方にしたほうが早いことがあります。

書き方向いている場面
XLOOKUP見つからないときの表示を自分で決めたい
INDEX+MATCH 古い環境でも動かしたい
FILTER1件ではなく、該当する行を全部出したい
QUERY抽出しながら集計もしたい(スプレッドシートのみ)

直った後に確認すること

  • =SUMPRODUCT(--ISNA(C2:C1000)) が0になっているか
  • 0になった行の値が、本当に正しい相手を引いているか (#N/Aが消えただけで、別の行を拾っていることがあります)
  • 元データを更新する運用なら、次回も同じ整え方を通す手順にしたか
  • 入力前の行は、エラーではなく空欄として扱われるようになったか

探される側(マスタ)に原因があることもある

検索値ばかり見ていて見つからないときは、マスタ側を疑います。

キーが重複している

VLOOKUPは最初に見つかった1件を返します。 重複していてもエラーにはなりません。 「引けているが、間違った行を引いている」という、いちばん気づきにくい状態になります。 =COUNTIF($F$2:$F$100,F2) をマスタ側に並べて、2以上の行を探してください。

マスタに空行が挟まっている

範囲の途中に空行があっても検索は続きますが、 範囲を F2:G50 のように固定していると、 50行目より下に追加されたデータは永久に見つかりません。 マスタが増える運用なら、範囲を F:G と列全体にするか、 テーブル・名前付き範囲にしてください。

セルが結合されている

結合セルは、左上のセルだけに値が入っていて、残りは空欄です。 マスタのキー列に結合が混ざっていると、空欄の行は一致しません。 結合を解除し、値を各行に埋めてください。

フィルタで隠れている行がある

フィルタで非表示になっていても、VLOOKUPは非表示行も探します。 「画面に無いから無い」と判断すると原因を見誤ります。 非表示行を除いて数えたいなら SUBTOTAL を使います。

キーが1列で足りないとき(複合キー)

「支店コード+商品コード」の組み合わせで引きたい、という場面です。 VLOOKUPは1つの値しか探せないので、キーを1本にまとめます。

作業列を1本足して、両方の表に同じ式を入れます。

=A2&"_"&B2

区切りに _ を挟むのが要点です。挟まないと、 1+23 と 12+3 が どちらも 123 になり、別のものが一致します。

作業列を作らずにやるなら、XLOOKUP の検索範囲を F2:F100&"_"&G2:G100 と書く方法もあります。 ただし読みにくくなるので、引き継ぐ表では作業列のほうが親切です。

業務でよく出るパターン別

引きたいものつまずきやすい点先に確認すること
顧客コードから顧客名先頭の0が消えている コードが数値になっていないか(001→1)
商品コードから単価マスタにコードが重複COUNTIFで重複を数える
日付から当日の実績片方が文字列の日付ISNUMBERで両方を確認
氏名から所属姓名の間の空白が全角と半角SUBSTITUTEで空白を統一
メールアドレスから会員情報大文字小文字は区別されない 意図せず一致していないか

先頭の0が消える問題は特に多いです。 コード列は「表示形式 → プレーンテキスト(Excelは文字列)」にしてから貼り付けるか、 =TEXT(A2,"000") で桁を揃えてから引きます。

#N/A を出さない設計にする

直すたびに同じことが起きるなら、数式ではなく表の作りを変えます。

  • 入力欄はプルダウン(データの入力規則)にして、手入力させない
  • マスタは列全体か名前付き範囲で参照し、行が増えても届くようにする
  • コード列は文字列で統一し、数値と混在させない
  • 貼り付け元が決まっているなら、整える式を通してから台帳に入れる

手入力をやめるだけで、表記ゆれ由来の #N/A はほぼ消えます。

この3つのエラーは、どこが違うのか

見た目は同じ「エラー」でも、原因の層が違います。ここを取り違えると、 直らない場所をいくら触っても直りません。

エラー壊れている場所まず見るところ
#N/A探した値が、探した範囲に無い 検索値の表記ゆれ、範囲の指定
#REF!参照先そのものが消えた 直前に消した行・列・シート
#VALUE!渡した値の種類が合わない 数値のはずのセルに入っている文字

7種類すべての一覧は スプレッドシートのエラー一覧 にまとめています。

エラーを消す前に

IFERROR で包めば表示は消えます。ただし 原因は残ったままです。 金額や件数の集計で使うと、本来あるはずの数字が静かに欠けます。

消してよいのは「エラーが出るのが正常な場合」だけです。 たとえば、まだ入力していない行が空欄でエラーになる、といった場面です。 それ以外は、消す前に原因を潰してください。