前回は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(範囲, 行番号)
| 引数 | 意味 | 例 |
|---|---|---|
| 範囲 | 取り出したいデータが入っている列 | 年間(野手)シートの選手名列(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(検索値, 検索範囲, 照合の型)
| 引数 | 意味 | 今回の設定 |
|---|---|---|
| 検索値 | 「何を探すか」 | 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( LARGEで取り出した値, 打率列, 0 ) → 6(行番号)
「打率1位の値(.636)は何行目にある?」→6
INDEX( 選手名列, 6 ) → SUZUKI
「選手名列の6行目は?」→SUZUKI
=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内で検索する列を変えるだけで対応できます。
| 指標 | 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(C3, '年間(野手)'!D:D) ← 照合の型が省略されている
照合の型を省略すると、「1(昇順ソート済みを前提とした近似一致)」とみなされてしまいます。成績表はソートされていないため正しい行番号が返らず、まったく別の選手名が表示されることがあります。
=MATCH(C3, '年間(野手)'!D:D, 0) ← 完全一致を指定
「0」を付ければ完全一致で検索されるため、ソート順にかかわらず正確な行番号が返ります。MATCHを使うときは「末尾に0を必ずつける」と、セットで覚えておきましょう。
LARGEとINDEX・MATCHの役割分担を整理する
ここで、前回のLARGEと今回のINDEX・MATCH、それぞれの役割の違いを改めて整理しておきます。
| 関数 | 役割 | 返すもの |
|---|---|---|
| LARGE | 「〇位の値はいくつか」を取り出す | 数値(例:.636) |
| MATCH | 「その値は何行目にあるか」を調べる | 行番号(例:6) |
| INDEX | 「その行の選手名を取り出す」 | 選手名(例:SUZUKI) |
処理はLARGE→MATCH→INDEXの順に流れます。3つがバトンリレーのように連携し、「1位の打率はSUZUKIの.636」という1つの結果を作り出しているわけです。
この回が終わった時点のランキングシートの状態
| 順位 | 選手名 | 打率 |
|---|---|---|
| 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関数にどう組み込むかを解説します。



コメント