エクセルで大量のデータを扱っていると、「この中で一番大きい数値はどれだろう?」と感じる場面は非常に多いものです。
売上データの中から月間トップを見つけたい、在庫数の最大値を把握したい、テスト結果の最高点を抽出したいなど、最大値を探すシーンはビジネスから日常まで幅広く存在します。
エクセルには最大値を求めるための専用関数が用意されており、さらにMATCH関数やINDEX関数と組み合わせることで、最大値そのものだけでなく、その値がどのセルにあるか・どの行に属するデータかまで一気に特定できるようになります。
本記事では、MAX関数の基本的な使い方から、セル位置の特定、複数範囲への対応、さらに実務で即使える応用テクニックまでを、サンプルデータとイメージ図を交えながら丁寧に解説していきます。
エクセルで最大値を探すならMAX関数が基本中の基本
まず最初に、エクセルで最大値を求める際の土台となるMAX関数について理解しましょう。
以下のサンプルデータを使って解説を進めます。このデータは1行目がヘッダーになっており、A列に商品名、B列に売上数量、C列に単価、D列に売上金額が入力されている想定です。
| 行 | A列:商品名 | B列:売上数量 | C列:単価(円) | D列:売上金額(円) |
|---|---|---|---|---|
| 1 | 商品名 | 売上数量 | 単価(円) | 売上金額(円) |
| 2 | 桜餅 | 120 | 280 | 33,600 |
| 3 | 柏餅 | 95 | 320 | 30,400 |
| 4 | マシュマロ | 210 | 150 | 31,500 |
| 5 | チョコ | 185 | 200 | 37,000 |
| 6 | アボカド | 60 | 480 | 28,800 |
| 7 | カボチャ | 75 | 350 | 26,250 |
| 8 | マグロ | 50 | 980 | 49,000 |
| 9 | カツオ | 88 | 750 | 66,000 |
| 10 | ハラス | 42 | 1,200 | 50,400 |
このデータからD列(売上金額)の最大値を求める場合、MAX関数を使います。
MAX関数の基本構文
=MAX(数値1, [数値2], …)
例:=MAX(D2:D10)
→ D2からD10の中で最も大きい値を返す
上のサンプルデータに当てはめると、D列の最大値はカツオの66,000円であり、=MAX(D2:D10) と入力するだけで自動的に66,000が返ってきます。
MAX関数の入力手順と基本操作
MAX関数を入力する手順はとてもシンプルです。
まず結果を表示したいセル(たとえばF2)を選択し、半角で「=MAX(」と入力します。
次にマウスでD2からD10をドラッグして範囲を選択するか、直接「D2:D10」と入力してEnterキーを押せば完了です。
以下のイメージ図で操作感を確認してみましょう。
挿入
数式
データ
| A | B | C | D | E | F | |
| 1 | 商品名 | 売上数量 | 単価 | 売上金額 | 最大売上金額 | |
| 2 | 桜餅 | 120 | 280 | 33,600 | 66,000 | |
| 3 | 柏餅 | 95 | 320 | 30,400 | ||
| 4 | マシュマロ | 210 | 150 | 31,500 | ||
| 5 | チョコ | 185 | 200 | 37,000 |
MAX関数で複数範囲・列をまたいで最大値を求める方法
MAX関数はひとつの連続した範囲だけでなく、複数の離れた範囲を同時に指定することも可能です。
たとえば売上数量(B列)と売上金額(D列)のうちどちらの最大値が大きいかを一気に調べたい場合は、以下のように書けます。
=MAX(B2:B10, D2:D10)
→ B2:B10とD2:D10の両方の範囲から最大値を返す
この場合、B列の最大値は210(マシュマロ)、D列の最大値は66,000(カツオ)なので、結果は66,000が返ってきます。
カンマ区切りで最大30個までの引数を指定できるため、複数のシートや離れたセル範囲を横断した分析も柔軟に行えます。
MAX関数がうまく動かないときの原因と対処法
MAX関数を使っていると、思ったように結果が返らないことがあります。
よくある原因のひとつが、数値が文字列として入力されているケースです。セルの表示形式が「文字列」になっていると、見た目は数字でもMAX関数に認識されません。
この場合はセルを選択してデータタブ「区切り位置」から数値変換するか、VALUE関数を使って数値変換することで解決できます。
また、空白セルや非表示行が含まれていてもMAX関数は正しく動作しますが、エラー値(#N/Aなど)が範囲内にあるとMAX関数もエラーを返してしまいます。その場合はIFERROR関数と組み合わせるのが定石です。
【操作のポイント】MAX関数は「=MAX(範囲)」の形で入力。数値が文字列扱いになっているとカウントされないため、セルの書式設定を「数値」にしておくことが大切です。複数範囲はカンマで区切り、最大30引数まで指定可能。エラー値が範囲内にある場合はIFERROR関数と組み合わせて対処しましょう。
最大値のセル位置をMATCH関数で特定する方法
MAX関数で最大値の「数値」は取得できますが、それがデータの何行目にあるのかを特定したい場合はMATCH関数が非常に役立ちます。
MATCH関数は、指定した値が範囲の中で何番目にあるかを返す関数です。
MATCH関数の基本構文
=MATCH(検索値, 検索範囲, 照合の型)
例:=MATCH(MAX(D2:D10), D2:D10, 0)
→ D2:D10の中でMAX値(66,000)が何番目にあるかを返す
照合の型は完全一致の場合「0」を指定
サンプルデータでは、カツオ(D9)の66,000が最大値であり、D2を1番目として数えるとD9は8番目に当たります。そのためこの数式は「8」を返します。
MATCH関数の結果を実際の行番号に変換する
MATCH関数が返すのは「範囲内での相対的な位置番号」です。データがD2から始まる場合、MATCH関数の結果に「1」(ヘッダー行分)を足すと実際のエクセル行番号に変換できます。
実際の行番号を求める数式
=MATCH(MAX(D2:D10), D2:D10, 0) + 1
→ 8 + 1 = 9(エクセル上の9行目)
この「+1」の考え方は、データの開始行によって変わります。データが3行目から始まる場合は「+2」になり、「データ開始行 − 1」の値を加算すれば実際の行番号が求まると覚えておきましょう。
MATCH関数で列番号を求めて位置を二次元的に特定する
行だけでなく列の位置も特定したい場合は、MATCH関数を縦横それぞれに使います。
たとえば、1行目のヘッダー行に対してどの列に「売上金額」があるかを動的に取得したいときは以下のように書けます。
=MATCH(“売上金額”, A1:E1, 0)
→ A1からE1の中で「売上金額」が何番目かを返す(この例では4)
行MATCH・列MATCHの両方を組み合わせることで、二次元的にセル位置を特定する準備が整います。次のセクションでINDEX関数との組み合わせに発展させていきましょう。
【操作のポイント】MATCH関数の照合の型は完全一致の場合「0」を必ず指定してください。返ってくるのは「範囲内での番号」なので、実際の行番号が必要なときはデータ開始行から1を引いた値を加算します。MAX関数と組み合わせることで「最大値が何番目にあるか」を動的に取得できます。
INDEX+MATCH関数で最大値の行データを丸ごと取得する方法
MAX関数で最大値を、MATCH関数でその位置番号を取得できたら、次はINDEX関数を組み合わせて最大値を持つ行の他の列情報(商品名など)を自動的に引き出すことができます。
INDEX関数は「指定した範囲の中から、指定した行番号・列番号のセル値を返す」関数です。
INDEX関数の基本構文
=INDEX(配列, 行番号, [列番号])
最大値の商品名を取得する例:
=INDEX(A2:A10, MATCH(MAX(D2:D10), D2:D10, 0))
→ D列の最大値を持つ行のA列(商品名)を返す
このサンプルデータの場合、D列の最大値はカツオ行(8番目)なので、A列の8番目の値「カツオ」が返ってきます。
数式
データ
| A | B | C | D | E | F | |
| 1 | 商品名 | 売上数量 | 単価 | 売上金額 | 集計結果 | |
| 2 | 桜餅 | 120 | 280 | 33,600 | 最大売上金額 | |
| 3 | 柏餅 | 95 | 320 | 30,400 | カツオ | |
| 4 | マシュマロ | 210 | 150 | 31,500 | ||
| 5 | チョコ | 185 | 200 | 37,000 |
INDEX+MATCHで複数列のデータを一括取得する応用技
最大値を持つ行の商品名だけでなく、売上数量や単価もまとめて取得したい場合は、INDEX関数の列番号部分を変えたものを複数のセルに入力します。
商品名(A列):=INDEX(A2:A10, MATCH(MAX(D2:D10), D2:D10, 0))
売上数量(B列):=INDEX(B2:B10, MATCH(MAX(D2:D10), D2:D10, 0))
単価(C列):=INDEX(C2:C10, MATCH(MAX(D2:D10), D2:D10, 0))
売上金額(D列):=INDEX(D2:D10, MATCH(MAX(D2:D10), D2:D10, 0))
MATCH部分(最大値の位置を求める)は共通しているため、絶対参照を活用して1つのMATCH計算結果を使い回す工夫をすると、数式がよりすっきりします。
また、スピル機能が使えるExcel 2021以降や365では、配列数式として一括取得することも可能になっており、より効率的な記述ができます。
XMATCH関数との違いと使い分け
Excel 2021以降やMicrosoft 365では、MATCH関数の進化版ともいえるXMATCH関数が使えます。
XMATCHはMATCHの機能を拡張したもので、デフォルトが完全一致(照合の型の省略が可能)になっており、逆順検索やワイルドカード検索にも対応しています。
古いエクセルとの互換性が必要な場合はMATCH関数を使い、最新環境であればXMATCHへの移行を検討するとより柔軟に対応できるでしょう。
【操作のポイント】INDEX+MATCHの組み合わせは「=INDEX(取得したい列の範囲, MATCH(MAX(最大値を探す範囲), 最大値を探す範囲, 0))」の形が基本です。MATCH部分の範囲とINDEX部分の範囲の行数を必ず揃えることが大切で、ここがズレると誤ったデータが返ってきます。
最大値のアドレス(セル番地)そのものを取得するテクニック
実務では、最大値がどの行にあるかだけでなく、「具体的なセル番地(例:D9)を文字列として取得したい」というケースもあります。
そのような場合はCELL関数やADDRESS関数が活躍します。
最大値のセル番地を文字列で取得する方法
=ADDRESS(MATCH(MAX(D2:D10), D2:D10, 0)+1, 4)
→ 行番号(MATCH結果+ヘッダー分)と列番号(D列=4)を組み合わせ、「$D$9」のようなセル番地を返す
ADDRESS関数の引数は「(行番号, 列番号, 参照の型)」です。参照の型を省略または1にすると絶対参照($D$9)が返り、4にすると相対参照(D9)が返ります。
CELL関数で最大値のアドレスをより直感的に取得する
CELL関数を使うと、より直感的にセル情報を取得できます。
=CELL(“address”, INDEX(D2:D10, MATCH(MAX(D2:D10), D2:D10, 0)))
→ 最大値が入っているセルのアドレス(例:”$D$9″)を返す
CELL関数の第一引数に”address”を指定すると、第二引数のセル参照のアドレスを文字列で取得できます。INDEXと組み合わせることで、最大値を含むセルそのものを参照として渡せるのがポイントです。
最大値が複数存在する場合の対処法
同じ最大値が複数行に存在する場合、MATCH関数は最初に見つかった位置だけを返します。
すべての最大値の位置を取得したい場合は、配列数式や新しいFILTER関数を使うアプローチが有効です。
FILTER関数で最大値を持つ全行を取得(Excel 365/2021以降)
=FILTER(A2:D10, D2:D10=MAX(D2:D10))
→ D列が最大値と等しい行を全行抽出して表示する
FILTER関数はスピル機能によって結果を自動的に縦に展開してくれるため、最大値が複数存在する実務データへの対応もスムーズです。
【操作のポイント】ADDRESS関数は「(行番号, 列番号)」の順で指定します。行番号はMATCH結果にデータ開始行の位置補正を加えた値、列番号はD列なら4です。最大値が複数存在する可能性がある場合はFILTER関数を検討しましょう。
LARGE関数で最大値・2番目・3番目を順位別に取得する方法
最大値だけでなく「2番目に大きい値」「3番目に大きい値」も同時に知りたい場面は少なくありません。
そのような順位別の値の取得にはLARGE関数が便利です。
LARGE関数の基本構文
=LARGE(配列, 順位)
例:
1位(最大値):=LARGE(D2:D10, 1)
2位:=LARGE(D2:D10, 2)
3位:=LARGE(D2:D10, 3)
サンプルデータに当てはめると、1位は66,000(カツオ)、2位は50,400(ハラス)、3位は49,000(マグロ)という結果になります。
LARGE関数とINDEX+MATCHを組み合わせてランキング表を作成する
LARGE関数の結果をINDEX+MATCHに渡すことで、上位N位のデータを行ごと自動取得してランキング表を作ることができます。
2位の商品名を取得する例:
=INDEX(A2:A10, MATCH(LARGE(D2:D10, 2), D2:D10, 0))
→ 売上金額2位の商品名「ハラス」を返す
LARGE関数の順位部分をROW関数などで自動的に変化させれば、一つの数式をオートフィルで引き延ばすだけでランキング表が完成します。
数式
データ
| E | F | G | H | |
| 1 | 順位 | 商品名 | 売上金額 | |
| 2 | 1 | カツオ | 66,000 | |
| 3 | 2 | ハラス | 50,400 | |
| 4 | 3 | マグロ | 49,000 | |
| 5 | 4 | チョコ | 37,000 |
SMALL関数との組み合わせで最小値ランキングも同時管理
LARGEの対になる関数がSMALLです。SMALL(配列, 順位)で小さい順に値を取得できます。
最大値ランキングと最小値ランキングを並べて一つのシートに配置しておくと、売れ筋商品と死に筋商品を同時に把握できる分析シートとして活用できます。
LARGEとSMALL、INDEXとMATCHの4つを組み合わせれば、データ分析の幅が大きく広がります。
【操作のポイント】LARGE関数の順位引数をROW()-1などで自動的に変化させると、G2に数式を入れてオートフィルするだけでランキング表が完成します。数式内の範囲は絶対参照($D$2:$D$10)にしておくことで、オートフィル時のズレを防げます。
複数シートにわたる最大値の取得方法
実務では「1月シート」「2月シート」など月別にデータが分かれていることが多く、複数シートにまたがった最大値を一括で求めたいケースもあります。
エクセルでは3D参照と呼ばれる方法を使うと、複数の連続したシートを一度に参照できます。
3D参照でシートをまたいだ最大値を求める
=MAX(Sheet1:Sheet3!D2:D10)
→ Sheet1からSheet3の全シートのD2:D10の中から最大値を返す
シート名と「!」の間にコロンでシート範囲を指定するのがポイントです。シートの順番に連続性がある場合にのみ使える記法ですが、月次集計のような定形作業には非常に強力な方法です。
INDIRECT関数でシート名を動的に切り替えながら最大値を取得する
シート名を動的に変えながら最大値を取得したい場合はINDIRECT関数が活躍します。
=MAX(INDIRECT(A1&”!D2:D10″))
→ A1セルにシート名(例:「1月」)が入っている場合、そのシートのD2:D10の最大値を返す
A1の値を「2月」「3月」と変えるだけで参照シートが切り替わるため、ドロップダウンリストと組み合わせたインタラクティブな集計シートが作れます。
Power QueryやピボットテーブルでのMax取得との使い分け
複数シートや複数ファイルにわたる大規模データの最大値を扱う場合、関数ではなくPower QueryやピボットテーブルのMax集計を使う方法も選択肢に入ります。
Power Queryであれば「グループ化」機能でカテゴリ別の最大値を一括取得でき、ピボットテーブルであれば値フィールドの集計方法を「最大」に変えるだけで視覚的に最大値を把握できます。
データ量が数千行を超えるような場合は、関数よりもPower Queryの方が処理が軽く、更新も自動化しやすいのでシーンに応じた使い分けが大切です。
【操作のポイント】3D参照はシートが「連続していること」が条件です。シートの間に別シートが挟まっていると意図しないシートも参照範囲に含まれてしまいます。INDIRECT関数を使う場合は、シート名に空白やスペースが含まれると「’1月 売上’!D2:D10」のようにシングルクォーテーションで囲む必要があります。
まとめ:エクセルで最大値を探す・位置を特定する全手法
エクセルで最大値を探す方法は、MAX関数による基本的な値の取得からスタートし、MATCH関数で位置番号を特定、INDEX+MATCHで関連データを一括抽出、ADDRESS・CELL関数でセル番地を取得、LARGE関数でランキング対応、さらには3D参照やINDIRECTで複数シートにも対応と、段階的に活用の幅が広がっていきます。
最大値そのもの・最大値のセル位置・最大値を持つ行のデータという3つの観点を軸に、今回紹介した関数の組み合わせを使い分けることで、どんなデータ構造にも柔軟に対応できるようになります。
MAX・MATCH・INDEX・LARGE・ADDRESS・INDIRECT・FILTERのそれぞれの役割をしっかり把握し、場面に合わせて組み合わせることが、エクセル最大値活用の最大のポイントといえるでしょう。
今回のサンプルデータを参考に、まずはMAX関数とINDEX+MATCHの組み合わせから試してみてください。実際に手を動かすことで、数式の仕組みを体感的に理解できるはずです。
?