Excelで参照先が空白なのに0になる原因と直し方|IF・IFERROR・VLOOKUPで空白を返す書き方

スポンサーリンク

別シートの数字を「=」で引っ張ってきたら、元が空欄の行にだけ「0」が並んでしまう。VLOOKUPで単価を呼び出したら、単価が未入力の商品だけ0円と表示される。Excelの見積書や月次の集計表で、こんな表示に困っていませんか。

先に結論から。Excelで参照先が空白なのに0になるのは、数式が空白セルを0として受け取るからです。直すには、IF関数で「参照先が空なら空白(””)を返す」と書き分けるのが基本です。

ただし、この “”(空の文字列)は本物の空白ではありません。足し算で #VALUE! が出たり、COUNTA が件数に数えたりと、あとから別の不具合を呼ぶことがあります。この記事では症状別の直し方に加えて、直したあとに起きることと、表示だけ消す方法との使い分けまで整理しました。

対応バージョン: 本記事の主役である IF・VLOOKUP・INDEX・MATCH・N 関数は、全バージョン共通で使えます。IFERROR は Excel 2007 以降の関数です。途中で触れる XLOOKUP と LET は、Microsoft 365 と Excel 2021 以降で使えます。これらに対応していない版では #NAME? エラーになります。

Excelで参照先が空白なのに0になる症状と原因

まずは、自分の症状がどれに当たるかを確認しましょう。根っこの原因は同じでも、直すときの書き方が少しずつ違います。

症状:=A1と書いたら0が表示される

一番シンプルなのがこのパターン。B列の売上を、C列で =B2 のように参照しただけで起きます。

行A 担当者B 売上(入力)C 参照(=B列)
2佐藤120120
3鈴木(空白)0
4高橋8080
5田中(空白)0
6伊藤100100

C3 に入っている式は =B3 だけ。B3 は空欄なのに、結果は0になります。=入力!B3 のように別シートを参照した場合も同じ結果です。

症状:VLOOKUP・INDEXの結果が0になる

商品マスタから単価や備考を引く表でもよく起きます。次のマスタが F〜I 列にあり、A2 に入力したコードで情報を呼び出す想定です。

行F コードG 品名H 単価I 備考
2A01ボールペン120(空白)
3A02ノート(空白)取寄せ
4A03クリップ80(空白)
=VLOOKUP(A2,$F$2:$I$4,3,FALSE)
=INDEX($I$2:$I$4,MATCH(A2,$F$2:$F$4,0))

A2 が「A02」なら、1つ目の式(単価)は0になります。A2 が「A01」のときは、2つ目の式(備考)が0に。備考は文字の列なのに0が出るので、見積書だと特に目立ちますよね。

VLOOKUP 自体の書き方は VLOOKUP関数の使い方 で詳しく解説しています。

症状:IFERRORで囲んだら空白でなく0が出る

「エラーを空白にする定番の式」として、次の形を使っている人も多いはずです。

=IFERROR(VLOOKUP(A2,$F$2:$I$4,3,FALSE),"")

マスタにないコードを入れたときは、きちんと空白になります。ところが A02 では0のまま。

IFERROR は「エラーのときだけ」別の値に置き換える関数です。見つかった先が空欄で返ってくる0はエラーではないため、そのまま素通りしてしまいます。

IFERROR の基本は IFERROR関数の使い方 を参考にしてください。

原因:空白セルは数式から見ると0として扱われる

3つの症状に共通する原因はひとつ。Excelの数式は、参照した先が空白だと、それを0として受け取って表示します。=B3 でも VLOOKUP でも INDEX でも、動きは同じ。

一方で、=B3="" という比較は TRUE になります。つまり空白セルは「参照すると0になるが、”” と比べると等しい」という扱いです。次の章の直し方は、すべてこの性質を利用しています。

空白を返す書き方(関数別の誤式と正式)

通常の数式では、結果のセルを「未入力」と同じ状態には戻せません。そこで、代わりに空の文字列 “” を返して空白に見せるのが定番です。関数ごとに書き方を見ていきましょう。

IF関数で参照先が空のときだけ空白にする

=A1 型の症状なら、参照先が空かどうかを IF で判定します。C2 に次の式を入れて、C6 までコピーしてください。

=IF(B2="","",B2)

B2 が空なら “”、そうでなければ B2 の値をそのまま返す式です。結果は 120・空白・80・空白・100 となり、0が消えます。空欄の代わりに「-」を出したいなら、=IF(B2="","-",B2) と書けばOK。

=IF(ISBLANK(B2),"",B2) でも同じ結果になります。ただ B2="" の判定は、参照先が別の数式の “” だった場合も空として扱えるので汎用的です。ISBLANK との違いは ISBLANK関数の使い方 にまとめています。

VLOOKUPの結果が空欄のとき空白にする(&””)

VLOOKUP には2つの直し方があります。1つ目は、結果の後ろに &"" を付ける方法です。

=VLOOKUP(A2,$F$2:$I$4,4,FALSE)&""

& は文字をつなぐ記号。空欄の結果に “” をつなぐと “” になり、0が出なくなります。「取寄せ」はそのまま「取寄せ」です。

式が短く済むので、品名や備考のような文字の列ならこれで十分。

注意したいのは、結果がすべて文字列になる点です。単価の 120 は文字の “120” に変わり、SUM で合計すると無視されます。日付も同じで、2025/12/1 は「45992」という数字の文字列になってしまいます。

数値の列で使うなら、2つ目の方法を選びましょう。VLOOKUP の結果が空かどうかを IF で判定します。

=IF(VLOOKUP(A2,$F$2:$I$4,3,FALSE)="","",VLOOKUP(A2,$F$2:$I$4,3,FALSE))

この形なら、120 は数値のまま残ります。よくある誤りは、=IF(A2="","",VLOOKUP(…)) のように検索値の A2 を判定してしまう書き方です。これはコードが未入力の行には効きますが、見つかった単価が空欄の0は残ります。

VLOOKUP を2回書くのが長いなら、LET で1回にまとめられます(Microsoft 365・Excel 2021 以降)。

=LET(r,VLOOKUP(A2,$F$2:$I$4,3,FALSE),IF(r="","",r))

INDEX・MATCHの結果が空欄のとき空白にする

INDEX と MATCH の組み合わせでも、考え方は VLOOKUP と同じ。文字の列なら後ろに &""、数値の列なら IF で結果を判定します。

=INDEX($I$2:$I$4,MATCH(A2,$F$2:$F$4,0))&""
=IF(INDEX($H$2:$H$4,MATCH(A2,$F$2:$F$4,0))="","",INDEX($H$2:$H$4,MATCH(A2,$F$2:$F$4,0)))

1行目が備考、2行目が単価の式です。2行目は長くなるので、使える版なら LET でまとめると読みやすくなります。

IFERRORの順序ミスで0が残るパターン

「マスタにないコード」と「単価が空欄」を両方空白にするなら、IFERROR を外側、空欄判定の IF を内側に置きます。

=IFERROR(IF(VLOOKUP(A2,$F$2:$I$4,3,FALSE)="","",VLOOKUP(A2,$F$2:$I$4,3,FALSE)),"")

A01 なら 120、A02 なら空白、マスタにないコードでも空白。IFERROR だけで包むと、さきほどのように空欄の0が残ります。

逆に IF を外側に置くのもNG。たとえば =IF(VLOOKUP(…)="","",IFERROR(VLOOKUP(…),"")) という形です。未登録コードのときは条件側の VLOOKUP が #N/A を返し、式全体が #N/A になってしまうんです。

IF と IFERROR の役割の違いは IF・IFS・IFERROR・IFNAの違いと使い分け で整理しています。

誤式と正式の対比表(4パターン)

ここまでの直し方を1枚にまとめます。表中の VLOOKUP(…) は VLOOKUP(A2,$F$2:$I$4,3,FALSE) の略です。

症状誤式(0が残る)正式(空白になる)ポイント
=A1で0=B3=IF(B3="","",B3)参照先を “” と比べる
VLOOKUPで0=IF(A2="","",VLOOKUP(…))=IF(VLOOKUP(…)="","",VLOOKUP(…))検索値ではなく結果を判定
INDEXで0=INDEX(H2:H4,MATCH(…))=IF(INDEX(…)="","",INDEX(…))文字の列なら末尾に &””
IFERRORで0=IFERROR(VLOOKUP(…),"")=IFERROR(IF(VLOOKUP(…)="","",VLOOKUP(…)),"")IFERROR は外側に置く

“”を返したセルが後で壊すもの

0は消えました。でも、ここで安心するのはまだ早いかもしれません。”” は「長さ0の文字列」で、見た目は空白でも中身は文字だからです。

冒頭の表に D 列を足し、=IF(B2="","",B2) で空白を返すようにしました。0が出る C 列(=B2)と比べてみます。

式C列(0が出る)D列(”” を返す)
=SUM(x2:x6)300300
=AVERAGE(x2:x6)60100
=COUNT(x2:x6)53
=COUNTA(x2:x6)55
=COUNTBLANK(x2:x6)02
=ISBLANK(x3)FALSEFALSE
=x3+11#VALUE!
=N(x3)+111
=SUM(x3,1)11

表の x には C または D が入ります。元データの B 列で数えると、COUNTA は3、ISBLANK(B3) は TRUE です。

足し算で#VALUE!になる

一番わかりやすい副作用がこれ。=D3+1 のように、”” のセルを + や * で計算すると #VALUE! になります。

合計を =D2+D3+D4+D5+D6 と + でつないでいる表は要注意です。1か所でも “” が混ざると、合計セルごと #VALUE! になります。見積書の「金額=単価×数量」も、単価が “” の行は同じ結果に。

COUNTAが数える・ISBLANKがFALSEになる

COUNTA は、”” を返す数式のセルも「データあり」として数えます。D 列の COUNTA は5で、元データの3と一致しません。入力済みの件数を数えたつもりが、空欄の行まで含まれてしまうんですね。

ISBLANK も “” のセルには FALSE を返します。数式が入っている時点で、本物の空白ではないからです。逆に COUNTBLANK は “” を空白として数えるため、関数ごとに扱いがバラバラなのが厄介なところ。

SUMは無視する/回避策(N関数・–・COUNTIF)

SUM は範囲の中の文字列を無視するので、D 列でも合計は300のままです。AVERAGE も “” を除いて計算します。

ここは「0を表示した C 列」との違いが出るところ。C 列の平均は 300÷5 で60、D 列は 300÷3 で100です。空欄を0として平均に入れるか除くかで、結果が大きく変わります。

元データ(B 列)の平均は100なので、元の意味に近いのは D 列のほうでしょう。

ほかの副作用は、次の書き方で回避できます。

やりたいこと回避する式結果
“” を0とみなして足す=N(D3)+11
+ を使わずに合計する=SUM(D3,1) または =SUM(D2:D6)1 / 300
数値が入った件数だけ数える=COUNT(D2:D6)3
文字が1文字以上ある件数を数える=COUNTIF(E2:E4,"?*")1
空白か “” かを判定する=D3="" または =LEN(D3)=0TRUE
&”” で文字列になった数値を戻す=--J2(J2 が文字の “120” のとき)120

E2:E4 は、A01〜A03 の備考を &"" 付きで引いた列(空白・取寄せ・空白)の想定です。COUNTA なら3になりますが、"?*" 条件は “” に一致しないので1になります。

ただし "?*" は文字列だけが対象で、数値は数えません。数値の列には COUNT を使い分けてください。

-- は文字列を数値に変える書き方。ただし “” には使えず、=--D3 は #VALUE! に。

逆方向の症状(空白が数えられない)は別記事へ

ここまでとは逆に「空白に見えるのに COUNTBLANK や ISBLANK で空白と判定されない」という悩みもあります。”” やスペースの見分け方、まとめて消す方法は Excelで空白に見えるのに空白判定されない原因と対処法 で詳しく扱っています。

集計結果が合わない原因を広く探したいなら、Excelの集計・検索が合わない原因まとめ から症状別にたどるのが近道です。

表示だけ消す方法との使い分け

値を “” に変えず、0のまま見えなくする方法も2つあります。値は0のままなので #VALUE! は起きません。その代わり、平均や件数には0として残る点を覚えておきましょう。

オプション「ゼロ値のセルにゼロを表示する」をオフにする

シートの0をまとめて隠すなら、Excel のオプションを使います。デスクトップ版 Excel の設定で、手順は次のとおり。

  1. 「ファイル」タブから「オプション」を開きます。
  2. 左の一覧で「詳細設定」を選びます。
  3. 「次のシートで作業するときの表示設定」で対象のシートを選びます。
  4. 「ゼロ値のセルにゼロを表示する」のチェックを外し、「OK」を押します。

チェックを外すと、そのシートの0が表示されなくなります。チェックを付け直せば元どおり。設定はシート単位なので、ほかのシートには影響しません。

気をつけたいのは、手入力した本物の0も消えること。数量0・残高0のように「0であること」に意味がある表では、未入力と区別がつかなくなります。

ユーザー定義書式 0;-0;;@ で隠す(値は0のまま)

特定の列だけ0を隠したいなら、表示形式の出番。

  1. 0を隠したいセル範囲を選びます。
  2. Ctrl+1 を押して「セルの書式設定」を開きます。
  3. 「表示形式」タブの「ユーザー定義」を選びます。
  4. 「種類」に 0;-0;;@ と入力し、「OK」を押します。

セミコロンで区切った各区画は、一般に「正の数;負の数;ゼロ;文字列」の順と説明されます。3つ目の区画を空にしているので、0のときだけ何も表示されません。隠した値は、セルを選ぶと数式バーで確認できますよ。

書式記号の 0 は整数で表示するため、小数は四捨五入された見た目になる点に注意。小数第1位まで見せたい列なら、0.0;-0.0;;@ のように区画ごとに桁数を変えてください。

4手法比較表と選び方フロー

ここまでの4つの方法を、4つの軸で比べてみましょう。

手法値は変わるか計算に使えるか適用範囲向く場面
IF で “” を返す空欄だけ “” に変わる+ は #VALUE!。SUM・AVERAGE は除外式を入れたセル数値の列。平均や件数に空欄を含めたくない
末尾に &””結果がすべて文字列数値・日付が文字列化し SUM で無視式を入れたセル品名・備考など文字の列
オプションをオフ変わらない(0のまま)0として計算されるシート全体本物の0がないシートを丸ごと見やすく
書式 0;-0;;@変わらない(0のまま)0として計算される選んだセル範囲+ の計算が多い列。0を平均に含めてよい

迷ったら、次の順番で考えると決めやすくなります。

  1. その列は文字(品名・備考)か? → はい:&""
  2. 空欄を平均や件数から外したいか? → はい:IF で “” を返す(足し算は SUM や N 関数で)
  3. シート全体の0を消してよく、本物の0もないか? → はい:オプションをオフ
  4. それ以外 → 書式 0;-0;;@ で必要な列だけ隠す

表示だけ消す2つの方法は、見た目が変わっても値は0のままです。たとえば C 列を書式で隠しても、AVERAGE は60のまま変わりません。

まとめ・よくある質問(FAQ)

Excelで空白なのに0になるのは、数式が空白セルを0として受け取るからです。直し方のポイントをおさらいします。

  • =A1 型は =IF(B2="","",B2) で参照先を判定する
  • VLOOKUP・INDEX は「検索値」ではなく「結果」を判定する。文字の列なら末尾に &""
  • IFERROR だけでは空欄の0は消えない。IFERROR を外側、IF を内側に置く
  • “” のセルは + で #VALUE!、COUNTA が数える、ISBLANK が FALSE になる
  • 表示だけ消す方法(オプション・書式)は、値が0のまま集計に残る

数式トラブル全般を症状から探したいときは、Excelの数式が計算されない原因まとめ もあわせてどうぞ。

Q. グラフで空白が0に落ちるときは?

数式で0を返している表をグラフにすると、折れ線が0まで落ちることがあります。グラフ側での空白と #N/A の扱いは Excelのグラフにデータが反映されない原因と直し方 で解説しています。

Q. XLOOKUPでも同じ?

同じです。XLOOKUP も、見つかった先が空欄なら0を返します。引数の if_not_found(見つからないときの値)は、未登録コードのときにしか働きません。

直し方は VLOOKUP と同じく、文字の列なら &""、数値の列なら IF や LET で結果を判定すればOK。XLOOKUP の書き方は XLOOKUP関数の使い方 を参考にしてください。

Q. 見積書・集計表ではどの方法が安全?

見積書なら、品名・備考は &""、単価は IF で “” を返す組み合わせが扱いやすいでしょう。金額の列も =IF(C2="","",C2*D2) のように空欄判定を入れておくと、#VALUE! を防げます。見積書のテンプレートを自作するときも、この型をそのまま使えます。

合計は + でつながず SUM で計算するのが鉄則。月次の集計表で平均や件数を出すなら、0を表示形式で隠すのはおすすめしません。IF で “” を返すほうが、元データと数字が合いやすくなります。

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