【Excel】エラー値の原因と対処一覧(#VALUE!・#REF!・#N/A・#DIV/0!…)

この記事は約11分で読めます。

この記事で分かること

  • エラー値の種類と、それぞれが何を意味しているか
  • エラーごとの典型的な原因と、その場で試せる対処
  • IFERRORで隠してよい場面と、隠してはいけない場面の線引き

「エラーが出たが何から調べればいいか分からない」「とりあえずIFERRORで囲んでいる」という方に向けて書いています。


どんな場面で使うか

  • 数式の多いレポートを引き継いで、開いた瞬間にエラーが並んでいる
  • 昨日まで動いていたファイルが、行を削除したら壊れた
  • 他人が作ったファイルを直したいが、どこが原因か分からない

基本説明

エラー値は「計算に失敗した」という結果ではなく、Excelが「なぜ答えを出せなかったか」を分類して返している情報です。種類さえ読めれば、疑う場所をかなり絞り込めます。

この記事で使うサンプル

説明にはサンプルファイルの「売上データ」シートを使います。わざとエラーが出るように作ってあるので手元で再現できます。

A 商品コード B 商品名 C 数量 D 単価 E エリア
2 A-101 ボールペン 12 120 東京
3 A-102 ノート 8 160 大阪
4 A-103 消しゴム 15個 90 東京
5 A-104 ファイル (空欄) 250 名古屋
6 A-105 クリップ 0 150 東京
7 A-106␣ テープ 5 150 大阪
8 A-107 のり 7 200 福岡

表の は半角スペースで、実際の画面には何も表示されません

仕掛けは5か所です。C4 の「15個」は数値ではなく文字列C5 は空欄C6 は 0A7 は末尾に半角スペースA8 だけ全角です。このうち A7 の末尾の半角スペースは画面では分かりません。C5 も、空に見えること自体は分かりますが、真の空欄なのか "" なのかは区別できません(後半の #VALUE! の節で扱います)。

F〜H列には次の数式を入れてあります。列の意味はこの記事全体で固定です。

数式 意味
F 金額 =C2*D2 数量 × 単価
G 単価チェック =F2/C2 金額 ÷ 数量 で単価を逆算し、検算する
H 金額(空欄を "" にしてから計算) =IF(C2="","",C2)*D2 空欄を "" に置き換えてから計算した金額(わざと #VALUE! を出すための列・後述)

もう1枚「商品マスター」シートがあり、A列に商品コード(A-101A-107)、B列に分類が入っています。

エラー値の一覧

エラー値 ひとことで言うと 最初に疑う場所
##### 列幅が足りない(エラーではない) 列幅、負の日付
#DIV/0! 0または真の空欄で割った 割る側のセル
#N/A 探したが見つからない 検索値と参照先の表記
#NAME? 名前を解釈できない 関数名のつづり、文字列の引用符
#NULL! 2つの範囲が交差しない(範囲の間のスペースは「共通部分を取り出す」演算子) 引数の区切りのスペース
#NUM! 数値として無理な計算(=SQRT(-1)IRR が収束しない など) 引数の範囲、桁数
#REF! 参照先が消えた 削除した行・列・シート
#VALUE! 型が合わない 文字列と数値の混在
#SPILL! スピルの出力先が空いていない 結果が広がる先のセル
#CALC! 計算はできたが結果を返せない FILTERの該当0件など

以降の節では、実務で出会う頻度の高い #N/A#REF!#VALUE!#NAME?#DIV/0! の5種を「サンプルコードまたは例」で1つずつ扱います。残りのうち下で触れるのは ######SPILL!#CALC! です(#NULL!#NUM! は表で足ります)。

実務で出会うのはほぼこの10種です(ほかに #FIELD!#BLOCKED! など、データ型やクエリなど特定の機能を使ったときだけ出るものもあります)。

ただし #SPILL!#CALC! は Microsoft 365 と Excel 2021 以降にしかありません。Excel 2019 以前では残りの8種になります(この記事に出てくる XLOOKUPFILTER も同じ世代の関数です)。

##### だけはエラー値ではなく「表示しきれない」という状態です。列幅を広げれば解消します(直らないときは、値が負の日付・時刻になっていないか確認します)。

#SPILL!#CALC!FILTERSORTUNIQUE など、主にスピルする数式で出ます。#SPILL! は結果が広がる先に何か入っているとき#CALC! は条件に合う行が1件も無いときなどです。どちらも下の関連記事の FILTER の記事で扱っています。


手順

どのセルが原因かを特定する

エラーが出ているセルが「原因のセル」とは限りません。サンプルでは F4 と G4 の両方が #VALUE! になりますが、原因はそのどちらでもなく、文字列が入った C4 です。

  1. エラーが出ているセルを選択する
  2. セルの左に出る警告アイコン(!マーク)をクリックし、「計算の過程を表示」を選ぶ(開くのは「数式の検証」ダイアログで、「数式」タブ →「数式の検証」からも同じものが開きます。「エラーのトレース」は「数式」タブ →「エラーチェック」の右の から開けます)
  3. 「数式」タブ →「参照元のトレース」で、どのセルから値を受け取っているかを矢印で表示する
  4. 矢印をさかのぼり、最初にエラーになっているセルにたどり着く

数式のどの部分で失敗しているか見る

  1. 数式バーで、確認したい部分だけを範囲選択する
  2. F9 を押すと、その部分だけが計算結果に置き換わって表示される
  3. どこでエラー値が出ているかを確認したら、必ず Esc で元に戻す(Enter を押すと数式が結果で上書きされます)

サンプルコードまたは例

#N/A:探したが見つからない

VLOOKUPXLOOKUPMATCH で、検索値が参照先に存在しないときに出ます。多くは「無い」のではなく「一致していない」だけです。サンプルでも、マスターと見た目が紛らわしい A-106A-107 が 7・8行目では一致しません(末尾の半角スペースと全角)。

前後の空白・全角と半角の混在・数値と文字列の型違いのどれに当たっているかを切り分ける手順は、【Excel】VLOOKUPが一致しない原因と直し方 — 空白・全角半角・型の違いを見分ける にまとめてあります。この記事は入口として読んでください。

以上は表記ゆれで一致していない場合です。本当にマスターに無いコード(サンプルなら A-108)を「未登録」と表示したいときは、XLOOKUP の第4引数if_not_found)で受けます。

=XLOOKUP("A-108", 商品マスター!$A$2:$A$8, 商品マスター!$B$2:$B$8, "未登録")

A7 のような表記ゆれをこれで受けてはいけません。 実在する A-106 が「未登録」と表示され、原因が隠れたまま残ります。

見つからなかった場合の値を指定する引数が無い VLOOKUPMATCH では =IFNA(VLOOKUP(…), "未登録") のように IFNA で受けます。

#REF!:参照先が消えた

数式が参照していた行・列・シートを削除すると出ます。参照そのものが #REF! に置き換わるため、元がどのセルを指していたかは後から分かりません。

列を削除した場合。 サンプルで D列(単価)を削除すると、右の列が繰り上がるので金額の数式は E列 に移り、=C2*#REF! になります。

行を削除した場合。 別のセルに =F4 と書いて4行目の金額を参照していたなら、4行目を削除するとその数式は =#REF! になります。一方、=SUM(F2:F8) のように範囲で参照していれば、範囲の一部を削除しても #REF! にはならず、範囲が縮むだけです(範囲に含まれる行をすべて削除すると =SUM(#REF!) になります)。単独のセルを名指しで参照している数式が壊れると覚えると見当がつきます。

直後なら Ctrl + Z で戻せますが、時間が経てば書き直すしかありません。行の削除が多いファイルでは、テーブルの構造化参照(テーブル1[金額])にしておくと壊れにくくなります(列を丸ごと削除した場合はこれでは防げませんテーブル1[単価] も同じく #REF! になります)。

#VALUE!:型が合わない

数値に変換できない文字列に対して数値の計算をしようとしたときに出ます。サンプルでは F4=C4*D4)がこれにあたります。C4 の「15個」が、数値として読めない文字列だからです。

「文字列だから出る」ではありません。 数字だけの文字列("15")は掛け算のとき数値として読まれ、="15"*901350 を返します。直し方も中身で変わります。

文字列の中身 直し方
単位や記号が付いている(サンプルの C4 の 15個 =VALUE(C4) は数値として読めず #VALUE! を返します。 =VALUE(SUBSTITUTE(C4,"個","")) で単位を落としてから変換するか、元データの側で数量と単位を別の列に分ける
数字だけが文字列("15" 掛け算ではエラーになりませんが、SUMAVERAGE は文字列を無視するので合計が静かにずれます。=VALUE(セル) で数値にするか、取り込み時に列の型を数値として指定します

「空白」は2種類あり、結果が逆になります。 ここを混同すると原因を見落とします。

セルの中身 算術演算の結果 サンプルでの例
何も入っていない(真の空欄) 0として扱われる F5(=C5*D5)は 0
空文字列 "" やスペース1個 #VALUE! H5(=IF(C5="","",C5)*D5)は #VALUE!

どちらも画面では同じ空白に見えますが、"" は長さ0の文字列であって数値ではありません=IF(条件, "", 計算) で作った「空欄っぽい列」を、あとから別の数式で計算に使うと、この形で #VALUE! になります。

見た目で判断せず =ISBLANK(C5) で確かめてください(真の空欄なら TRUE"" やスペースなら FALSE)。

#NAME?:名前を解釈できない

  • 関数名のつづり間違い(=SUMIF=SUMIFF と書いた)
  • 文字列の引用符を忘れた(=IF(E2="東京","○",NG)NG。定義されていない名前として扱われます)
  • そのExcelに無い関数を使った(古いExcelで XLOOKUP を開いた場合など)
  • 定義した名前を後から削除した

関数名は数式オートコンプリートの候補から選び、定義名は「数式」タブ →「名前の管理」で実在を確認します。古いExcelで開いた新しい関数は _xlfn.XLOOKUP の形で見えます。

#DIV/0!:0または真の空欄で割った

サンプルでは G5=F5/C5)と G6=F6/C6)が該当します。C5 は真の空欄(0 として扱われます)、C6 は 0 そのものです。

数式に割り算が見えなくても出ます。 AVERAGE を数値の無い範囲に当てたときや、AVERAGEIFAVERAGEIFS が1件も該当しなかったときも #DIV/0! です(内部で「合計 ÷ 件数」を計算するため)。

ここでいう空白は「真の空欄」だけです。 "" やスペース1個で割ると、返るのは #DIV/0! ではなく #VALUE! です(上の #VALUE! の節)。=IF(条件, "", 計算) で作った列を分母にしたときが典型で、#DIV/0! の原因を探しても見つかりません。

入力途中で一時的に出ているだけなら、=IFERROR(F5/C5, …) で隠すより =IF(C5=0, …, F5/C5) と条件で分けるほうが安全です。ただし受けられるのは 0 と真の空欄までです"" の分母は「0」の判定が成立せず #VALUE! になるので、列そのものを直します)。返す値は、G列のような検算列なら ""、後段の計算に使う列なら 0 にしてください。"" は表示専用で、分母や掛け算に使えば #VALUE! に化けます。


よくあるエラー

  • IFERRORで全部囲んでしまうIFERRORすべてのエラーを同じ扱いで隠します。「未登録だから#N/A」を隠すつもりが、同じ数式の中の#REF!(本当のバグ)まで隠してしまいます。検索の不一致だけなら XLOOKUP の第4引数か IFNA で対象を限定してください。
  • エラーが消えたので直ったと思うIFERROR で空欄にしても原因の C4 は「15個」のまま残り、その行だけが抜けた合計が静かに返りますSUM が文字列を無視するため)。隠す前に原因を確認してください。
  • エラーのセルを含めてSUMしている:範囲に1つでもエラーがあると合計もエラーになります。サンプルで =SUM(F2:F8) を試すと、F4 が #VALUE! なので合計も #VALUE! になります。エラーを除いて合計する書き方は 【Excel】 関数参照時に空白やエラーを除く方法 にあります。ただしそれもエラーを無かったことにする書き方です。
  • 条件付き書式でエラーを白文字にして隠す:印刷物では消えますが、データとしては残ります。他の人が集計に使ったときに気づけないため、避けたほうがよい対処です。

まとめ

エラー値は不具合ではなく、Excelからの「ここで詰まった」という報告です。種類を読んで疑う場所を絞り、参照元のトレースとF9で原因までさかのぼれば、たいていは特定できます。IFERROR で隠すのは原因を確認したうえで意図的に隠すと判断したときだけにしておくと、あとから合計が合わなくなる事故を防げます。


関連記事


対応バージョン: Microsoft 365 / Excel 2021 以降(XLOOKUP を使用)。Excel 2013〜2019 では #SPILL!#CALC! が出ず、XLOOKUP は本文の IFNAVLOOKUP で置き換えます

サンプルファイル

記事中で使用しているサンプルデータはこちらからダウンロードできます。

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