前回はSUMPRODUCT関数を使って投球回を選手ごとに正しく合算し、「6.666…」「12.333…」のような実数として求めました。今回はその実数を「6回2/3」「12回1/3」のような読みやすい形式に変換する表示関数を作ります。
「数字は合っているけど、6.666…と表示されていても意味がわかりにくい」。そのとおりです。スコアブックや成績表では「6回2/3」という形式が標準なので、見た目も成績表らしく仕上げましょう。今回はINT・MOD・IFを組み合わせた少し長めの関数を作りますが、3つのパーツに分解すると必ずわかります。
完成形のイメージ:3パターンに分類する
投球回の実数(SUMPRODUCT式の結果)を表示形式に変換するとき、端数のパターンは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.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回」になります。
IF(MOD(I2,1)<0.4, INT(I2)&"回1/3", …)
パーツ①でfalse(端数あり)と判定された場合に、小数部分が0.4未満(≒0.333…)なら1/3と判断して「○回1/3」と表示します。12.333…なら「12回1/3」になります。
INT(I2)&"回2/3"
パーツ①②いずれにも該当しなかった場合(小数部分が0.4以上=0.666…)は2/3と確定して「○回2/3」と表示します。6.666…なら「6回2/3」になります。
実際のデータで変換結果を確認する
年間(投手)シートの全選手で変換結果を確認します。
| 選手名 | 実数(I2の値) | MOD(I2,1) | 判定 | 表示結果 |
|---|---|---|---|---|
| SUZUKI | 22.000 | 0.000 | 端数なし | 22回 |
| YAMAMOTO | 9.000 | 0.000 | 端数なし | 9回 |
| NAKATA | 6.666… | 0.666… | 2/3 | 6回2/3 |
| YAMAOKA | 12.333… | 0.333… | 1/3 | 12回1/3 |
| SAKAI | 5.000 | 0.000 | 端数なし | 5回 |
| TANAKA | 1.000 | 0.000 | 端数なし | 1回 |
| OKADA | 2.000 | 0.000 | 端数なし | 2回 |
| YAMASAKI | 0.000 | 0.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)の計算式を作る



コメント