今回から第11章「トラブルシューティング」に入ります。成績管理表を運用していると、ある日突然「セルがエラーだらけになっている」なんてことが起こるものです。そのなかでも真っ先に出会うことになるのが#DIV/0!エラーではないでしょうか。
「セルに #DIV/0! と表示されてしまった」「シーズン前に表を開いたらエラーだらけになっていた」——そんな経験に心当たりのある方もいるかもしれません。このエラーは、打率・防御率・勝率など割り算を使う計算では避けて通れないものです。ですが、仕組みさえ理解してしまえば対処はとても簡単です。順を追って整理していきましょう。
#DIV/0!エラーとは何か
一言でいうと「0で割り算しようとしたときに出るエラー」です。数学の世界と同じく、スプレッドシートでも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列)に、こんな式を入れているとします。
=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列)に入る式は少し複雑になります。例えば、次のような式を組んでいるとします。核心部分だけを取り出すと、構造はこうです。
=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除算を防いでいます。投球回が0かどうかを直接チェックするほうが、意図がはっきりして安全だからです。
勝率の式:シンプルなIFだけ
チームシートの勝率列(F列)の式は、これまでの2つと比べるとぐっとシンプルです。第79回で作った式を思い出してみましょう。
=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は#DIV/0!だけでなく、#REF!・#VALUE!・#NAME?など、あらゆるエラーを一律に0へ変換してしまいます。
例えば、参照先のシート名をうっかり変更してしまい#REF!エラーが発生したとしても、IFERRORがそれを0として隠してしまうため、ミスに気づきにくくなることがあります。打率のように「0除算しか起こりえない」とわかっている箇所に限定して使うのが安全です。
すでに#DIV/0!が出てしまっているセルを直す
ここからは「すでにエラーが表示されてしまっている」場合の直し方を見ていきます。
数式バー(上部の入力欄)に、現在入っている式が表示されます。「=G2/F2」のようにIFやIFERRORのない生の割り算式になっていれば、それが原因です。
例えば =G2/F2 となっていたら、=IFERROR(G2/F2, 0) に書き換えます。数式バーをクリックして編集し、Enterキーで確定すれば完了です。
修正したセルを選択して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!エラーの原因と直し方



コメント