第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をコピーしました