第72回 同率タイの処理:同じ数値が複数いる場合の対応

関数・自動化

前回までで本塁打・打点・安打・盗塁の4部門すべてのランキングが出来上がりました。ただ、同率の選手が複数いる場合に同じ選手名が繰り返し表示されるという問題が残っています。今回はこれを解消します。

「なんか難しそう…」と思った方もご安心ください。仕組みを一言で言うと「同じ値が何番目に出てきたかをCOUNTIFで数えて、その番号を使って別の行を探す」だけです。順を追って見ていきましょう。

問題をもう一度整理する

今シーズンの実データで同率が発生している部門を確認します。

部門 同率グループ 現在の表示(問題あり)
安打 7安打:TANAKA・NAKATA・OKADA(3名) 3位〜5位がすべて「TANAKA」と表示
打点 5打点:YAMAMOTO・OKADA(2名)
4打点:YAMAOKA・NAKATA・SATO・ITO(4名)
2〜3位が「OKADA」、4〜7位が「NAKATA」と繰り返し
本塁打 1本:SAKAI・YAMAMOTO・OKADA(3名) 1〜3位がすべて同じ名前と表示
盗塁 7個:TANAKA・SATO(2名) 1〜2位がどちらも「TANAKA」と表示

LARGEは「3位の値は 7」と正しく返してくれています。問題はその後のMATCHが「7はどこにある?」と探したとき、最初に見つけた1行目(TANAKA)の行番号しか返さないことです。2人目・3人目のNAKATA・OKADAには辿り着けていません。

解決の考え方:「何番目に登場したか」を使う

解決策のポイントは1つです。

📝 同率対処の考え方

「3位もTANAKAになってしまう」のは、MATCHが「安打7」を列の上から探して最初の1人目しか返さないからです。

そこで「3位を表示するとき、安打7の2人目を返してほしい」「4位を表示するとき、安打7の3人目を返してほしい」と指示できれば解決します。

「今は何人目の同率か」——この番号をCOUNTIFで計算して、MATCH の検索に反映させます。

COUNTIFで「何人目の同率か」を計算する

具体的に盗塁ランキングで考えます。ランキングシートのC列(盗塁値)にLARGEの結果が並んでいるとします。

A列(順位) C列(LARGE結果) 「この行まで同じ値は何個?」
3行目 1 7 1個目
4行目 2 7 2個目
5行目 3 2 1個目(値が変わったのでリセット)

「この行まで同じ値は何個あるか」を計算する式がこれです。

✅ 「何個目の同率か」を返す式(補助列 or 式の中に埋め込む)
=COUNTIF($C$3:C3, C3)

ポイントは範囲の開始を絶対参照($C$3)、終了を相対参照(C3)にすること。

  • C3セルで計算すると → COUNTIF($C$3:C3, C3) → 「C3からC3の範囲で7は何個?」→ 1
  • C4セルで計算すると → COUNTIF($C$3:C4, C4) → 「C3からC4の範囲で7は何個?」→ 2
  • C5セルで計算すると → COUNTIF($C$3:C5, C5) → 「C3からC5の範囲で2は何個?」→ 1(値が変わったのでリセット)

「先頭セルだけ絶対参照、末尾セルは相対参照」という書き方で、式を下にコピーするたびに範囲が1行ずつ広がります。これが「この行まで何個?」を計算するコツです。

この番号をMATCHに渡す:MATCHの第3の使い方

「何個目の同率か」がわかったら、それをMATCHに渡します。MATCHには「N番目に一致する位置を返す」ためのテクニックがあります。

通常の MATCH(値, 範囲, 0) は「最初の一致」しか返しません。「2番目の一致」を返すには、配列数式を使って次のように書きます。

📝 N番目の一致を探すMATCHの書き方
=MATCH(1, (検索範囲=検索値) * (COUNTIF(補助範囲, 補助範囲)=N番目), 0)

少し複雑に見えますが、実用上は補助列を作る方法のほうがシンプルで管理しやすいです。次のセクションで補助列アプローチを解説します。

実用的な解決策:補助列を使う

式を1つのセルに詰め込もうとすると複雑になります。ランキングシートに「何個目か」の補助列を1列追加するのが、最もシンプルで確実な方法です。

STEP 1:補助列を追加する(例:D列)

盗塁ランキングのC列(LARGE結果)の隣、D列に次の式を入れます。

=COUNTIF($C$3:C3, C3)   ← D3セル(以下D4・D5…とコピー)

これで D3=1、D4=2(同率なら)、D5=1(値が変わったら)という数列ができます。

STEP 2:選手名の式をMATCHの中で「N番目の一致」に書き換える

B列の選手名式を次のように変更します。Ctrl+Shift+Enter で確定してください。

=IFERROR(INDEX('年間(野手)'!B:B,
  MATCH(1,
    ('年間(野手)'!J:J=C3) *
    (COUNTIF('年間(野手)'!$J$2:$J2,'年間(野手)'!J2:J200)=D3),
  0)), "")

※ 盗塁列の場合。J:Jの部分を各部門の列に変えます。

式の意味:「盗塁列でC3と同じ値の行」かつ「その値の中でD3番目に登場する行」を探し、その行の選手名を返します。

STEP 3:補助列を非表示にする

補助列(D列)は計算に必要ですが、ランキング表に表示する必要はありません。列を選択して右クリック →「列を非表示」にするとスッキリします。数値は残っているので計算は正常に動き続けます。

⚠️ 補助列のCOUNTIF範囲について

STEP 2の式の中にある COUNTIF('年間(野手)'!$J$2:$J2, …) は、年間(野手)シート側でも「この行まで同じ値が何個か」を数えています。

範囲の書き方が $J$2:$J2 と少し特殊ですが、「先頭は絶対参照、末尾は相対参照」という補助列と同じ考え方です。配列数式として展開されるため、J2からJ2・J3・J4…と1行ずつ広がって各選手の「何人目か」を計算します。

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

盗塁ランキングで補助列方式を適用した結果を確認します。

順位 選手名(修正後) 盗塁 補助列(何個目) 備考
1位 TANAKA 7 1 7の1人目 → TANAKA ✅
2位 SATO 7 2 7の2人目 → SATO ✅
3位 SAKAI 2 1 2の1人目 → SAKAI ✅
4位 SUZUKI 2 2 2の2人目 → SUZUKI ✅
5位 ITO 2 3 2の3人目 → ITO ✅

1〜2位の同率7盗塁がTANAKAとSATOに分かれて正しく表示されました。同率のときに「同じ名前が繰り返される」問題が解消されています。

安打ランキングの結果も確認する

3名が同率だった安打ランキング(7安打:TANAKA・NAKATA・OKADA)も同じ方式で修正した結果です。

順位 選手名(修正後) 安打
1位 SUZUKI 14
2位 SATO 10
3位 TANAKA 7
4位 NAKATA 7
5位 OKADA 7

3〜5位に同率7安打の3選手がそれぞれ別々に表示されました。1位・2位は単独なので以前と変わらず、同率の部分だけがきれいに整理されています。

同率表示を簡略化する選択肢:「T(タイ)」表記

補助列方式は完全に対処できますが「式が複雑で管理が不安」という方には、もう1つシンプルな代替案があります。

📝 同率を「T(タイ)」表記で示す代替案

プロ野球の順位表でも使われる「T1」「T2」のようなタイ表記は、「同率で並んでいる」ことをシンプルに伝えられます。

順位列 選手名 盗塁
T1 TANAKA 7
T1 SATO 7
3 SAKAI 2

順位列に「T」を自動で付けるには、=IF(COUNTIF(C列全体, C3)>1, "T"&A3, A3) のような式で対応できます。ただし選手名が繰り返す問題は別途補助列で対処する必要があります。

「同率が出たとき」の対処まとめ

✅ 同率タイへの3つの対処法と使い分け
方法 やること おすすめの場面
補助列方式 COUNTIFで「何個目か」を計算してINDEX・MATCHに渡す ランキング表を完全に自動化したい場合
T(タイ)表記 同率のとき順位列に「T」を付けて表示する 見た目のわかりやすさを重視する場合
許容する 同率は繰り返し表示のまま放置 草野球で厳密さよりも手軽さを優先する場合

草野球の成績管理という用途では、「許容する」も十分な選択肢です。数値は正しく出ているので、同じ名前が並んでいても「同率が2名いるんだな」と読み取ることはできます。チームの運用スタイルに合わせて選んでください。

✅ この記事のまとめ
  • 同率問題の原因は、MATCHが最初に見つけた1行しか返さないこと——「7盗塁の2人目」には届かない
  • 解決の核心は COUNTIF($C$3:C3, C3) で「この行まで同じ値は何個目か」を計算すること——先頭を絶対参照・末尾を相対参照にするのがコツ
  • 補助列方式が最もシンプル:①補助列にCOUNTIF式を追加 → ②選手名の式をN番目一致に変更 → ③補助列を非表示にする
  • 草野球レベルでは「同率は繰り返し表示のまま許容する」という選択肢も十分あり
  • 次回はSORT・FILTER関数で自動ソートするモダンな方法を解説する

次回予告

次回は「SORT・FILTER関数で自動ソートする」。今回まで解説してきたLARGE・INDEX・MATCHを使う方法は汎用性が高い一方、式がやや複雑です。Googleスプレッドシート限定ですが、SORT・FILTER関数を使うともっとシンプルにランキングを作れます。2つのアプローチを比較しながら、使い分けのポイントを解説します。

▶︎ 次回:【第73回】SORT・FILTER関数で自動ソートする

コメント

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