スプレッドシートのDMAX関数の使い方|条件に合う最大値

スポンサーリンク

「営業部で一番高い売上はいくらだろう」「商品カテゴリごとの最高単価を調べたい」。こんな場面で、フィルタを毎回かけ直してからMAX関数を使っていませんか。

条件が変わるたびにフィルタをかけ直すのは面倒ですよね。しかもフィルタ操作は元のデータ表示そのものを変えてしまうので、共有シートだと他の人の作業にも影響します。「ちょっと営業部だけの最高額を確認したかっただけなのに、誰かのフィルタ設定を上書きしてしまった」という地味な事故は、共同編集の現場ではよくある話です。

そんなときに便利なのがDMAX関数です。条件を別のセル範囲に書いておくだけで、該当するデータの最大値を自動で返してくれます。条件セルを書き換えるだけで結果が即座に切り替わるので、定型レポートやダッシュボードと相性抜群です。フィルタを触らないので、他の人の作業を邪魔することもありません。

この記事では、DMAX関数の基本構文から、AND/OR条件の書き分け、比較演算子・ワイルドカードを使った高度な条件指定、MAX関数・MAXIFS関数との使い分け、よくあるエラーと対処法、実務でつまずきやすいポイントのFAQまでまとめて紹介します。読み終わるころには「条件付きで最大値を取るならDMAXで一発」と自信を持って言えるようになりますよ。

スプレッドシートのDMAX関数とは? — 条件に合うデータの最大値を返す

DMAX関数(読み方: ディー マックス)は、データベース形式の表から条件に合うレコードを探し、指定した列の最大値を返す関数です。

名前は「Database MAX(データベースの最大値)」の略です。DSUM(条件付き合計)やDAVERAGE(条件付き平均)、DCOUNTA(条件付きカウント)と同じ「データベース関数」の仲間です。引数の指定方法(データベース範囲・フィールド・条件範囲の3つ)はファミリー全体で共通なので、1つ覚えれば芋づる式に他の関数も使えるようになります。

DMAX関数の特徴をまとめると、次のとおりです。

  • 条件をセル範囲(条件範囲)で指定するスタイル
  • 条件範囲を書き換えるだけで集計条件をすぐ切り替えられる
  • 複数条件(AND条件・OR条件)にも対応
  • 見出し付きのリスト形式のデータが前提
  • ワイルドカード(*?)や比較演算子(><<>)にも対応
  • 数値以外(文字列・空白)は集計対象から自動的に除外される

NOTE

DMAX関数はGoogleスプレッドシートの全バージョンで使えます。Excelにも同じ関数があるので、ファイル形式を変換しても式が壊れません。社内でExcel派とスプレッドシート派が混在していても、安心して使い回せます。

MAX関数との違い(全体の最大値 vs 条件付き最大値)

DMAX関数とMAX関数の最大の違いは「条件を付けられるかどうか」です。

比較項目MAX関数DMAX関数
条件指定できない(範囲全体が対象)できる(条件範囲で絞り込み)
構文=MAX(範囲)=DMAX(データベース, フィールド, 条件)
用途シンプルに最大値を求める特定の条件に合うデータだけの最大値
引数の数1つ3つ
条件の切り替え数式を書き換える条件セルを書き換える

たとえば「全社の最高金額」を知りたいだけならMAX関数で十分です。「営業部だけの最高金額」「金額10万円未満のなかでの最高額」のように条件を付けたい場面でDMAX関数の出番になります。

DMIN関数との関係(最大値と最小値)

DMAX関数とちょうど対になる関数がDMIN関数です。同じ条件範囲・同じデータベース範囲を使い、結果が最大値か最小値かだけが違います。「最高額と最低額を並べて表示したい」ようなレポートでは、DMAXとDMINを並べて使うのが定番パターンです。

DMAX関数の書き方(構文と引数)

基本構文

=DMAX(データベース, フィールド, 条件)

引数は3つで、すべて必須です。省略はできません。

引数の説明

引数必須/任意説明
データベース必須見出し行を含むデータ範囲(例: A1:D100)
フィールド必須最大値を求める列の見出し名(文字列)または列番号(数値)
条件必須条件を記述したセル範囲(見出し行+条件行)

それぞれ詳しく見ていきましょう。

データベース(第1引数)

データベースには、見出し行を含めたデータ範囲を指定します。先頭行に列の見出し(「部署」「商品名」「金額」など)が入っている必要があります。

注意点として、見出し行を含めずにデータ部分だけを指定するとエラーや想定外の結果になります。「A2:D100」ではなく必ず「A1:D100」のように見出し行から指定してください。

フィールド(第2引数)

最大値を求めたい列を指定します。指定方法は2つあります。

  • 文字列で指定: "金額" のように、見出しと同じ文字列をダブルクォーテーションで囲む
  • 数値で指定: データベースの左端列を1として、列の位置を数値で指定する(3列目なら 3

文字列で指定するほうが、あとから見たとき何の列を集計しているのかわかりやすいのでおすすめです。列番号指定だと、列の追加・削除があったときに数式を直す必要が出てきますが、見出し名で指定しておけば見出しが変わらない限り壊れません。

条件(第3引数)

条件範囲には、見出し行と条件行の2行以上のセル範囲を指定します。これがDMAX関数の最大の特徴です。

条件範囲は次のセクションで詳しく説明しますが、ポイントは「見出し+条件値」が必ず2行ペアで必要ということです。1行だけや、見出しなしで条件値だけを書くとうまく動きません。

TIP

フィールドに列番号を使う場合、データベース範囲の左端が1です。シートのA列が1とは限らないので注意してください。たとえばデータベースをC1:F100と指定した場合、C列が1・D列が2・E列が3になります。

DMAX関数の基本的な使い方

サンプルデータ

次のような売上データを使って説明します。

 ABCD
1部署担当者商品金額
2営業部田中ノートPC150000
3総務部鈴木プリンター35000
4営業部佐藤モニター48000
5経理部高橋ノートPC150000
6営業部田中キーボード8000
7総務部伊藤モニター48000

条件範囲の設定方法

DMAX関数の条件は、別のセル範囲に書きます。ここがMAXIFS関数との大きな違いです。

条件範囲は次のルールで作ります。

  1. 1行目に見出しを書く — データベースの見出しと完全に同じ文字列を使う
  2. 2行目に条件値を書く — 一致させたい値を入力する

たとえば「営業部」の金額で最大値を求めたい場合、シートの空いているエリア(たとえばF1:F2)に次のように書きます。

 F
1部署
2営業部

数式はこうなります。

=DMAX(A1:D7, "金額", F1:F2)

結果は 150000 です。営業部の3件(150000、48000、8000)のうち最も大きい値が返されます。

TIP

条件範囲の見出しは、データベースの見出しと1文字でも違うとエラーや「結果が0」の原因になります。半角スペースが混ざる・全角と半角が混在する・末尾に改行が入るなど、目視で気づきにくいパターンも多いので、コピー&ペーストで作るのが確実です。

比較演算子を使った条件

条件値には比較演算子も使えます。

条件値の書き方意味
営業部「営業部」と完全一致
>=5000050,000以上
<100000100,000未満
<>営業部「営業部」以外
>=2024/4/12024年4月1日以降(日付)

たとえば「金額が50,000未満」のレコードのうち最大値を求めたい場合は、条件範囲をこう書きます。

 F
1金額
2<50000
=DMAX(A1:D7, "金額", F1:F2)

結果は 48000 です(48000、35000、8000のうち最大)。

ワイルドカードを使った条件

条件値にはワイルドカード(*?)も使えます。

ワイルドカード意味
*0文字以上の任意の文字列ノート* → 「ノート」で始まる商品
?任意の1文字??PC → 末尾「PC」かつ4文字以内の商品

たとえば「商品名がノートで始まる」レコードのうち最大金額を求めたい場合は、条件範囲をこう書きます。

 F
1商品
2ノート*
=DMAX(A1:D7, "金額", F1:F2)

結果は 150000 です(ノートPCの150000)。あいまい検索が必要な場面で便利です。

DMAX関数の実践的な使い方・応用例

複数条件(AND条件)で最大値を求める

「営業部」かつ「金額が100,000未満」のように、複数の条件をすべて満たすレコードから最大値を求めたい場合です。

AND条件は、条件範囲の同じ行に複数の見出し・条件値を横に並べて書きます。

 FG
1部署金額
2営業部<100000
=DMAX(A1:D7, "金額", F1:G2)

結果は 48000 です。営業部で金額100,000未満のレコードは、佐藤のモニター(48000)と田中のキーボード(8000)の2件です。そのうち最大値の48000が返されます。

OR条件で最大値を求める

「営業部」または「経理部」のように、どちらかの条件に合うレコードから最大値を求めたい場合です。

OR条件は、条件値を別の行に書くのがポイントです。

 F
1部署
2営業部
3経理部
=DMAX(A1:D7, "金額", F1:F3)

結果は 150000 です。営業部の最高額(150000)と経理部の最高額(150000)を比較して、最大値の150000が返されます。

「同じ行に書くとAND条件、別の行に書くとOR条件」。このルールを覚えておきましょう。MAXIFS関数では数式単体でOR条件を書けないので、ここはDMAX関数の大きな強みです。

AND条件とOR条件を組み合わせる

「営業部で金額100,000未満」または「総務部で金額100,000未満」の最大値を求める場合です。

 FG
1部署金額
2営業部<100000
3総務部<100000
=DMAX(A1:D7, "金額", F1:G3)

結果は 48000 です。営業部100,000未満の最大(48000)と総務部100,000未満の最大(48000)を合わせた中で最大値が返されます。

範囲条件(◯◯以上△△以下)で最大値を求める

「金額が30,000以上100,000未満」のように、上限と下限を両方指定したい場合です。同じ列に対して2つの条件を付けるときは、同じ見出しの列を2つ並べて書きます。

 FG
1金額金額
2>=30000<100000
=DMAX(A1:D7, "金額", F1:G2)

結果は 48000 です。金額30,000以上100,000未満のレコード(35000・48000・48000)のうち最大値が返されます。「同じ見出しを2列に並べる」というのが少し独特ですが、データベース関数特有のテクニックとして覚えておくと役立ちます。

条件範囲を切り替えて集計を素早く変える

DMAX関数の最大の強みは、条件をセルに書いているため、セルの値を書き換えるだけで集計結果が即座に変わる点です。

たとえば条件範囲のF2セルを「営業部」から「総務部」に書き換えるだけで、DMAX関数の結果が自動的に総務部の最大値に切り替わります。数式を修正する必要はありません。

「データの入力規則」でドロップダウンリストを設定すれば、選ぶだけで部署別の最高額をサッと確認できる簡易ダッシュボードが作れます。フィルタを触らないので、共有シートで他の人の作業を邪魔する心配もありません。

月別・カテゴリ別の最高額レポートに使う

実務でよくあるのが、定型レポートでの月別・カテゴリ別の集計です。たとえば月初に「先月の部署別最高売上」を提出する場面では、データベースは1か月分の売上データ、条件範囲のF2セルに部署名を入れて、横方向にDMAX・DMIN・DAVERAGEを並べると、最高額・最低額・平均額が一気に確認できるレポートが完成します。

DMAX関数とMAX関数・MAXIFS関数の使い分け

スプレッドシートで「最大値」を求める関数は3つあります。それぞれ得意なシーンが違うので、整理しておきましょう。

比較項目MAX関数MAXIFS関数DMAX関数
条件指定できない数式の引数に直接書くセル範囲(条件範囲)
OR条件直接対応できない条件範囲の行を追加するだけ
条件の切り替えやすさ数式を編集する必要ありセルを書き換えるだけ
数式の見やすさ最もシンプル条件が多いと数式が長くなるシンプル(引数3つ固定)
条件範囲のスペース不要不要シート上にスペースが必要
ワイルドカード使える使える
比較演算子使える使える

使い分けのポイント:

  • 全体の最大値だけ知りたい → MAX関数(最もシンプル)
  • 条件が固定で変わらない・条件が1〜2個 → MAXIFS関数(数式内で完結する)
  • 条件を頻繁に切り替えたい・複数の条件パターンがある → DMAX関数(セルを変えるだけで結果が変わる)
  • OR条件が必要 → DMAX関数のほうが直感的に書ける
  • 条件範囲のスペースを取りたくない → MAXIFS関数で数式内に完結させる

実務では、定型レポートやダッシュボードの集計にDMAX関数、単発の集計にMAXIFS関数、と使い分けるとスムーズです。

よくあるエラーと対処法

DMAX関数で「思った結果にならない」「エラーが出る」ケースをまとめました。

症状原因対処法
結果が0になる条件範囲の見出しがデータベースの見出しと一致していない見出しをコピー&ペーストして完全一致させる
結果が0になる条件値の前後に余分なスペースが入っているTRIM関数でスペースを除去するか、手入力し直す
#VALUE! エラーフィールドに存在しない列名を指定しているデータベースの見出しと同じ文字列を使う
想定より大きい値が返る条件範囲に空白行が含まれている条件範囲を必要な行だけに絞る(空白行は「すべて一致」と解釈される)
想定と違う列の最大値が返るフィールドの列番号を間違えている列番号ではなく見出し名(文字列)で指定するのがおすすめ
条件が部分一致になる条件値にアスタリスクが含まれている完全一致にしたい場合は ="=営業部" のように先頭に = を付ける
文字列の列で0が返るDMAX関数は数値の最大値を返す関数文字列の列を指定すると0が返る。数値列を指定すること
日付列で正しく動かない条件値の日付フォーマットが揃っていないデータベース側と条件側で書式を揃える(または DATE関数で組み立てる)

TIP

結果が0になるトラブルで最も多いのは「見出しの不一致」です。全角・半角やスペースの違いも不一致になります。条件範囲の見出しはデータベースからコピー&ペーストで作るのが鉄則です。

よくある質問(FAQ)

Q1. DMAX関数とMAXIFS関数、結局どっちを使えばいい?

条件を頻繁に切り替えるならDMAX、条件が固定ならMAXIFSです。たとえば部署別ダッシュボードのようにドロップダウンで条件を切り替える作りならDMAX、月初の定型レポートで「営業部の今月の最高額」のように条件が決まっているならMAXIFSがシンプルです。

OR条件が必要なときはDMAX一択になります。MAXIFSはAND条件しか直接書けないので、OR条件は数式を分けるか配列数式に頼る必要があります。

Q2. DMAX関数で文字列の最大値(辞書順で最後)は取れる?

取れません。DMAX関数は数値の最大値を返す関数です。文字列の列を指定すると0が返ります。

辞書順での最大値を取りたい場合は、データを並べ替えてからINDEXやFILTER関数で取得するか、SORT関数と組み合わせる方法があります。

Q3. 日付列の最大値(最新日付)はDMAX関数で取れる?

取れます。スプレッドシートの日付は内部的にはシリアル値(数値)なので、DMAX関数で問題なく動作します。「営業部の最新の取引日」のような集計に便利です。

ただし表示形式が「日付」になっていないと、結果がシリアル値(45000のような数値)で表示されます。結果セルの表示形式を「日付」に変えてください。

Q4. 空白セルがある列でDMAX関数を使うとどうなる?

空白セルは無視されます。DMAX関数は数値が入っているセルだけを集計対象にするので、空白や文字列が混ざっていても結果に影響しません。

ただし条件範囲のほうに空白行が混ざると「すべて一致」と解釈されてしまうので、条件範囲は空白行を含めないようにしてください。

Q5. 別シートのデータをDMAX関数で集計できる?

できます。データベースの引数にシート名を含めて指定するだけです。

=DMAX('売上データ'!A1:D100, "金額", F1:F2)

シート名にスペースや日本語が含まれる場合は、シングルクォーテーション(')で囲むのがポイントです。

Q6. DMAX関数でN番目に大きい値は取れる?

取れません。DMAX関数は最大値(1番大きい値)専用です。

N番目に大きい値が必要な場合は、LARGE関数を使うか、QUERY関数でORDER BYを使ってソートしてから取得する方法があります。条件付きでN番目を取りたい場合は、FILTER関数とLARGE関数を組み合わせるのが定番です。

Q7. 同じ最大値が複数あるとき、どのレコードかを知るには?

DMAX関数は「最大値そのもの」しか返さないので、「どの担当者か」「どの商品か」までは取れません。

最大値を持つレコードの他の列の値を取りたい場合は、DGET関数や、INDEX+MATCHの組み合わせを使います。「営業部の最高額の担当者名」のような集計は、DMAXで最高額を求め、その値を条件にDGETで担当者名を引く、という二段構えにするのが実務的です。

まとめ

DMAX関数は、データベース形式の表から条件に合うデータの最大値を求める関数です。フィルタを触らずに条件付き集計ができるので、共有シートやダッシュボードと相性抜群です。

ポイントを整理します。

  • 構文は =DMAX(データベース, フィールド, 条件) で、引数は3つ
  • 条件は数式内ではなくセル範囲(条件範囲)に書くのが特徴
  • 条件範囲は「見出し行+条件行」のセットで作る
  • 同じ行に条件を横並びにすればAND条件、別の行にすればOR条件
  • 条件セルの値を変えるだけで集計対象を切り替えられる
  • 比較演算子(><<>)やワイルドカード(*?)も使える
  • MAX関数は全体の最大値、DMAX関数は条件付きの最大値、MAXIFS関数は数式内に条件を書く形式
  • 条件固定ならMAXIFS、条件を頻繁に変えるならDMAXがおすすめ
  • 結果が0になるときは「見出しの不一致」をまずチェック
  • 最大値を持つレコードの他の列が知りたいときはDGET関数と組み合わせる

まずは簡単な表で =DMAX(A1:D7, "金額", F1:F2) から試してみてください。条件セルを書き換えて結果が変わる感覚をつかめば、データベース関数全体への理解がぐっと深まりますよ。

関連記事

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