Accessのドメイン集計関数のうち、DMax・DMin・DFirst・DLastはとりわけ「最大値・最小値の取得」と「先頭・末尾レコードの値の参照」に特化した4関数です。DSum・DCountと並んで実務DBでは頻繁に登場しますが、DFirst・DLastの「順序が保証されない」という性質を知らずに使うと予期しない値を返すことがあります。
「受注テーブルで最も高い単価を自動表示したい」「顧客の初回購入日と最終購入日をフォームに出したい」「在庫テーブルで最低数量の商品名を特定したい」――こうした要求にDMax・DMin・DFirst・DLastは直接応えます。クエリを別途作成せず、フォームやレポートのテキストボックスに式を書くだけで実装できるのが最大の利点です。
本記事では4関数の引数構文・フォームへの配置手順・データ型別の抽出条件の書き方・DLookUpとの組み合わせパターン・よくあるエラーの対処法・実務6パターンを解説します。MOS Access試験での出題傾向とチェックリストも収録しているので、試験対策にもご活用ください。
ドメイン集計関数の全体像とDMax・DMin・DFirst・DLastの位置づけ
Accessには8種類のドメイン集計関数があります。いずれも「テーブルやクエリ(ドメイン)を対象に、条件を指定して1つの値を返す」という共通の構造を持ちます。
| 関数 | 戻り値 | Excelの近似関数 | 主な用途 |
|---|---|---|---|
| DSum | 合計 | SUMIF / SUMIFS | 売上合計・経費合計 |
| DCount | 件数 | COUNTIF / COUNTIFS | 受注件数・未払い件数 |
| DAvg | 平均 | AVERAGEIF / AVERAGEIFS | 平均単価・平均日数 |
| DLookUp | 最初に合致したフィールド値 | VLOOKUP | 商品名引き・ステータス参照 |
| DMax | 最大値 | MAXIFS | 最高単価・最新受注日 |
| DMin | 最小値 | MINIFS | 最低在庫・初回購入日 |
| DFirst | テーブル内の最初のレコードの値 | (なし) | 先頭レコードの参照(順序不定) |
| DLast | テーブル内の最後のレコードの値 | (なし) | 末尾レコードの参照(順序不定) |
DMax・DMinは「値の大小」を基準に最大・最小を返すため動作が安定しています。一方、DFirst・DLastは「テーブルの物理的な格納順序における最初・最後」を返すため、並べ替えを明示しない限り順序が保証されません。この違いを理解した上で使い分けることが実務設計のカギです。
DMax関数――最大値を取得する
基本構文
=DMax("フィールド名", "テーブル名またはクエリ名", "抽出条件")
第3引数(抽出条件)は省略可能です。省略するとすべてのレコードを対象に最大値を返します。数値フィールドだけでなく日付/時刻型フィールドにも使えます。日付型の最大値は「最も新しい日付」を意味するため、「最終受注日」「最後の入出庫日」をフォームに表示する際によく使われます。
DMaxの実用例
| やりたいこと | 式 |
|---|---|
| 商品テーブル全体の最高単価 | =DMax(“単価”,”商品テーブル”) |
| カテゴリ「電子機器」の最高単価 | =DMax(“単価”,”商品テーブル”,”カテゴリ=’電子機器'”) |
| 受注テーブルの最新受注日(日付型の最大値) | =DMax(“受注日”,”受注テーブル”) |
| 特定顧客の最大受注金額(顧客IDをコントロールから参照) | =DMax(“金額”,”受注テーブル”,”顧客ID=” & [顧客ID]) |
| 担当倉庫の最大在庫数(文字列型の倉庫フィールド) | =DMax(“在庫数”,”在庫テーブル”,”倉庫='” & [倉庫名] & “‘”) |
| オートナンバーの最大値確認 | =DMax(“受注番号”,”受注テーブル”) |
日付の最大値を「最終日付」として使う
日付型フィールドにDMaxを適用すると最も新しい日付が返ります。顧客詳細フォームのテキストボックスに下記の式を設定すると、現在表示中の顧客の最終受注日が自動表示されます。
=DMax("受注日", "受注テーブル", "顧客ID=" & [顧客ID])
テキストボックスの「書式」プロパティを「日付(短い形式)」に設定するとシリアル値ではなく日付形式で表示されます。プロパティシートの「書式」タブ→「書式」欄で設定します。
DMin関数――最小値を取得する
基本構文と実用例
=DMin("フィールド名", "テーブル名またはクエリ名", "抽出条件")
| やりたいこと | 式 |
|---|---|
| 在庫テーブル全体の最低在庫数 | =DMin(“在庫数”,”在庫テーブル”) |
| カテゴリ「消耗品」の最低在庫数 | =DMin(“在庫数”,”在庫テーブル”,”カテゴリ=’消耗品'”) |
| 特定顧客の初回受注日(日付型の最小値) | =DMin(“受注日”,”受注テーブル”,”顧客ID=” & [顧客ID]) |
| 商品テーブルの最低単価 | =DMin(“単価”,”商品テーブル”) |
| 担当者別の最低受注金額(担当者をコントロール参照) | =DMin(“金額”,”受注テーブル”,”担当者='” & [担当者名] & “‘”) |
DMaxとDMinを組み合わせて範囲を表示する
「価格帯」「受注期間」のように最大値と最小値を並べて表示したい場合は、2つのテキストボックスにそれぞれDMaxとDMinを設定します。
| テキストボックス名 | コントロールソース | 表示例 |
|---|---|---|
| txt最高単価 | =DMax(“単価”,”商品テーブル”,”カテゴリ='” & [カテゴリ] & “‘”) | 98,000 |
| txt最低単価 | =DMin(“単価”,”商品テーブル”,”カテゴリ='” & [カテゴリ] & “‘”) | 1,200 |
| txt初回受注日 | =DMin(“受注日”,”受注テーブル”,”顧客ID=” & [顧客ID]) | 2023/04/01 |
| txt最終受注日 | =DMax(“受注日”,”受注テーブル”,”顧客ID=” & [顧客ID]) | 2026/08/30 |
「初回受注日」をDMin(“受注日”)で、「最終受注日」をDMax(“受注日”)で取得するのは典型的なパターンです。DFirst・DLastを使うと物理順序に依存するため、日付の最古・最新にはDMin・DMaxを使う方が確実です。
DFirst関数・DLast関数――先頭・末尾レコードの値を取得する
基本構文
=DFirst("フィールド名", "テーブル名またはクエリ名", "抽出条件")
=DLast("フィールド名", "テーブル名またはクエリ名", "抽出条件")
DFirstは条件に合うレコードのうちテーブル内の最初のレコードの値を、DLastは最後のレコードの値を返します。引数の構造はDMax・DMinと同一です。
「順序が保証されない」罠と回避策
DFirst・DLastの最大の注意点は、テーブルの物理的な格納順序に依存することです。Accessのテーブルはリレーショナルデータベースの原則上、レコードの並びを保証しません。レコードを削除・追加・更新すると物理順序が変わる場合があり、「DFirstが昨日と今日で異なる値を返す」という現象が起こります。
| やりたいこと | 推奨する関数 | 理由 |
|---|---|---|
| 最も古い受注日を取得する | DMin(“受注日”,”受注テーブル”) | 日付の最小値なので順序に依存しない |
| 最も新しい受注日を取得する | DMax(“受注日”,”受注テーブル”) | 日付の最大値なので順序に依存しない |
| 主キーが最小のレコードのフィールド値を取得 | =DLookUp(“フィールド”,”テーブル”,”主キー=” & DMin(“主キー”,”テーブル”)) | DFirstより確実に「最初のレコード」を特定できる |
| 主キーが最大のレコードのフィールド値を取得 | =DLookUp(“フィールド”,”テーブル”,”主キー=” & DMax(“主キー”,”テーブル”)) | DLastより確実に「最後のレコード」を特定できる |
DFirst・DLastが有効な場面
DFirst・DLastは「並べ替え済みのクエリ」をドメインに指定することで実用的に使えます。たとえば受注日の降順で並べ替えた「最新受注クエリ」を事前に作成し、DFirst(“受注番号”,”最新受注クエリ”,”顧客ID=” & [顧客ID]) と書けば、クエリ上での「先頭レコード」は降順で最新の受注番号になります。
ただしこの方法はクエリオブジェクトを別途用意する手間があります。多くの場面では DLookUp+DMax/DMin の組み合わせの方がシンプルです。DFirst・DLastは「既存の並べ替え済みクエリを再利用したい」場面に限定し、通常はDMax・DMin・DLookUpで代替することを推奨します。
DMax・DMinとDLookUpを組み合わせるパターン
DMaxで最大値を特定し、DLookUpでその行の別フィールドを取得する組み合わせは実務で非常に多く使われます。「最高単価の商品名を取得したい」「最新受注番号に対応する担当者名を表示したい」といった要求に応えます。
「最大値を持つレコードの別フィールドを取得する」パターン
=DLookUp("商品名", "商品テーブル", "単価=" & DMax("単価", "商品テーブル"))
この式は「最も単価が高い商品の商品名」を返します。DMaxで最高単価の数値を取得し、その値を条件としてDLookUpで商品名を引いています。
| やりたいこと | 式 |
|---|---|
| 最高単価の商品名を取得 | =DLookUp(“商品名”,”商品テーブル”,”単価=” & DMax(“単価”,”商品テーブル”)) |
| 最新受注日の受注番号を取得 | =DLookUp(“受注番号”,”受注テーブル”,”受注日=#” & Format(DMax(“受注日”,”受注テーブル”),”yyyy/mm/dd”) & “#”) |
| 最低在庫の商品コードを取得 | =DLookUp(“商品コード”,”在庫テーブル”,”在庫数=” & DMin(“在庫数”,”在庫テーブル”)) |
| 特定顧客で最も金額が大きい受注の担当者名 | =DLookUp(“担当者”,”受注テーブル”,”金額=” & DMax(“金額”,”受注テーブル”,”顧客ID=” & [顧客ID]) & ” And 顧客ID=” & [顧客ID]) |
日付型フィールドをDLookUpの条件に使う場合は、Format関数でシャープ囲みの文字列に変換する必要があります(上記の「最新受注日の受注番号」の例を参照)。日付をシャープで囲まないと型不一致エラーが発生します。
同一の最大値を持つレコードが複数ある場合
DLookUpは条件に合う最初のレコードの値のみ返します。最高単価が同じ商品が複数ある場合、どの商品名が返るかは保証されません。「最高単価の商品を全件取得したい」のであれば選択クエリで絞り込み、結果をサブフォームやレポートで表示する設計の方が適切です。
第3引数「抽出条件」のデータ型別書き方
DMax・DMin・DFirst・DLastで最もミスが多い箇所が第3引数の抽出条件です。データ型によってクォートの有無と囲み方が変わります。
| データ型 | 条件の書き方 | 例 |
|---|---|---|
| 数値型(整数・小数) | クォート不要。数値をそのまま書く | “顧客ID=101” |
| テキスト型・短いテキスト | 値をシングルクォートで囲む | “カテゴリ=’電子機器'” |
| 日付/時刻型 | 値をシャープ(#)で囲む | “受注日=#2026/06/23#” |
| Yes/No型(ブール) | True/False または -1/0 を使う | “承認済=-1” または “承認済=True” |
| フォームコントロール(数値) | コントロール参照を & で文字列連結 | “顧客ID=” & [顧客ID] |
| フォームコントロール(文字列) | コントロール参照をシングルクォートで囲んで連結 | “カテゴリ='” & [カテゴリ名] & “‘” |
| フォームコントロール(日付) | Format関数でシャープ囲みの形式に変換して連結 | “受注日=#” & Format([受注日],”yyyy/mm/dd”) & “#” |
| AND条件(複数条件) | And で接続 | “カテゴリ=’電子機器’ And 在庫数>0” |
フォーム・レポートへの配置手順
| 手順 | 操作 | 補足 |
|---|---|---|
| ① フォームをデザインビューで開く | ナビゲーションウィンドウでフォームを右クリック→「デザインビュー」 | 新規フォームでも既存フォームへの追加でも同じ手順 |
| ② テキストボックスを挿入 | 「フォームデザイン」タブ→「コントロール」グループ→「テキストボックス」をドラッグで配置 | 配置と同時にラベルが自動生成される |
| ③ コントロールソースに式を入力 | テキストボックスを選択→プロパティシート→「データ」タブ→「コントロールソース」に式を入力 | 式は = から始める(例:=DMax(“単価”,”商品テーブル”)) |
| ④ 書式を設定(任意) | プロパティシート→「書式」タブ→「書式」欄で通貨・日付等を選択 | 金額なら「通貨」、日付なら「日付(短い形式)」が読みやすい |
| ⑤ フォームビューで確認 | 「表示」→「フォームビュー」に切り替えて正しい値が表示されているか確認 | #Error が出た場合は引数のスペルと引用符を確認する |
レポートに配置する場合も同じ手順です。レポートのグループフッターに最大値・最小値のテキストボックスを置くと、グループごとの最高・最低を一覧化できます。ただしレポート内の集計であれば =Max([フィールド名]) の形式(レポート集計機能)を使う方がパフォーマンスは向上します。DMax・DMinはテーブルをフルスキャンするため、大規模データではレポート集計機能との使い分けを検討してください。
よくあるエラーと対処法
| エラー表示 | 原因 | 対処法 |
|---|---|---|
| #Error | テーブル名・フィールド名のスペルミス、または参照コントロールが存在しない | テーブル名はナビゲーションウィンドウからコピーして貼り付ける。フォームコントロール名をプロパティシートで確認する |
| #Name? | DMax・DMin・DFirst・DLastの関数名が認識されない(全角文字混入・スペルミス) | 関数名を半角英字で正確に入力する。コピー貼り付け時に全角スペースが混入しないよう注意する |
| Null(空欄) | 対象フィールドのすべてのレコードがNull、または抽出条件に合うレコードが0件 | =Nz(DMax(“フィールド”,”テーブル”),0) でNullを既定値に変換する |
| 型の不一致エラー | テキスト型フィールドにシングルクォートなし、または日付型フィールドにシャープなし | テキスト型は “フィールド=’値'”、日付型は “フィールド=#yyyy/mm/dd#” の形式に修正する |
| DFirstが期待した値を返さない | テーブルの物理順序が変動しており「最初のレコード」が想定と異なる | DMin・DMaxまたはDLookUp+DMin/DMaxに変更して順序に依存しない設計にする |
| フォームを開くたびに動作が遅い | 大量レコードのテーブルをドメイン集計関数がフルスキャンしている | 集計フィールドにインデックスを設定する。またはレポート集計機能やクエリでの事前集計に変更する |
Nz関数は =Nz(DMax("単価","商品テーブル","カテゴリ='A'"), 0) のように使います。条件に合う商品がゼロ件のとき DMax はNullを返しますが、Nzが0に変換するため空欄表示を防げます。金額表示では「何も表示されない」よりも「0円」と表示する方がユーザーにとって直感的です。
実務パターン集
| シナリオ | 使う関数 | 配置場所 | 式の例 |
|---|---|---|---|
| 顧客詳細フォームに「この顧客の最終受注日」を表示 | DMax | フォームのメインセクション | =DMax(“受注日”,”受注テーブル”,”顧客ID=” & [顧客ID]) |
| 顧客詳細フォームに「この顧客の初回受注日」を表示 | DMin | フォームのメインセクション | =DMin(“受注日”,”受注テーブル”,”顧客ID=” & [顧客ID]) |
| 在庫管理フォームに「最低在庫の商品名」を表示 | DLookUp + DMin | フォームフッター | =DLookUp(“商品名”,”在庫テーブル”,”在庫数=” & DMin(“在庫数”,”在庫テーブル”)) |
| 商品一覧フォームのフッターに「最高単価・最低単価」を並べて表示 | DMax + DMin | フォームフッター | 最高:=DMax(“単価”,”商品テーブル”) / 最低:=DMin(“単価”,”商品テーブル”) |
| 受注フォームに「最新受注番号の担当者名」を表示してオペレーター確認に使う | DLookUp + DMax | フォームヘッダー | =DLookUp(“担当者”,”受注テーブル”,”受注番号=” & DMax(“受注番号”,”受注テーブル”)) |
| 担当者別フォームに「担当者の最高受注金額」を表示 | DMax | フォームのサブセクション | =DMax(“金額”,”受注テーブル”,”担当者='” & [担当者名] & “‘”) |
MOS Access試験での出題傾向と対策
MOS Access 365では、ドメイン集計関数はフォームやレポートに集計値を表示するスキル区分で出題される可能性があります。DMax・DMinは「最大値・最小値の取得」として問われることがあり、コントロールソースへの正確な式入力が求められます。出題範囲に含まれます。分野別の出題数・配点は公表されていません。
- DMax・DMinの構文:第1引数にフィールド名(文字列)・第2引数にテーブル名(文字列)・第3引数に抽出条件を正確に入力できるか確認する
- データ型別の抽出条件の書き方:数値型はクォート不要・テキスト型はシングルクォートで囲む・日付型はシャープで囲む――3パターンを確実に書けるようにする
- フォームコントロールとの連携:=DMax(“金額”,”受注テーブル”,”顧客ID=” & [顧客ID]) のような、同一フォームのコントロールを条件に組み込む構文を練習する
- Nz関数との組み合わせ:=Nz(DMax(…)、0) の形でNull時のデフォルト値を設定できるか
- DFirst・DLastの限界の理解:「DFirst・DLastは物理順序に依存する」という性質を理解し、日付の最古・最新にはDMin・DMaxを使う判断ができるか
- プロパティシートの操作:デザインビューでテキストボックスを選択→「データ」タブ→「コントロールソース」に式を入力する手順を確実に実行できるか
頻出操作チェックリスト
| 確認項目 | 操作内容 | 難易度 |
|---|---|---|
| DMaxでフォームに最大値を表示 | テキストボックス→コントロールソース→=DMax(“フィールド”,”テーブル”) を入力→フォームビューで確認 | ★★☆ |
| DMinで最小値を条件付きで取得 | 第3引数に抽出条件を追加し、カテゴリや担当者で絞り込んだ最小値を表示 | ★★☆ |
| DMax+DLookUpで最大値を持つレコードの別フィールドを取得 | ネストした関数をコントロールソースに正確に入力 | ★★★ |
| 日付型フィールドへのDMax適用 | 最新日付を表示し、書式を「日付(短い形式)」に設定 | ★★☆ |
| Nz関数との組み合わせ | =Nz(DMin(…)、0) の構文でNull時の既定値を設定 | ★★★ |
試験時間は50分です。ドメイン集計関数の問題は「式の記述ミスによる#Errorの原因特定と修正」という形で出題されることもあります。引数の構文(引用符の有無・シングルクォートとシャープの使い分け)を素早く正確に入力する練習を繰り返すことが得点に直結します。
まとめ
DMax・DMin・DFirst・DLastはいずれもドメイン集計関数の仲間ですが、用途と信頼性に明確な違いがあります。DMax・DMinは値の大小を基準にするため動作が安定しており、数値・日付・テキストの最大・最小をフォームやレポートに表示する場面で広く使えます。
DFirst・DLastは物理順序に依存するため「思った通りの値が返らない」リスクがあります。「最も古い日付」「最も新しい日付」にはDMin・DMaxを使い、「最大値を持つレコードの別フィールド」にはDLookUp+DMaxの組み合わせを使うのが堅実な設計です。
データ型別の抽出条件の書き方(数値はクォート不要・テキストはシングルクォート・日付はシャープ)は、いずれのドメイン集計関数でも共通です。この規則を身につければ、DMax・DMin以外のDSum・DCount・DAvgにも同じ知識が横展開できます。実際のAccessテーブルで式を入力してフォームビューで結果を確認するサイクルを繰り返し、確実な操作技術を身につけましょう。
PR
ExcelのMAXIFS・MINIFSなど集計関数の体系的な使い方を網羅した解説書。AccessのDMax・DMinと考え方が共通しているため、Microsoft 365での関数思考を横断的に深めたい方に最適な一冊です。
