前回は、投球回の小数表記(1.1・1.2)を正しい実数に変換するINT + MOD × 10 ÷ 3のロジックを学びました。今回はこの考え方を、複数登板の合計に応用していきます。
「変換式はわかった。でも登板ごとにバラバラに入力された投球回を、選手別にどうやって合計すればいいの?」——今回はこの疑問にお答えします。ここで登場するのがSUMPRODUCT関数です。見た目は少し複雑ですが、考え方さえつかめば必ず書けるようになりますので、安心して読み進めてください。
なぜSUMIFではなくSUMPRODUCTを使うのか
選手ごとの数値を合計するときは、SUMIF関数を使うのが基本でした(第46回)。しかし、投球回の合計にSUMIFを使うと、ある問題が起きてしまいます。
SUMIFは「条件に合うセルの値をそのまま足す」関数です。投球回の入力値(1.1・0.2など)をそのまま足してしまうため、前回説明した「小数部分の足し算ミス」がそのまま発生してしまいます。
NAKATAの投球回入力値:0.2 + 1.0 + 2.0 + 2.0 + 1.2 SUMIF結果:6.4 → 「6回4/3?」(存在しない数値) 正しくは:6回2/3 = 6.666…
SUMIFには「合計する前に変換する」という芸当ができません。変換と合計を同時にこなせる関数が必要になります。それがSUMPRODUCTです。
SUMPRODUCT関数の基本
SUMPRODUCTは本来「複数の配列を掛け合わせて合計する」関数ですが、今回は「条件に合う行だけを変換しながら合計する」という使い方をします。
=SUMPRODUCT(
('フォーム(投手)'!D:D=B2) *
(INT('フォーム(投手)'!H:H) + MOD('フォーム(投手)'!H:H, 1) * 10 / 3)
)
各部分の意味を分解すると、次のようになります。
('フォーム(投手)'!D:D=B2):名前列が対象選手と一致する行を1(TRUE)、それ以外を0(FALSE)で返すINT(…) + MOD(…) * 10 / 3:前回の変換式をフォームの投球回列(H列)に適用する- 両者を
*で掛け合わせると、対象選手の行だけ変換後の値が残り、それ以外は0になる - 最後にSUMPRODUCTが全行を合計する
SUMPRODUCTの中で(条件) * (値)と書くと、条件がTRUEの行は「1×値=値」、条件がFALSEの行は「0×値=0」になります。つまり条件に合う行の値だけが生き残り、そのまま合計されるという仕組みです。COUNTIFSやSUMIFSの「条件に合うセルをカウント・合計する」という発想を、より柔軟な計算に応用したものがSUMPRODUCTだと考えると、理解しやすいはずです。
サンプルデータで計算過程を追う
例えば、こんな登板データがあったとします。NAKATAさんの投球回合計を例に、式の中で何が起きているのかを一行ずつ追ってみましょう。フォーム(投手)シートのNAKATA登板データが、次のようになっていたとします。
| 登板 | 入力値(H列) | 選手一致? | 変換後の実数 | ×の結果 |
|---|---|---|---|---|
| 第1試合 | 0.2 | 1(TRUE) | 0.666… | 0.666… |
| 第3試合 | 1.0 | 1(TRUE) | 1.000 | 1.000 |
| 第4試合 | 2.0 | 1(TRUE) | 2.000 | 2.000 |
| 第5試合 | 2.0 | 1(TRUE) | 2.000 | 2.000 |
| 第7試合 | 1.2 | 1(TRUE) | 1.666… | 1.666… |
| 他選手の行 | (各値) | 0(FALSE) | (各変換値) | 0(消える) |
| SUMPRODUCT合計 | 6.666… | |||
6.666…=6回2/3。これは、年間シートに表示される「6回2/3」と一致します。0.2(0回2/3)と1.2(1回2/3)が正しく変換され、きちんと合算された結果です。もしSUMIFでそのまま足していたら、0.2+1.0+2.0+2.0+1.2=6.4という誤った値になっていたところでした。
式を年間(投手)シートに入力する手順
フォーム(投手)シートのH列が投球回の入力値です。年間(投手)シートの投球回列(例:I列)に、これからSUMPRODUCT式を入力していきます。
B2に選手名が入っている前提で、I2セルに次の式を入力します。
=SUMPRODUCT(
('フォーム(投手)'!D:D=B2) *
(INT('フォーム(投手)'!H:H) + MOD('フォーム(投手)'!H:H, 1) * 10 / 3)
)
I2の式を、全投手分の行にコピーしましょう。B列の選手名(B2)が相対参照になっているため、コピーするだけで各行に対応した選手の合計が自動計算されます。なお、フォームシートへの参照は列全体指定(D:D・H:H)のため、絶対参照にする必要はありません。
NAKATAのセルが6.666…、S.SADAが12.333…になっていれば、正しく動作しています。次回(第60回)は、この実数を「6回2/3」という形式の表示に変換していきます。
フォーム(投手)のようにシート名に括弧が含まれる場合、スプレッドシートの参照式では'フォーム(投手)'!H:Hのように、シート名をシングルクォート(’)で囲む必要があります。括弧やスペースのないシート名であれば、この対応は不要です。
- 投球回の合計にSUMIFを使うと小数部分の誤りが蓄積するため、SUMPRODUCTを使う
- 式は
=SUMPRODUCT((名前列=選手名) * (INT(投球回列) + MOD(投球回列, 1) * 10 / 3)) (条件) * (変換値)の掛け算で「対象選手の行だけ変換後の値を残し、他は0にする」仕組み- NAKATAさんの例(6.666…=6回2/3)で年間シートの表示との一致を確認。SUMIFでは6.4という誤った値になってしまう
- 次回(第60回)は、この実数を「○回○/3」形式の見やすい表示に変換する
次回予告
次回のテーマは「投球回を『○回○/3』形式で表示する」。SUMPRODUCT式で求めた6.666…という実数を、「6回2/3」という読みやすい形式に変換する表示関数の作り方を解説します。
▶︎ 次回:【第60回】投球回を「○回○/3」形式で表示する



コメント