Excel関数 逆引き集 | 最大値の行を取得 → INDEX+MATCH(MAX)

Excel VBA Excel
スポンサーリンク

概要

「一番売れている商品はどれ?」「金額が最大の行を丸ごと取りたい」
そんなときに使う“定番パターン”が INDEX+MATCH+MAX の組み合わせです。

やっていることはシンプルで、

  1. MAX で「いちばん大きい値」を出す
  2. MATCH で「その値がどの行にあるか(何番目か)」を探す
  3. 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))

動きを分解すると、

  1. MAX(D2:D100) で最大金額を出す
  2. MATCH(最大金額, D2:D100, 0) で「その金額が何番目の行か」求める
  3. 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 の自動表示、ベストスコアの取得など、
“最大値から行を引く”仕事が一気に楽になります。

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