別シートの数字を「=」で引っ張ってきたら、元が空欄の行にだけ「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 | 佐藤 | 120 | 120 |
| 3 | 鈴木 | (空白) | 0 |
| 4 | 高橋 | 80 | 80 |
| 5 | 田中 | (空白) | 0 |
| 6 | 伊藤 | 100 | 100 |
C3 に入っている式は =B3 だけ。B3 は空欄なのに、結果は0になります。=入力!B3 のように別シートを参照した場合も同じ結果です。
症状:VLOOKUP・INDEXの結果が0になる
商品マスタから単価や備考を引く表でもよく起きます。次のマスタが F〜I 列にあり、A2 に入力したコードで情報を呼び出す想定です。
| 行 | F コード | G 品名 | H 単価 | I 備考 |
|---|---|---|---|---|
| 2 | A01 | ボールペン | 120 | (空白) |
| 3 | A02 | ノート | (空白) | 取寄せ |
| 4 | A03 | クリップ | 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) | 300 | 300 |
=AVERAGE(x2:x6) | 60 | 100 |
=COUNT(x2:x6) | 5 | 3 |
=COUNTA(x2:x6) | 5 | 5 |
=COUNTBLANK(x2:x6) | 0 | 2 |
=ISBLANK(x3) | FALSE | FALSE |
=x3+1 | 1 | #VALUE! |
=N(x3)+1 | 1 | 1 |
=SUM(x3,1) | 1 | 1 |
表の 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)+1 | 1 |
| + を使わずに合計する | =SUM(D3,1) または =SUM(D2:D6) | 1 / 300 |
| 数値が入った件数だけ数える | =COUNT(D2:D6) | 3 |
| 文字が1文字以上ある件数を数える | =COUNTIF(E2:E4,"?*") | 1 |
| 空白か “” かを判定する | =D3="" または =LEN(D3)=0 | TRUE |
| &”” で文字列になった数値を戻す | =--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 の設定で、手順は次のとおり。
- 「ファイル」タブから「オプション」を開きます。
- 左の一覧で「詳細設定」を選びます。
- 「次のシートで作業するときの表示設定」で対象のシートを選びます。
- 「ゼロ値のセルにゼロを表示する」のチェックを外し、「OK」を押します。
チェックを外すと、そのシートの0が表示されなくなります。チェックを付け直せば元どおり。設定はシート単位なので、ほかのシートには影響しません。
気をつけたいのは、手入力した本物の0も消えること。数量0・残高0のように「0であること」に意味がある表では、未入力と区別がつかなくなります。
ユーザー定義書式 0;-0;;@ で隠す(値は0のまま)
特定の列だけ0を隠したいなら、表示形式の出番。
- 0を隠したいセル範囲を選びます。
- Ctrl+1 を押して「セルの書式設定」を開きます。
- 「表示形式」タブの「ユーザー定義」を選びます。
- 「種類」に
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を平均に含めてよい |
迷ったら、次の順番で考えると決めやすくなります。
- その列は文字(品名・備考)か? → はい:
&"" - 空欄を平均や件数から外したいか? → はい:IF で “” を返す(足し算は SUM や N 関数で)
- シート全体の0を消してよく、本物の0もないか? → はい:オプションをオフ
- それ以外 → 書式
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 で “” を返すほうが、元データと数字が合いやすくなります。
