第60回 投球回を「○回○/3」形式で表示する

関数・自動化

前回はSUMPRODUCT関数を使って投球回を選手ごとに正しく合算し、「6.666…」「12.333…」のような実数として求めました。今回はその実数を「6回2/3」「12回1/3」のような読みやすい形式に変換する表示関数を作ります。

「数字は合っているけど、6.666…と表示されていても意味がわかりにくい」。そのとおりです。スコアブックや成績表では「6回2/3」という形式が標準なので、見た目も成績表らしく仕上げましょう。今回はINT・MOD・IFを組み合わせた少し長めの関数を作りますが、3つのパーツに分解すると必ずわかります。

完成形のイメージ:3パターンに分類する

投球回の実数(SUMPRODUCT式の結果)を表示形式に変換するとき、端数のパターンは3種類しかありません。

✅ 端数の3パターン
実数(SUMPRODUCT結果) 端数 表示形式 実データの例
1.000 / 9.000 / 22.000なし(ちょうど)「1回」「9回」「22回」TANAKA・YAMAMOTO・SUZUKI
6.666… / 0.666…2/3「6回2/3」「0回2/3」NAKATA
12.333… / 1.333…1/3「12回1/3」「1回1/3」YAMAOKA

端数の判定には MOD(実数, 1) を使います。実数を1で割った余りが「ほぼ0なら端数なし」「ほぼ0.333…なら1/3」「ほぼ0.666…なら2/3」と判断します。

関数の完成形

投球回の実数が入っているセルをI2とすると、表示用の関数はこうなります。

✅ 投球回 表示変換の完成式
=IF(MOD(I2,1)<0.01,
    INT(I2)&"回",
  IF(MOD(I2,1)<0.4,
    INT(I2)&"回1/3",
    INT(I2)&"回2/3"
  )
)

少し長く見えますが、構造はIF→IFの2段階の場合分けです。

📝 なぜ「=0」や「=0.333」で比較しないのか

0.666…や0.333…は無限小数なので、スプレッドシートの内部では完全に一致しない場合があります。「ちょうど0」「ちょうど0.333」と比較すると予期せず判定が外れることがあるため、「0.01未満なら端数なし」「0.4未満なら1/3」という範囲比較を使うのが安全です。

関数を3つのパーツに分解して理解する

パーツ① 端数なし(ちょうど)の判定
IF(MOD(I2,1)<0.01, INT(I2)&"回", …)

MOD(I2,1) は実数の小数部分を取り出します。これが0.01未満(ほぼ0)なら端数なしと判断して「○回」と表示します。&"回" は数値と文字列「回」を連結する演算子です。22.000なら「22回」、9.000なら「9回」になります。

パーツ② 1/3の判定
IF(MOD(I2,1)<0.4, INT(I2)&"回1/3", …)

パーツ①でfalse(端数あり)と判定された場合に、小数部分が0.4未満(≒0.333…)なら1/3と判断して「○回1/3」と表示します。12.333…なら「12回1/3」になります。

パーツ③ 2/3の表示
INT(I2)&"回2/3"

パーツ①②いずれにも該当しなかった場合(小数部分が0.4以上=0.666…)は2/3と確定して「○回2/3」と表示します。6.666…なら「6回2/3」になります。

実際のデータで変換結果を確認する

年間(投手)シートの全選手で変換結果を確認します。

選手名 実数(I2の値) MOD(I2,1) 判定 表示結果
SUZUKI22.0000.000端数なし22回
YAMAMOTO9.0000.000端数なし9回
NAKATA6.666…0.666…2/36回2/3
YAMAOKA12.333…0.333…1/312回1/3
SAKAI5.0000.000端数なし5回
TANAKA1.0000.000端数なし1回
OKADA2.0000.000端数なし2回
YAMASAKI0.0000.000端数なし0回

年間シートに表示されている「6回2/3」「12回1/3」と完全に一致しています。YAMASAKIさんのように登板がない選手は0.000→「0回」と表示されます。

表示用の列と計算用の列を分ける

ここで重要なポイントがあります。今回作った表示変換式は文字列を返します。「6回2/3」という文字列は数値ではないため、防御率の計算には使えません。

⚠️ 計算用の実数列と表示用の文字列列を別に持つ

年間(投手)シートでは次のように列を2つに分けて管理するのがベストです。

内容 役割
I列(非表示も可)SUMPRODUCT式の実数(6.666…)防御率などの計算に使う
J列(表示用)変換式の文字列(「6回2/3」)成績表・ホームページ掲載用

I列を使って防御率を計算し、J列をチームのホームページや成績表に表示する、という使い分けです。I列は内訳データなので、第55回で解説した「列を非表示にする」方法でふだんは隠しておいても構いません。

✅ この記事のまとめ
  • 投球回の実数(6.666…)を「6回2/3」形式に変換するには IF・MOD・INT・&(文字列連結) を組み合わせる
  • 端数の判定は「0.01未満→端数なし」「0.4未満→1/3」「それ以外→2/3」の範囲比較が安全
  • ちょうど0.333…や0.666…と比較すると浮動小数点の誤差で判定が外れる場合があるため範囲比較を使う
  • 変換後は文字列になるため、防御率などの計算には実数のI列を使い、表示にはJ列を使うよう役割を分ける
  • 次回はこのI列の実数を使って防御率(ERA)を計算する

次回予告

次回は「防御率(ERA)の計算式を作る」。自責点×9÷投球回(実数)という式と、登板なしの選手で発生する0除算エラーへの対処を解説します。

▶︎ 次回:【第61回】防御率(ERA)の計算式を作る

コメント

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