目的別
#N/Aエラーの直し方
#N/A は 「探したけれど、見つからなかった」という報告です。
数式が壊れているわけではありません。指定どおりに探して、無かった。それだけを伝えています。
ですから直し方は1つしかありません。なぜ見つからなかったのかを突き止めることです。 出るのはほとんどが VLOOKUP、XLOOKUP、 MATCH の3つです。
このページの中身(25項目)
- まず、検索値だけを取り出して確かめる
- 1. 見た目は同じでも、文字が違う
- 2. 探す範囲が、思っているところからずれている
- 3. 探す値が、範囲のいちばん左の列に無い
- 4. 探す先が空欄、または範囲がまだ埋まっていない
- 5. 4つ目の引数を省略している、またはTRUEにしている
- 6. XLOOKUP や MATCH の検索方法が合っていない
- #N/A のまま残してよい場合がある
- #N/A だけを見つけて数える
- 症状から原因を引く
- 関数別:#N/A が出る場面
- 実際に来そうな相談と、その読み解き
- 直す前のチェックリスト
- よくある質問
- 実際の表で追ってみる
- まとめて直す手順
- エラーの行を目立たせておく
- VLOOKUP をやめるという選択
- 直った後に確認すること
- 探される側(マスタ)に原因があることもある
- キーが1列で足りないとき(複合キー)
- 業務でよく出るパターン別
- #N/A を出さない設計にする
- この3つのエラーは、どこが違うのか
- エラーを消す前に
まず、検索値だけを取り出して確かめる
原因を探す前に、切り分けを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つ目に「該当なし」を入れる |
| MATCH | 3つ目を省略して並び順に依存している | 3つ目に0を書く |
| HLOOKUP | 先頭行に検索値が無い | 範囲の1行目 |
| INDEX+MATCH | MATCH側が先に #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列(単価の数式) | 結果 |
|---|---|---|---|
| 2 | A-1001 | =VLOOKUP(A2,$F$2:$G$50,2,FALSE) | 1,200 |
| 3 | A-1002 | =VLOOKUP(A3,$F$2:$G$50,2,FALSE) | #N/A |
| 4 | A-1003 | =VLOOKUP(A4,$F$2:$G$50,2,FALSE) | #N/A |
| 5 | 1004 | =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本足し、
=TRIM(JIS(A2))のように整えた値を作る
(半角に揃えたいなら=TRIM(ASC(A2))) - 作業列を選択してコピー
- 元の列に「編集 → 特殊貼り付け → 値のみ貼り付け」
- 作業列を削除する
手順3で「値のみ」を選ばないと、数式ごと貼られて自分自身を参照し、循環参照になります。
Excelの場合
- 対象の列を選ぶ
- データタブ → 区切り位置 → 次へ → 次へ → 列のデータ形式で「G/標準」→ 完了
- これで、文字列として入っていた数字が数値に変わる
- 空白や全角が残る場合は、作業列で
=TRIM(ASC(A2))を作って値貼り付け
エラーの行を目立たせておく
直したあとも、新しく入力した行で再発します。 条件付き書式を1回設定しておけば、出た瞬間に色が付きます。
- 範囲を選ぶ
- 条件付き書式 → カスタム数式(Excelは「数式を使用して…」)
=ISNA(C2)と書き、背景色を指定する
ISNA にしておくと、#N/A だけが色付きます。 ISERROR にすると他のエラーも一緒に色が付くので、 何が起きているのか分からなくなります。
VLOOKUP をやめるという選択
#N/A の原因の多くは、VLOOKUP の制約(左端しか探せない、列番号がずれる)から来ます。 表の作りを変えられるなら、そもそも別の書き方にしたほうが早いことがあります。
| 書き方 | 向いている場面 |
|---|---|
| XLOOKUP | 見つからないときの表示を自分で決めたい |
| INDEX+MATCH | 古い環境でも動かしたい |
| FILTER | 1件ではなく、該当する行を全部出したい |
| 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 で包めば表示は消えます。ただし 原因は残ったままです。 金額や件数の集計で使うと、本来あるはずの数字が静かに欠けます。
消してよいのは「エラーが出るのが正常な場合」だけです。 たとえば、まだ入力していない行が空欄でエラーになる、といった場面です。 それ以外は、消す前に原因を潰してください。