第69回 INDEX・MATCHで選手名とセットで表示する

関数・自動化

前回はLARGE関数を使い、打率・打点・本塁打の上位N件の数値をランキングシートに自動取得しました。ただ、この状態では「1位は.636」とわかっても、それが誰の成績なのかまではわかりません。今回は、その空白を埋めるINDEX・MATCHの組み合わせを解説します。

「INDEXとMATCH、2つも覚えるの?」と身構えた方、安心してください。それぞれの役割はシンプルで、INDEXは「場所を指定してデータを取り出す」、MATCHは「値を探してその場所を教える」というだけの関数です。この2つを組み合わせると、「〇位の選手名を自動表示する」が実現します。順番に見ていきましょう。

INDEX・MATCHを使う前に:今どういう状態か確認する

前回の終わり時点で、ランキングシートは次のような状態でした。

順位 選手名 打率
1 (空欄) .636 ✅
2 (空欄) .368 ✅
3 (空欄) .368 ✅
4 (空欄) .357 ✅
5 (空欄) .318 ✅

数値はすでに揃っています。今回のゴールは、この「選手名(空欄)」の列をINDEX・MATCHで自動的に埋めることです。

まずINDEX単体を理解する

INDEX関数は、「指定した範囲の〇行目にあるデータを取り出す」関数です。

📝 INDEX関数の構造
=INDEX(範囲, 行番号)
引数 意味
範囲 取り出したいデータが入っている列 年間(野手)シートの選手名列(B列)
行番号 「その範囲の何行目か」を数値で指定 3(3行目のデータを取り出す)

要するに「この列の〇行目の値を持ってきて」と頼む関数だと考えてください。

例えば、年間(野手)シートのB列(選手名)がこんなふうに並んでいたとします。

B列(選手名)
1 選手名(ヘッダー)
2 TANAKA
3 NAKATA
4 YAMAMOTO
5 YAMAOKA
6 SUZUKI

このとき=INDEX('年間(野手)'!B:B, 6)と書けば、返ってくるのは「SUZUKI」です。6行目のデータを指定したのですから、当然ですね。

ただ、ここで1つ壁にぶつかります。「打率1位の選手が何行目にいるか」がわからなければ、INDEXは使えません。その「何行目か」を自動で調べてくれるのが、次に紹介するMATCH関数です。

次にMATCH単体を理解する

MATCH関数は、「指定した値が範囲の何行目にあるか」を返す関数です。

📝 MATCH関数の構造
=MATCH(検索値, 検索範囲, 照合の型)
引数 意味 今回の設定
検索値 「何を探すか」 LARGEで取り出した「1位の打率の値」
検索範囲 「どこを探すか」 年間(野手)シートの打率列(D列)
照合の型 「完全一致で探すか」の指定 0(完全一致)を必ず使う

照合の型は0(完全一致)で固定と覚えてください。1や-1はソート済みリスト用の設定で、順不同の成績表には向きません。

先ほどの例で確認してみましょう。打率1位の値.636が、年間(野手)シートのD列の何行目にあるかをMATCHで調べます。

=MATCH(0.6363636364, '年間(野手)'!D:D, 0)

打率.636(正確には0.6363636364)はD列の6行目にあるため、MATCHは6を返します。

INDEXとMATCHを組み合わせる

ここまでの流れを整理すると、次のようになります。

ステップ① MATCHで「何行目か」を調べる
MATCH( LARGEで取り出した値, 打率列, 0 ) → 6(行番号)

「打率1位の値(.636)は何行目にある?」→6

ステップ② INDEXで「その行の選手名」を取り出す
INDEX( 選手名列, 6 ) → SUZUKI

「選手名列の6行目は?」→SUZUKI

ステップ③ 2つを1つの式にまとめる
=INDEX( 選手名列, MATCH( LARGEの値, 打率列, 0 ) )

MATCHが返した行番号を、そのままINDEXの第2引数に渡すだけです。「〇行目を調べて、その行を取り出す」という2段階の処理が、1つの式で完結します。

完成形の式:打率ランキングに選手名を表示する

ランキングシートのC3セルに、打率1位の数値(LARGEの結果)が入っているとします。選手名列のB3セルに入れる式は、次のとおりです。

✅ 打率ランキング・選手名の完成式

1位の選手名(ランキングシートのB3セル)

=INDEX('年間(野手)'!B:B, MATCH(C3, '年間(野手)'!D:D, 0))

式の読み方

  • '年間(野手)'!B:B:取り出したいデータ(選手名列)
  • MATCH(C3, '年間(野手)'!D:D, 0):C3の値(打率1位の数値)が、打率列の何行目にあるかを探す
  • その行番号をINDEXに渡し、選手名列の同じ行を返す

B3に入れたこの式をB4・B5・B6・B7にコピーするだけで、2〜5位の選手名も自動表示されます(C列の参照先がC4・C5…と自動でずれていくためです)。

打点・本塁打ランキングへの応用

打点と本塁打も、考え方はまったく同じです。変わるのは列番号だけです。

打点ランキング・選手名の式
=INDEX('年間(野手)'!B:B, MATCH(打点1位の値が入ったセル, '年間(野手)'!I:I, 0))

打点はI列です。LARGEで取り出した打点1位の値が入るセルを、MATCH内の検索値として渡します。

本塁打ランキング・選手名の式
=INDEX('年間(野手)'!B:B, MATCH(本塁打1位の値が入ったセル, '年間(野手)'!H:H, 0))

本塁打はH列です。構造は打率とまったく同じで、MATCH内で検索する列を変えるだけで対応できます。

📝 3指標の違いは「どの列を検索するか」だけ
指標 MATCHで検索する列 INDEXで取り出す列
打率 D列(打率) B列(選手名)
打点 I列(打点) B列(選手名)
本塁打 H列(本塁打) B列(選手名)

取り出す先(選手名列B列)はどの指標でも共通です。指標ごとに切り替えるのは、MATCHで探しに行く列だけです。

サンプルデータで結果を確認する

例えば、こんな年間(野手)シートがあったとして、INDEX・MATCHの結果を確認してみましょう。

順位 選手名(INDEX・MATCH結果) 打率 備考
1位 SUZUKI .636 22打数14安打で断トツ1位
2位 TANAKA .368 同率の2人のうち先に見つかった選手が表示される
3位 TANAKA .368 ⚠️ 同率の場合、同じ選手名が2回表示される(次々回で対処)
4位 SATO .357 28打数10安打
5位 YAMASAKI .318 22打数7安打

1位のSUZUKIさん、4位のSATOさん、5位のYAMASAKIさんは、いずれも問題なく表示されました。ただし2位と3位は同率(.368)のため、どちらも「TANAKA」と表示されています。これはINDEX・MATCHの仕様によるもので、同じ値が複数ある場合は、最初に見つかった行の選手名を返すという性質があるためです。

この同率問題への対処は、次々回(第72回)で詳しく解説します。今の段階では「同率があると同じ名前が出ることがある」と理解しておけば十分です。

よくある失敗パターン:照合の型を省略してしまう

⚠️ MATCH関数の照合の型は必ず「0」を指定する
❌ よくあるミス:照合の型を省略する
=MATCH(C3, '年間(野手)'!D:D) ← 照合の型が省略されている

照合の型を省略すると、「1(昇順ソート済みを前提とした近似一致)」とみなされてしまいます。成績表はソートされていないため正しい行番号が返らず、まったく別の選手名が表示されることがあります。

✅ 正しい書き方:必ず末尾に「, 0」を付ける
=MATCH(C3, '年間(野手)'!D:D, 0) ← 完全一致を指定

「0」を付ければ完全一致で検索されるため、ソート順にかかわらず正確な行番号が返ります。MATCHを使うときは「末尾に0を必ずつける」と、セットで覚えておきましょう。

LARGEとINDEX・MATCHの役割分担を整理する

ここで、前回のLARGEと今回のINDEX・MATCH、それぞれの役割の違いを改めて整理しておきます。

📝 LARGE・MATCH・INDEXの役割分担
関数 役割 返すもの
LARGE 「〇位の値はいくつか」を取り出す 数値(例:.636)
MATCH 「その値は何行目にあるか」を調べる 行番号(例:6)
INDEX 「その行の選手名を取り出す」 選手名(例:SUZUKI)

処理はLARGE→MATCH→INDEXの順に流れます。3つがバトンリレーのように連携し、「1位の打率はSUZUKIの.636」という1つの結果を作り出しているわけです。

この回が終わった時点のランキングシートの状態

✅ 第69回終了時点のランキングシートの状態
順位 選手名 打率
1 SUZUKI ✅ .636 ✅
2 TANAKA ✅ .368 ✅
3 TANAKA ⚠️(同率問題) .368 ✅
4 SATO ✅ .357 ✅
5 YAMASAKI ✅ .318 ✅

前回まで空欄だった選手名列が、無事に埋まりました。同率問題(3位がTANAKAと表示されてしまう件)は、第72回で対処します。

✅ この記事のまとめ
  • INDEXは「範囲の〇行目のデータを取り出す」関数、MATCHは「値が範囲の何行目にあるかを返す」関数
  • 2つを組み合わせると=INDEX(選手名列, MATCH(〇位の値, 成績列, 0))という式で選手名が自動表示できる
  • MATCHの第3引数(照合の型)は必ず「0」を指定する——省略すると誤った行番号が返ることがある
  • 指標が変わっても構造は同じで、MATCHで検索する列だけを変えれば打点・本塁打にも使える
  • 同率の場合は最初に見つかった選手名が繰り返し表示される——この問題は第72回で対処する
  • 次回は打率ランキングに規定打席条件を組み込む

次回予告

次回は「打率ランキング:規定打席条件を組み込む」です。打率は、未出場や打席数が少ない選手の極端な数値(0や1.000など)がランキングに紛れ込みやすい指標でもあります。「試合数×1.8」という規定打席をクリアした選手だけを対象にする条件を、LARGE関数にどう組み込むかを解説します。

▶︎ 次回:【第70回】打率ランキング:規定打席条件を組み込む

コメント

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