第59回 投球回の合計を正しく計算する

関数・自動化

前回は投球回の小数表記(1.1・1.2)を正しい実数に変換する INT + MOD × 10 ÷ 3 のロジックを学びました。今回はそれを複数登板の合計に応用します。

「変換式はわかった。でも登板ごとにバラバラに入力された投球回を選手別にどうやって合計するの?」という疑問が今回のテーマです。ここで登場するのが SUMPRODUCT関数。少し見た目は複雑ですが、考え方を理解すれば必ず書けるようになります。

なぜSUMIFではなくSUMPRODUCTを使うのか

選手ごとの数値を合計するときはSUMIF関数を使うのが基本でした(第46回)。しかし投球回の合計でSUMIFを使うと問題が起きます。

⚠️ 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.21(TRUE)0.666…0.666…
第3試合1.01(TRUE)1.0001.000
第4試合2.01(TRUE)2.0002.000
第5試合2.01(TRUE)2.0002.000
第7試合1.21(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 という誤った値になっていました。

式を年間(投手)シートに入力する手順

STEP 1:投球回を記録する列を確認する

フォーム(投手)シートのH列が投球回の入力値です。年間(投手)シートの投球回列(例:I列)にSUMPRODUCT式を入力します。

STEP 2:2行目に式を入力する

B2に選手名が入っている前提で、I2セルに次の式を入力します。

=SUMPRODUCT(
  ('フォーム(投手)'!D:D=B2) *
  (INT('フォーム(投手)'!H:H) + MOD('フォーム(投手)'!H:H, 1) * 10 / 3)
)
STEP 3:全投手行にコピーする

I2の式を全投手分の行にコピーします。B列の選手名(B2)が相対参照になっているため、各行に対応した選手の合計が自動で計算されます。フォームシートへの参照は列全体指定(D:D・H:H)のため絶対参照不要です。

STEP 4:計算結果を確認する

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」形式で表示する

コメント

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