第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人目のNAKATAや3人目のOKADAにはたどり着けません。

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

解決の糸口はシンプルです。

📝 同率対処の考え方

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