Accessはデータベースツールなので、その神髄はテーブルに保存されているデータを操作することです。
VBAからレコード(テーブルに格納された1行1行のデータ)を操作するためには、DAOやADOといった技術を使うのですが、レコードの件数を取得するだけなら非常にシンプルな関数で事足りてしまいます。
それがDCount関数です。
普段手なりで使っている方も、細かい仕様を理解すると、ソースコードをシンプルにできたりクエリの数を減らせたり、アプリケーションの保守性を高めるヒントになるかも知れませんので、紹介しますね。
MsgBox DCount("*", "売上明細")
上記はサンプルです。カッコの中の最初の「*」は、全件数を取得する時のおまじないです。カンマの後ろの「売上明細」は件数を数えたいテーブルの名前です。この1行で売上明細テーブルに登録されたレコードの全件数を取得できます。
レコードセットオブジェクトの定義やオブジェクトの開放など考えず関数ひとつで取得できるので、非常に便利ですよね。
売上明細テーブルから、売上金額が5,000円以上の明細の件数を取得する場合は次のようにします。
MsgBox DCount("*", "売上明細", "[売上金額] >= 5000")
カッコの中の3つ目の引数で、件数をカウントするレコードの条件を指定できます。ちなみに、引数とは「関数に引き渡すデータ」であり、その関数が渡されたデータを処理した結果のことを戻り値、と呼びます。
次に、売上金額が5,000円以上のレコードのうち、ポイントカードを提示された(=ポイントカード項目にカード番号が入っている)件数だけを数えてみましょう。
MsgBox DCount("[ポイントカード]", "売上明細", "[売上金額] >= 5000")
これで、ポイントカード項目にデータが入っている件数がカウントできます。厳密には、ポイントカード項目がNullではないレコードの件数になります。データが入っていない(見た目上なにも表示されていない)ことと、Nullであることには内部的に違いがあります。確実に結果を得るためには、
MsgBox DCount("*", "売上明細", "[売上金額] >= 5000 and nz([ポイントカード], '') <> '' ")
これでポイントカード項目にデータが入っていない(Nullもしくは空白、つまり長さ0の文字列)レコードを除いた件数が取得できます。
最後に、第一引数の少し高度な使い方です。
ポイントカード項目とクレジットカード項目のいずれかがNullではないレコード件数を取得したい場合は、
MsgBox DCount("[ポイントカード] & [クレジットカード]", "売上明細")
このように半角の&(アンパサンド)記号で項目名をつなげてあげることで表現できます。いずれか、ではなく両方がNullではないレコードを取得する場合は、以下のようにアンパサンドの代わりに半角の+記号を使います。
MsgBox DCount("[ポイントカード] + [クレジットカード]", "売上明細")
もちろん、第三引数にOR条件やAND条件を記載しても実現可能ですが、長さ0の文字列が入ってこないことが分かっているデータをカウントする時に使ってみると、少しコードがすっきりしますね。