第85回 #DIV/0!エラーの原因と直し方

運用・トラブル対応

今回から第11章「トラブルシューティング」に入ります。実際に成績管理表を運用していると、思いがけないエラーに遭遇することがあります。まず最初に扱うのが#DIV/0!エラーです。

「セルに #DIV/0! と表示されてしまった」「シーズン前に表を開いたらエラーだらけになっていた」——そういった経験をした方もいるかもしれません。このエラーは打率・防御率・勝率など、割り算を使う計算で必ず直面します。仕組みを理解すれば対処は簡単です。一緒に整理していきましょう。

#DIV/0!エラーとは何か

一言でいうと「0で割り算しようとしたときに出るエラー」です。数学と同じで、スプレッドシートでも0での割り算は定義されていません。

📝 #DIV/0! が出る典型的なパターン
場面 0になる理由
打率 =安打/打数 シーズン前・欠場が続くと打数が0になる
防御率 =自責点×9÷投球回 登板がない投手の投球回が0になる
勝率 =勝÷(勝+負) シーズン開始前は勝も負も0なので分母が0
出塁率 =(安打+四死球)÷(打数+四死球+犠飛) 全打席が犠打のみなどで分母が0になりうる

シーズン開始直後や、出場していない選手の行に特に発生しやすいのが特徴です。

対処法は2種類:IFERRORとIF

対処の関数は2つあります。「エラーが出てから対処するIFERROR」「エラーが出る前に防ぐIF」です。どちらを使うかは状況で使い分けます。

関数 仕組み 向いている場面
IFERROR 計算を試みて、エラーになったら代わりの値を返す 打率のように「打数が0=データなし」が明確な場合
IF 条件を先にチェックして、0なら計算せずに直接0を返す 勝率のように「分母が0かどうか」が明確に判断できる場合
📝 どちらを使っても結果は同じ——使い分けのポイントは「意図の明確さ」

実用上はどちらを使っても#DIV/0!エラーを防げます。ただしIFERRORは「何かエラーが起きたら全部0にする」のに対し、IFは「この条件のときだけ0にする」と意図が明確です。

本連載の成績管理表では、打率にはIFとIFERRORを組み合わせ、勝率にはIFだけを使っています。実際の式を見ながら確認していきます。

打率の実際の式:IFとIFERRORの二重構造

年間(野手)シートの打率列(D列)に入っている実際の式はこうなっています。

✅ 年間(野手)シートD列の打率計算式
=IF($B2="", "", IFERROR(G2/F2, 0))

式を外側から順に読み解きます。

パーツ 意味
IF($B2="", "", …) B列(選手名)が空欄なら空欄を返す。選手がいない行には何も表示しない
IFERROR(G2/F2, 0) 安打(G2)÷打数(F2)を計算し、エラー(打数が0)なら0を返す

二重構造になっているのは理由があります。IFだけだと「選手はいるが打数が0(試合に出たが全打席が四球など)」の場合にエラーになります。IFERRORだけだと選手がいない空欄行にも0が表示されてしまいます。両方を組み合わせることで、「選手がいる行だけ計算し、計算できなければ0にする」という動作を実現しています。

防御率の実際の式:IFで投球回の0をチェック

年間(投手)シートの防御率列(H列)に入っている実際の式は少し複雑です。核心部分に絞ると構造はこうなっています。

✅ 年間(投手)シートH列の防御率計算式(構造のみ)
=IF($B2="", "",
  LET(
    total_outs, SUMPRODUCT(…投球回をアウト数に変換…),
    IF(total_outs=0, 0, ROUND($K2*9/(total_outs/3), 2))
  )
)

外側のIF・内側のIFの役割を整理します。

パーツ 役割
IF($B2="", "", …) 選手名が空欄の行は空欄のまま表示——打率と同じ考え方
LET(total_outs, …) 投球回を変換したアウト数合計を「total_outs」という名前で計算・保存する(LETは値に名前をつけて使いまわす関数)
IF(total_outs=0, 0, ROUND(…)) アウト数(=投球回)が0なら0を返す——登板がない投手の0除算を防ぐ

防御率ではIFERRORではなくIF(total_outs=0)で防いでいます。投球回が0かどうかを直接チェックするほうが、意図が明確で安全だからです。

勝率の実際の式:シンプルなIFだけ

チームシートの勝率列(F列)の式は最もシンプルです。第79回で作った式です。

✅ チームシートF列の勝率計算式
=IF(C2+D2=0, 0, C2/(C2+D2))

「勝(C2)+負(D2)がゼロなら0を返す、そうでなければ勝÷(勝+負)を計算する」というシンプルな構造です。

チームシートはA列に年度(2026・2027…)が手入力で入っているため、「行が空欄かどうか」ではなく「勝+負が0かどうか」だけをチェックすれば十分です。打率や防御率のような「選手がいない行の処理」は必要ありません。

3つの式を並べて比較する

ここまで見てきた3つの式の構造を横に並べて整理します。

指標 エラー防止の方法 理由
打率 IF(選手名="","", IFERROR(安打/打数, 0)) 選手がいない行は空欄、打数0は0を返す——2つの条件を別々に対処
防御率 IF(選手名="","", IF(投球回=0, 0, 自責点×9÷投球回)) 投球回が0かを明示的にチェック——IFERRORより意図が明確
勝率 IF(勝+負=0, 0, 勝÷(勝+負)) 分母が0かを先にチェック——シンプルに1段のIFだけで完結
⚠️ IFERRORは「すべてのエラー」を拾う点に注意

IFERRORは#DIV/0!だけでなく、#REF!・#VALUE!・#NAME?など、あらゆるエラーを同じように0に変換してしまいます。

たとえば参照先のシート名を誤って変更してしまったとき(#REF!エラー)が発生しても、IFERRORが0として隠してしまうため、ミスに気づきにくくなる場合があります。打率のように「0除算しか起きない」とわかっている箇所に使うのが安全です。

すでに#DIV/0!が出てしまっているセルを直す

「すでにエラーが表示されてしまっている」という場合の直し方です。

STEP 1
エラーが出ているセルをクリックして現在の式を確認する

数式バー(上部の入力欄)に今入っている式が表示されます。「=G2/F2」のようにIFやIFERRORがない生の割り算式が入っていれば、それが原因です。

STEP 2
IFERRORで式を包む

例えば =G2/F2 になっていたら =IFERROR(G2/F2, 0) に書き換えます。数式バーをクリックして編集し、Enterキーで確定します。

STEP 3
修正したセルをコピーして同列の他のセルに貼り付ける

修正したセルを選択してCtrl+C(コピー)、同じ列の残りのセル範囲を選択してCtrl+V(貼り付け)すれば、全行に修正式が適用されます。

実際のデータで確認する

年間(野手)シートの実データで、IFとIFERRORが正しく機能しているかを確認します。

選手名 打数(F列) 安打(G列) 打率(D列) 動作
SUZUKI 22 14 .636 通常計算(14÷22)
NAKATA 0 0 0 打数0 → IFERRORが0を返す(エラーなし)
(空欄行) (空欄) 選手名なし → 外側のIFが空欄を返す

NAKATAさんはまだ出場がなく打数0ですが、エラーではなく「0」と表示されています。空欄行には何も表示されていません。IFとIFERRORの二重構造が正しく機能している状態です。

✅ この記事のまとめ
  • #DIV/0!は「0で割り算しようとしたとき」に出るエラー——打率・防御率・勝率など割り算を使う指標で必ず意識が必要
  • 対処の関数はIFERROR(エラーが出たら0に変換)とIF(分母が0かを先にチェック)の2つ
  • 打率は IF(選手名="","", IFERROR(安打/打数, 0)) ——「空欄行は空欄、打数0は0」を二重構造で実現
  • 防御率は IF(投球回=0, 0, 計算式) ——投球回が0かを明示的に確認するIFが適切
  • 勝率は IF(勝+負=0, 0, 勝/(勝+負)) ——シンプルに1段のIFだけで完結
  • IFERRORは#DIV/0!以外のエラーも隠してしまう——参照ミスなどを見逃さないよう、使う箇所は限定するのが安全

次回予告

次回は「#REF!エラーの原因と直し方」。#REF!は「参照先が見つからない」エラーです。列・行・シートを削除したあとに突然セルが #REF! になることがあります。原因のパターンと修正手順を解説します。

▶︎ 次回:【第86回】#REF!エラーの原因と直し方

コメント

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