「営業部で一番高い売上はいくらだろう」「商品カテゴリごとの最高単価を調べたい」。こんな場面で、フィルタを毎回かけ直してからMAX関数を使っていませんか。
条件が変わるたびにフィルタをかけ直すのは面倒ですよね。しかもフィルタ操作は元のデータ表示そのものを変えてしまうので、共有シートだと他の人の作業にも影響します。「ちょっと営業部だけの最高額を確認したかっただけなのに、誰かのフィルタ設定を上書きしてしまった」という地味な事故は、共同編集の現場ではよくある話です。
そんなときに便利なのがDMAX関数です。条件を別のセル範囲に書いておくだけで、該当するデータの最大値を自動で返してくれます。条件セルを書き換えるだけで結果が即座に切り替わるので、定型レポートやダッシュボードと相性抜群です。フィルタを触らないので、他の人の作業を邪魔することもありません。
この記事では、DMAX関数の基本構文と引数の役割から解説します。AND/OR条件の書き分け、比較演算子・ワイルドカードによる高度な条件指定、MAX関数・MAXIFS関数との使い分けを順に押さえます。さらにDMIN関数との組み合わせ、よくあるエラーと対処法、実務でつまずきやすい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関数の基本的な使い方
サンプルデータ
次のような売上データを使って説明します。
| A | B | C | D | |
|---|---|---|---|---|
| 1 | 部署 | 担当者 | 商品 | 金額 |
| 2 | 営業部 | 田中 | ノートPC | 150000 |
| 3 | 総務部 | 鈴木 | プリンター | 35000 |
| 4 | 営業部 | 佐藤 | モニター | 48000 |
| 5 | 経理部 | 高橋 | ノートPC | 150000 |
| 6 | 営業部 | 田中 | キーボード | 8000 |
| 7 | 総務部 | 伊藤 | モニター | 48000 |
単一条件の書き方(AND条件の基本)
DMAX関数の条件は、別のセル範囲に書きます。ここがMAXIFS関数との大きな違いです。
条件範囲は次のルールで作ります。
- 1行目に見出しを書く — データベースの見出しと完全に同じ文字列を使う
- 2行目に条件値を書く — 一致させたい値を入力する
たとえば「営業部」の金額で最大値を求めたい場合、シートの空いているエリア(たとえばF1:F2)に次のように書きます。
| F | |
|---|---|
| 1 | 部署 |
| 2 | 営業部 |
数式はこうなります。
=DMAX(A1:D7, "金額", F1:F2)
結果は 150000 です。営業部の3件(150000、48000、8000)のうち最も大きい値が返されます。
TIP
条件範囲の見出しは、データベースの見出しと1文字でも違うとエラーや「結果が0」の原因になります。半角スペースが混ざる・全角と半角が混在する・末尾に改行が入るなど、目視で気づきにくいパターンも多いので、コピー&ペーストで作るのが確実です。
比較演算子を使った条件
条件値には比較演算子も使えます。
| 条件値の書き方 | 意味 |
|---|---|
| 営業部 | 「営業部」と完全一致 |
>=50000 | 50,000以上 |
<>営業部 | 「営業部」以外 |
>=2024/4/1 | 2024年4月1日以降(日付) |
たとえば「金額が50,000未満」のレコードのうち最大値を求めたい場合は、条件範囲をこう書きます。
| F | |
|---|---|
| 1 | 金額 |
| 2 | <50000 |
このとき数式は =DMAX(A1:D7, "金額", F1:F2) のままです。結果は 48000 になります。50,000未満の最大値であるモニター(48000)が返されます。
TIP
比較演算子はセルにそのまま入力します。シングルクォートやダブルクォートで囲む必要はありません。<50000 とセルに入力するだけで条件として認識されます。
DMAX関数の使い方|AND条件・OR条件の書き分け
DMAX関数の本領は、複数条件を扱えることです。AND条件とOR条件の書き分けは、「同じ行に書く」か「別の行に書く」かで決まります。
AND条件(同じ行に並べる)
複数の条件をすべて満たすレコードに絞り込むのがAND条件です。条件範囲の同じ行に条件を横並びに書きます。
たとえば「営業部 かつ 金額50,000以上」の最大値を求めたい場合、条件範囲をこう書きます。
| F | G | |
|---|---|---|
| 1 | 部署 | 金額 |
| 2 | 営業部 | >=50000 |
数式は次のとおりです。
=DMAX(A1:D7, "金額", F1:G2)
結果は 150000 です。営業部かつ50,000以上の条件を満たす2件(150000、ノートPC)のうち最大値が返ります。
OR条件(別の行に並べる)
複数の条件のうちいずれか1つを満たせばよいのがOR条件です。条件範囲の別々の行に条件を縦並びに書きます。
たとえば「営業部 または 総務部」の最大値を求めたい場合は次のとおりです。
| F | |
|---|---|
| 1 | 部署 |
| 2 | 営業部 |
| 3 | 総務部 |
数式はこうなります。
=DMAX(A1:D7, "金額", F1:F3)
結果は 150000(営業部のノートPC)です。営業部または総務部のレコードすべてを対象とした最大値が返ります。
AND+OR の複合条件
「営業部で50,000以上」または「総務部で30,000以上」のような複合条件も書けます。AND条件を行ごとに書き、それを縦に並べるとOR条件として解釈されます。
| F | G | |
|---|---|---|
| 1 | 部署 | 金額 |
| 2 | 営業部 | >=50000 |
| 3 | 総務部 | >=30000 |
数式は =DMAX(A1:D7, "金額", F1:G3) で、結果は 150000 です。営業部の150000・48000と総務部の35000・48000が候補となり、その中の最大値が返ります。
NOTE
AND条件は「列方向」、OR条件は「行方向」と覚えると間違えにくくなります。横並びはAND、縦並びはORという視覚的なルールです。
比較演算子・ワイルドカードで高度な条件を指定する
DMAX関数の条件範囲では、完全一致だけでなく比較演算子・ワイルドカードを使った柔軟な条件指定ができます。
比較演算子の早見表
| 演算子 | 意味 | 記入例 |
|---|---|---|
= | 等しい(完全一致は省略可) | =営業部 |
> | より大きい | >50000 |
< | より小さい | <50000 |
>= | 以上 | >=50000 |
<= | 以下 | <=50000 |
<> | 等しくない | <>営業部 |
数値だけでなく日付にも使えます。>=2024/4/1 のように書けば「2024年4月1日以降」と解釈されます。
ワイルドカードの早見表
| 記号 | 意味 | 記入例 |
|---|---|---|
* | 0文字以上の任意の文字列 | ノート*(「ノート」で始まるすべて) |
? | 任意の1文字 | ?ート(2文字目から「ート」) |
たとえば「商品名が『ノート』で始まる」レコードの最大値を求めたい場合、条件範囲をこう書きます。
| F | |
|---|---|
| 1 | 商品 |
| 2 | ノート* |
数式は =DMAX(A1:D7, "金額", F1:F2) で、結果は 150000(ノートPC)です。
TIP
完全一致と部分一致を切り替えたい場合、完全一致は単に「営業部」と書き、部分一致は「営業」のように を付けるだけです。Excelでは ="=営業部" のような特殊記法が必要なケースもありますが、Googleスプレッドシートのほうがシンプルに書けます。
DMAX関数 vs MAX関数 vs MAXIFS関数の使い分け
条件付きで最大値を取る方法は、DMAX・MAX・MAXIFSの3つから選べます。場面ごとの使い分けを整理しておきます。
3関数の比較表
| 比較項目 | MAX | MAXIFS | DMAX |
|---|---|---|---|
| 条件指定 | 不可 | AND条件のみ(127ペアまで) | AND・OR・複合すべて可 |
| 条件の書き方 | 不要 | 数式内に範囲・条件をペア指定 | 条件範囲(表形式)で指定 |
| 条件の切り替え | 数式を書き換える | 数式の引数を書き換える | 条件セルを書き換える |
| ワイルドカード | 不要 | *・? 使用可 | *・? 使用可 |
| OR条件 | 不可 | =MAX(MAXIFS, MAXIFS) で代用 | 条件範囲の別行に書くだけ |
| 数式の可読性 | 高(範囲のみ) | 中(条件が増えると長くなる) | 高(数式は短い・条件は表で確認) |
| ダッシュボード向き | × | △ | ◎ |
MAX関数を選ぶべきケース
条件がいっさい不要で「範囲全体の最大値」だけ知りたい場面はMAX関数が最短です。=MAX(D2:D7) のように1引数で済みます。
MAXIFS関数を選ぶべきケース
条件が固定で、AND条件しか使わないならMAXIFSが扱いやすいです。たとえば月次レポートで「営業部の今月の最高額」のように条件が決まっているケースを考えます。この場合、=MAXIFS(D2:D7, A2:A7, "営業部") のように1セルで完結します。条件範囲を別途用意する手間がありません。
DMAX関数を選ぶべきケース
次のいずれかに該当するならDMAX関数を選びましょう。
- 条件をドロップダウンなどで頻繁に切り替える(ダッシュボード用途)
- OR条件を使いたい
- 複数のAND条件・OR条件を組み合わせた複合条件を使いたい
- 集計条件をシート上で見える化したい(条件範囲が「いま何で絞り込んでいるか」のドキュメントになる)
NOTE
「ダッシュボードはDMAX、定型レポートはMAXIFS」と覚えると判断が早くなります。DMAXは条件範囲をシート上に見せられるので、レビュー時に「何で絞り込んでるんだっけ?」となりにくいメリットがあります。
DMAX関数とDMIN関数の組み合わせ(最大値・最小値の同時集計)
DMAX関数とDMIN関数は引数の構造がまったく同じで、結果が最大値か最小値かだけが違います。レポートで「最高額と最低額を並べたい」ときは、同じ条件範囲を共有して2つの関数を並べるのが定番パターンです。
同じ条件範囲を共有する例
「営業部の最高金額と最低金額」を並べて表示する例です。条件範囲を F1:F2 に作っておきます。
| F | |
|---|---|
| 1 | 部署 |
| 2 | 営業部 |
最高額と最低額のセルにそれぞれ次の数式を書きます。
=DMAX(A1:D7, "金額", F1:F2)
=DMIN(A1:D7, "金額", F1:F2)
条件セル(F2)を「総務部」に書き換えると、最高額と最低額が同時に切り替わります。ダッシュボードでドロップダウンと連動させると、部署選択1つで集計値がまとめて更新される作りになります。
最大値と最小値の差(レンジ)を求める
「最高額と最低額の差」を1セルで求めたい場合は、DMAXとDMINを引き算するだけです。
=DMAX(A1:D7, "金額", F1:F2) - DMIN(A1:D7, "金額", F1:F2)
価格帯のばらつきや売上のレンジを可視化したいレポートで便利です。
TIP
DMAX/DMINと同じ条件範囲を共有することで、DSUM(合計)・DAVERAGE(平均)・DCOUNTA(件数)も同時に並べられます。1つの条件で「件数・合計・平均・最大・最小」を一覧化するサマリ表が作れます。
よくあるエラー(#VALUE! / #NUM!)と対処法
DMAX関数でよく遭遇するエラーと原因を整理します。
#VALUE! エラー
原因1:フィールドの列名がデータベースの見出しと一致しない
"金額 " のように末尾にスペースが入っている、"金 額" のように全角スペースが入っているなど、見た目では気づきにくいパターンが多いです。データベース範囲の見出しセルから値をコピーして使うのが確実です。
原因2:条件範囲の見出しがデータベースの見出しと一致しない
条件範囲の1行目(ラベル行)にミスタイプがあるとエラーになります。こちらもコピー&ペーストで作るのが鉄則です。
原因3:データベース範囲の指定ミス
見出し行を含まずにデータ部分だけを指定すると #VALUE! になる場合があります。A2:D7 ではなく A1:D7 のように見出し行から含めて指定してください。
#NUM! エラー
原因:条件に合致するレコードが0件
該当データが存在しない条件を指定すると #NUM! が返ります。たとえば「営業部 かつ 金額500,000以上」のように、実データに存在しない条件を組むと発生します。
エラーを回避したい場合は、IFERROR関数で包んで代替値を返す方法があります。
=IFERROR(DMAX(A1:D7, "金額", F1:G2), "該当なし")
結果が「0」になる
エラーではなく0が返る場合は、次の3つを疑ってください。
- 見出しの不一致:データベース見出しと条件範囲見出しが完全一致していない(最頻出)
- フィールド列に数値がない:DMAXは数値列を対象とするため、文字列列を指定すると0が返る
- 条件範囲に空白行が混入:条件範囲の中に空白行があると「すべて一致」と解釈され、想定外の値が返る
NOTE
「結果が0」のトラブルは、9割が見出しの不一致です。エラーメッセージが出ないので原因に気づきにくく、最も時間を吸われる落とし穴です。条件範囲の見出しは必ずデータベースからコピー&ペーストで作りましょう。
DMAX関数のよくある質問(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で担当者名を引く、という二段構えにするのが実務的です。
Q8. ARRAYFORMULAでDMAXを一気に複数行へ展開できる?
できません。DMAX関数は単一値を返すスカラー関数なので、ARRAYFORMULAで配列展開できない仕様です。
部署ごとなど複数の集計結果を一気に並べたい場合は、QUERY関数の GROUP BY を使うか、各行に個別のDMAX数式を入れる必要があります。「部署一覧をユニーク化 → 各行にDMAX」というパターンが実務でよく使われます。
Q9. 条件範囲とデータベース範囲を同じシートに置く必要はある?
ありません。条件範囲は別シートに置いてもまったく問題なく動きます。
ただし可読性の面では、データベースと条件範囲は同じシートにまとめておくほうがメンテナンスしやすいです。ダッシュボードのように「表示シートと集計シートを分けたい」場合のみ、別シート参照を使うとよいでしょう。
まとめ|条件付き最大値はDMAXで一発
DMAX関数は、データベース形式の表から条件に合うデータの最大値を求める関数です。フィルタを触らずに条件付き集計ができるので、共有シートやダッシュボードと相性抜群です。
ポイントを整理します。
- 構文は
=DMAX(データベース, フィールド, 条件)で、引数は3つすべて必須 - 条件は数式内ではなくセル範囲(条件範囲)に書くのが特徴
- 条件範囲は「見出し行+条件行」のセットで作る
- AND条件は同じ行に横並び、OR条件は別の行に縦並びで書く
- 条件セルの値を変えるだけで集計対象を切り替えられる
- 比較演算子(
>・<・>=・<=・<>)やワイルドカード(*・?)も使える - 全体の最大値はMAX、AND条件のみならMAXIFS、複雑な条件やOR条件・ダッシュボード用途はDMAXが最適
- DMINと組み合わせれば「最高額・最低額・レンジ」を同じ条件範囲で一気に集計できる
- 結果が0になるときは「見出しの不一致」をまずチェック
#NUM!は該当データ0件、#VALUE!は引数や見出しの問題- 最大値を持つレコードの他の列が知りたいときはDGET関数と組み合わせる
まずは簡単な表で =DMAX(A1:D7, "金額", F1:F2) から試してみてください。条件セルを書き換えて結果が変わる感覚をつかめば、データベース関数全体への理解がぐっと深まりますよ。
