DCount関数は、テーブルやクエリからレコードを探し、条件に一致するレコード件数を数える関数です。この記事では、基本的な構文や、具体的な使い方について解説します。
なお、こちらの記事では関数の基礎知識と共に、Accessで使用できる主な関数を紹介していますので、併せて参考にしてください。
DCount関数とは
テーブルやクエリに含まれるレコード件数を返す関数です。集計の対象となる抽出条件を指定することもできます。定義域集計関数と呼ばれる関数の一種です。
構文
DCount(フィールド名, テーブル名, 抽出条件)
各引数の内容は次のとおりです。
| 引数 | 必須/任意 | 内容 |
|---|---|---|
| フィールド名 | 必須 | 集計対象のフィールド名を指定。ただし集計はレコード単位で行う ため、特定のフィールドではなく「*」を指定することも可能 |
| テーブル名 | 必須 | カウント対象のテーブル名(またはクエリ名) |
| 抽出条件 | 任意 | カウントする対象を絞り込む条件式 |
具体例
次のテーブルを元に、DCount関数でレコードをカウントする基本的な具体例を解説します。
【参照元テーブル(M_社員マスタ)】

【具体例①】
DCount("*","M_社員マスタ")
【解説】
抽出条件を指定していないため、指定したテーブル(M_社員マスタ)の全レコードを数える最も基本的なパターンです。
上記関数を実行すると、テーブルに10件格納されているため、10が返されます。
【具体例②】
DCount("*","M_社員マスタ","所属名='人事部'")
【解説】
抽出条件を指定したパターンです。例は「所属名」フィールドに対して、人事部が格納されているレコードのみ数えるパターンです。例のように文字列を抽出条件に指定する場合は、値を'(シングルコーテーション)で囲む必要があります。
上記関数を実行すると、全10レコード中、人事部は2件であるため、2が返されます。
【具体例③】
DCount("*","M_社員マスタ","生年月日 >= #1990/4/1#")
【解説】
抽出条件を指定した別パターンです。例は「生年月日」フィールドに対して、1990/04/01以降のレコードのみ数えるパターンです。例のように日付を抽出条件に指定する場合は、値を#(シャープ)で囲む必要があります。
上記関数を実行すると、全10レコード中、1990/04/01以降に生まれた社員は7人であるため、7が返されます。
活用例
レポートのヘッダー/フッターに件数を表示する
レポートに配置したテキストボックスのコントロールソースにDCount関数を設定することで、コントロールソースのテーブルに格納されている件数をリアルタイムに表示することができます。
【具体例】
=DCount("*","T_取引テーブル","取引日 = #" & Format(Date(),"yyyy/mm/dd") & "#")
【解説】
下図のようなレポートのフッターなどに件数を表示するパターンです。

例では「本日の取引件(再掲)」欄のコントロールソースに、Dcount関数を設定して件数を表示しています。
VBA内で使用
VBAでDCount関数を使う場合は、取得した値を変数に格納するパターンが多く見受けられます。
【具体例】
Private Sub コマンド1_Click()
Dim cnt As Long
Dim strWhere As String
' 本日の日付を条件部分を変数に格納
strWhere = "取引日 = #" & Format(Date, "yyyy/mm/dd") & "#"
' 本日の取引件数を取得
cnt = DCount("*", "T_取引テーブル", strWhere)
If cnt > 0 Then
' 1件以上あればレポートを印刷
DoCmd.OpenReport "本日の取引レポート", acViewNormal, , strWhere
MsgBox cnt & " 件の本日の取引レポートを印刷しました。"
Else
' 0件ならメッセージだけ表示
MsgBox "本日の取引はありません。"
End If
End Sub
【解説】
まず7行目で、取引日フィールドと本日の日付を比較するWhere条件を作成し変数strWhereに格納します。
10行目で、DCount関数の抽出条件部分に変数strWhereを指定することで、DCount関数を完成させ、戻り値を変数cntに格納します。
12行目のIf文でカウント結果を判定し、その結果に応じてレポート印刷やメッセージ表示を行います。
DCount関数のカウント結果により、後続の判断式で分岐する流れはよく用いられるパターンです。
類似のレコード件数取得方法
DCount関数以外にも、レコードの件数を取得できる方法があります。ここでは参考としてRecordset.RecordCountプロパティをご案内します。
Recordset.RecordCountプロパティは、フォームやレポートのレコードソースとして設定されたテーブルやクエリの格納件数を取得することができます。
【具体例】
Private Sub Form_Load()
Me!テキスト1 = Me.RecordsetClone.RecordCount
End Sub
【解説】
フォーム読み込み時のイベントで上記コードを実行すると、レコードソースに設定したテーブルの全件数が、テキスト1に表示されます。見た通り構文としてはシンプルですが、DCount関数のように抽出条件などで絞り込むことはできませんので、用途は限定的かもしれません。

レコード件数を求めるには、その他にSQLを使う方法もあります。大量データをカウントする場合は、DCount関数よりもむしろSQLの活用が高速です。
まとめ
今回の記事の要点をまとめます。
DCount関数とは
テーブルやクエリから、条件に合うレコードの件数を返す関数。条件を絞ることも可能。
構文
DCount(フィールド名, テーブル名, 抽出条件)
具体例
DCount("*","M_社員マスタ")→ テーブルの全レコード数を取得。DCount("*","M_社員マスタ","所属名='人事部'")→ 所属が「人事部」のレコード数を取得。DCount("*","M_社員マスタ","生年月日 >= #1990/4/1#")→ 1990年4月1日以降に生まれた人の数を取得(日時条件を使う場合は “#” で囲む)。
注意ポイント/使いどころ
- 抽出条件を正しく書くこと(日付条件などはフォーマットや囲み記号に注意)
- “*” を使うとフィールド名を気にせずレコード数を数えられる。
- VBA やレポートなど、UIへの表示だけでなく処理分岐などにも使える。



