ACCESSで最小値を求める際に便利なDMin関数ですが、「正しく書いたはずなのに値が出ない」「エラーになる」というトラブルは非常に多いです。
実は、DMin関数が正常に動かない理由は、引数の「囲み文字」という非常に初歩的かつ気づきにくいミスが大半を占めています。
本記事では、DMin関数で値が出ない時のチェックリストと正しい書き方を具体例付きで解説します。この記事を読めば、あなたのコードのどこに間違いがあるのかが数分で解決するはずです。
こんにちは。
はこにわガジェット (@hakoniwagadget) です。
ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは使いこなすために少しスキルが必要なものの、うまく活用すればExcelよりも業務の効率化が図れます。
この記事ではACCESSをもっと使いこなしたい方向けにACCESSの関数をご紹介していきます。
【結論】DMin関数で値が出ない4つの主な原因
ACCESSのDMin関数は指定した条件で最小値を求める関数です。
DMin関数が正常に動作しない、あるいは期待した値が表示されない理由は、主に以下の4点です。
- 抽出条件(引数)の記述ミス(クォーテーションの使い分け間違い)
- フィールド名やテーブル名のスペルミス
- 抽出条件に合致するレコードが存在しない
- 条件に合うレコードはあるが、その値がすべてNullである
実務上、1や2はテーブルのデータがどの状態でもエラーが出ますので比較的早く気付くことができます。
一方で3や4のケースは実際のデータによってエラーが発生したりしなかったりしますので原因の特定が遅れがちです。
それでは一つずつ内容を見ていきましょう。
抽出条件(引数)の記述ミス(クォーテーションの使い分け間違い)
最も多い原因として考えられるのは、抽出条件の記述ミスです。
DMin関数は以下の構文で、3つ目の引数に抽出条件を指定します。
DMin ( 最小値を求めるフィールド名 , テーブル名 , 抽出条件 )
この際、抽出条件の記載を誤ると正しく最小値が表示されません。
特に間違えやすいのは、データ型に応じて使い分ける必要がある囲み文字です。
引数の抽出条件自体は文字列型として扱うために、全体を”(ダブルクォーテーション)で囲みます。
更にその中で抽出条件に利用する値については、指定したデータ型に応じて囲み文字を利用する必要があります。
主なデータ型と囲み文字の一覧がこちらです。
| データ型 | 囲み文字 | 記載例 |
|---|---|---|
| 数値型 | 不要 | “単価 = 10” |
| 文字列型 | ‘(シングルクォーテーション) | “商品名 = ‘レポート追加オプション'” |
| 日付型 | #(シャープ) | “登録日 >= #2026/03/31#” |
おそらく、このあたりが初心者には最も理解が難しいポイントだと思いますので何度も試してみてください。
フィールド名やテーブル名のスペルミス
二つ目はフィールド名やテーブル名のスペルミスです。
第一引数のフィールド名、第二引数のテーブル名が誤っていると、期待した結果が出ません。
実際の抽出対象となるテーブルをよく見て、スペルミスの無いように記載しましょう。
こうしたミスを未然に防ぐためにテーブル名、フィールド名をわかりやすく命名しておくことが重要です。
適当な名前や、似たような名前を複数のフィールドについていると間違えの元となります。
異なるテーブルで同じ値であれば同じフィールド名、異なる値であれば別のフィールド名を付与するなど、自分なりの命名規則を徹底しておくことでミスを防ぐことができます。
抽出条件に合致するレコードが存在しない
3つ目は抽出条件に合致するレコードが存在しないケースです。
ここからは、少し原因特定が難しくなります。
例えば、以下の商品マスターテーブルからDMinで商品コードの最小値を求めてみましょう。

フォームで以下のように、テキストボックスに最小値を表示するように設定します。
今回は抽出条件を「商品名がオプション」としました。

=DMin("商品コード","商品マスター","商品名 = 'オプション'")
ではフォームビューで結果を見てみましょう。

このように、値がNullになります。
これは、商品名がオプションのレコードが無いため、DMin関数がNullを返しているためです。
上記のように元データを見たうえで判断すれば、対象レコードが無いとすぐにわかるのですが、実務では「値が出ない」という結果だけが分かる状態ですので、そこから原因を探求するのに骨が折れます。
こうしたケースではまず、抽出されたレコードがあるか否かをクエリを作って調べましょう。
DMin関数の引数に指定した抽出条件をクエリの抽出条件に記載します。

このクエリをデータシートビューで見てみます。

するとレコードが1件も表示されません。
これによって、DMin関数の結果がNullになるのは対象レコードが無いためだと分かります。
対象レコードが無くなる原因は、抽出条件が誤っているか、テーブルのレコードに不備があるかのどちらかです。
業務の要件に合わせて修正しましょう。
もしくは、抽出条件もテーブルのレコードもあっており、DMin関数でNullが返ることがどうしても発生するのであれば、Nullが戻っても処理が進められるように条件分岐などでエラーハンドリングの対応をしましょう。
条件に合うレコードはあるが、その値がすべてNullである
最後に、条件に合うレコードはあるが、その値がすべてNullであるというケースです。
このケースも具体例を見てみましょう。
先程のフォームで抽出条件を少し変えてみます。

=DMin("商品コード","商品マスター","商品名 ='サンプルオプション'")
「サンプルオプション」という商品名の商品コードのみを抽出します。
ここでテーブルを見てみると、サンプルオプションの商品コードには値が入っていません。
この状態でフォームビューを見てみると以下のようになります。

抽出したレコードの値がNullしかないので、最小値もNullを返すという、わかっていれば単純なケースなのですが、これも特定の抽出条件、データでのみ発生するため、原因を見つけることが簡単ではありません。
このケースでも「抽出条件に合致するレコードが存在しない」で紹介したように、抽出条件を適用した選択クエリを作ってレコードを実際に抽出し、値を確認することが着実に問題解決につながるでしょう。
以上、DMin関数で値が出ない場合の対処法をご紹介しました。
ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。
そんな時は、ACCESS開発歴20年以上、過去に300以上のACCESSデータベースの開発・修正実績のあるはこにわガジェット(@hakoniwagadget)にお任せください。
ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。

最後までお読みいただき、ありがとうございました。
