概要
「一番売れている商品はどれ?」「金額が最大の行を丸ごと取りたい」
そんなときに使う“定番パターン”が INDEX+MATCH+MAX の組み合わせです。
やっていることはシンプルで、
- MAX で「いちばん大きい値」を出す
- MATCH で「その値がどの行にあるか(何番目か)」を探す
- INDEX で「その行のデータ」を取り出す
という三段コンボです。
この「型」さえ覚えれば、どんな表でも「最大値の行」を自動で取り出せます。
基本の考え方(MAX → MATCH → INDEX)
MAX で「最大値そのもの」を求める
たとえば、D2:D100 に「金額」が入っているとします。
最大の金額そのものは、こう書けば出せます。
=MAX(D2:D100)
ただし「最大金額はいくつか」ではなく、
「最大金額の“行の情報”を取りたい」のが本当の目的ですよね。
そこで MATCH と INDEX の出番です。
MATCH で「最大値が何行目か」を求める
MAX の結果を MATCH に渡して、「どの行にあるか」を求めます。
=MATCH(MAX(D2:D100), D2:D100, 0)
これで、
「D2:D100 の中で、最大値が“何番目の行”か」が返ってきます。
例えば D2:D100 の 15行目(=D16)に最大値があれば、結果は 15 です。
ここで大事なのは、「行番号そのもの」ではなく
「範囲の中での位置(1〜行数)」が返ってくるということです。
INDEX で「その行の別の列」を取り出す
INDEX は「範囲」「行番号」「列番号」で値を取る関数でした。
=INDEX(範囲, 行番号, [列番号])
たとえば、A2:D100 に「商品コード, 商品名, 担当者, 金額」が入っているとき、
最大金額の「商品名」を取りたいなら、こう組み合わせます。
=INDEX(B2:B100, MATCH(MAX(D2:D100), D2:D100, 0))
動きを分解すると、
- MAX(D2:D100) で最大金額を出す
- MATCH(最大金額, D2:D100, 0) で「その金額が何番目の行か」求める
- INDEX(B2:B100, その行番号) で「同じ行の“商品名”」を返す
という流れになります。
最大値の行から複数列を取り出すテンプレート
同じ「最大値の行」から、商品名だけでなくコードや担当者も取りたいことが多いですよね。
その場合は、「行番号」を先にセルに出して使い回すとわかりやすいです。
行番号を一度セルに出すパターン
たとえば、F1 に「最大値の行番号(位置)」を出します。
=MATCH(MAX(D2:D100), D2:D100, 0)
すると F1 には「範囲内での行番号(例:15)」が入ります。
あとはそれを使って、A〜C列から好きな情報を取ってくるだけです。
最大値の行の「商品コード」(A列)を G1 に表示する式:
=INDEX(A2:A100, $F$1)
最大値の行の「商品名」(B列)を H1 に表示する式:
=INDEX(B2:B100, $F$1)
最大値の行の「担当者」(C列)を I1 に表示する式:
=INDEX(C2:C100, $F$1)
このやり方なら、「最大値の行」が変わっても F1 の数字だけ変わり、
それに連動して G1〜I1 も自動更新されます。
1式で「最大値の行の任意の列」を取るテンプレート
行番号をセルに出さず、1行で書き切ることもできます。
最大値の行の「商品名」を 1式で出す:
=INDEX(B2:B100, MATCH(MAX(D2:D100), D2:D100, 0))
最大値の行の「担当者」を 1式で出す:
=INDEX(C2:C100, MATCH(MAX(D2:D100), D2:D100, 0))
このように、
「INDEX の第2引数(行番号)に MATCH(MAX(…)) をそのまま入れる」
のが“型”です。
別シート・別表から「最大値の行」を取る
実務では「集計シートから、明細シートの最大行を引っ張る」ことが多いので、
別シート版の型も押さえておきます。
別シートの最大金額の行から商品名を取得
Sheet「売上明細」
A2:A100:商品コード
B2:B100:商品名
C2:C100:担当者
D2:D100:金額
Sheet「集計」
B2 に「最大金額の商品名」を表示したい場合:
=INDEX(売上明細!B2:B100,
MATCH(MAX(売上明細!D2:D100),
売上明細!D2:D100,
0))
MAX も MATCH も INDEX も、すべて「売上明細」シートを見に行っているだけで、
考え方はまったく同じです。
応用パターン(条件付きの最大値の行)
「全部の中での最大値」ではなく、
「担当者=佐藤さんの中で最大金額の行」
のような「条件付き最大値」も、少し工夫すれば取れます。
ここでは、FILTER を使った 365 以降向けのわかりやすい書き方を紹介します。
前提:
A列:商品コード
B列:商品名
C列:担当者
D列:金額
F2:担当者名(例:佐藤)
まず「佐藤さんの行」だけに絞り、その中で最大値を取るイメージです。
最大金額そのもの:
=MAX(FILTER(D2:D100, C2:C100=F2))
その最大金額が「元の D2:D100 の中で何行目か」を MATCH で求めます。
=MATCH(MAX(FILTER(D2:D100, C2:C100=F2)), D2:D100, 0)
同じ行の「商品名」を INDEX で取得:
=INDEX(B2:B100,
MATCH(MAX(FILTER(D2:D100, C2:C100=F2)), D2:D100, 0))
少し高度ですが、
「まず FILTER で絞る → その中で MAX → 元の範囲で MATCH → INDEX」
という流れは、実務でもかなり使える応用パターンです。
例題
問題1
A2:D100 に「商品コード, 商品名, 担当者, 金額」が入っています。
D列の金額が最大の行の「商品名」を F2 に表示する式を書いてください。
=INDEX(B2:B100, MATCH(MAX(D2:D100), D2:D100, 0))
問題2
A2:D100 に同じ構造の表があります。
D列の金額が最大の行の「商品コード」を G2 に表示する式を書いてください。
=INDEX(A2:A100, MATCH(MAX(D2:D100), D2:D100, 0))
問題3
A2:D100 に表があります。
まず H1 に「D列の最大値が何番目の行か」を求める式を書き、その結果を使って、
H2 に「最大値の行の担当者名(C列)」を表示する式を書いてください。
H1:
=MATCH(MAX(D2:D100), D2:D100, 0)
H2:
=INDEX(C2:C100, $H$1)
問題4
Sheet「売上明細」の A2:D100 に表があります(A=商品コード, B=商品名, C=担当者, D=金額)。
Sheet「集計」の B2 に、「売上明細」シートで金額が最大の行の商品名を表示する式を書いてください。
=INDEX(売上明細!B2:B100,
MATCH(MAX(売上明細!D2:D100),
売上明細!D2:D100,
0))
問題5
A2:D100 に表があります。F2 に担当者名(例:佐藤)が入っています。
「担当者が F2 の行の中で、金額が最大の行の“商品名”(B列)」を G2 に表示する式を書いてください
(FILTER, MAX, MATCH, INDEX を組み合わせてください)。
=INDEX(B2:B100,
MATCH(MAX(FILTER(D2:D100, C2:C100=F2)),
D2:D100,
0))
まとめ
最大値の行を取得する INDEX+MATCH+MAX の“基本形”は、次のひとつです。
=INDEX(取りたい列,
MATCH(MAX(評価列), 評価列, 0))
取りたい列(商品名・コード・担当者…)と
評価列(売上・金額・点数…)を入れ替えるだけで、
どんな表でも「最大値の行の情報」をスマートに拾えるようになります。
この型を体で覚えてしまうと、
ランキング上位の抽出、MVP の自動表示、ベストスコアの取得など、
“最大値から行を引く”仕事が一気に楽になります。
