条件に一致するレコードの件数を調べるAccessVBA

スポンサーリンク

Accessでのシステムを構築する際にレコードの件数を取得する方法を調べました

最近仕事でAccessを使用して価格POP(店で価格を表示している紙)を作るシステムを作成しました。

複数のサイズで印刷できるように条件を設定し、レポートで出力する仕組みで作成していたのですが、不要なレポートを開かないようにするために、条件に合うレコードの件数を取得する方法を調べました。

今回はAccessVBAで対象レコードの件数を取得する方法を紹介します。

今回作成したフォームとテーブル・レコードの説明

今回作成したシステムのメインのフォームとテーブルは下記のようになっています。

118-1フォーム 118-2テーブル

必要な商品のJANコードを読み込ませると商品マスタテーブルから商品名や規格・価格を取得する仕組みです。
印刷したいサイズのチェックボックスにチェックをつけることで印刷ボタンをクリックした際に表示させることができる仕様です。

3パターンあるPOPをレポートで印刷するのですが、件数が1件もない場合レポートを表示させないようにするためレコードの件数を取得する必要がありました。

よく「レポート 件数 取得 Access」などでGoogle検索して出てくる方法で、レポート自体のコントロールに件数を表示させる方法もあったのですが、VBAで表示する前のレポートの表示後の件数を取得することができなかったのでその方法は使えませんでした。

今回紹介する方法はテーブルのデータを読み取ってレポートを表示する条件のレコードを取得する方法で、レポートの表示・非表示にかかわらず件数を取得できます。

スポンサーリンク

レコードの件数を取得する2通りの方法について

レコードの件数を取得する方法は関数を用いる方法とADOを使用する方法があります。

関数を使用する方法はピンポイントで件数だけを取得するのに手軽で便利な方法です。

逆にADOは参照設定や宣言が必要なので少しコードが複雑になりますが、件数の取得だけでなくレコードの検索・追加や全フィールドの値を取得したりなど、幅広い処理が可能です。

関数を使用する方法

DCount関数を使用し、「DCount(“*”, “テーブル名”, “取得するレコードの条件”)」の記載方法で件数を取得します。

MsgboxやDebug.Printなどで出力すれば件数が表示できます。

DCount関数の最初の引数はフィールド名を記載するのが本来の使い方のようですが、「*」が使用できるので「*」を用いた方が汎用性があって便利です。

Private Sub 印刷_Click()

Me.Requery

’[印刷する_2031]=にチェックがついているレコードがあればレポートをプレビュー表示する
If DCount(“*”, “T_POP”, “[印刷する_2031]=TRUE”) <> 0 Then
DoCmd.OpenReport “R_POP書式20×31”, acViewPreview, “”, “[印刷する_2031]=TRUE”, acWindowNormal
End If

’[印刷する_4031]=にチェックがついているレコードがあればレポートをプレビュー表示する
If DCount(“*”, “T_POP”, “[印刷する_4031]=TRUE”) <> 0 Then
DoCmd.OpenReport “R_POP書式40×31”, acViewPreview, “”, “[印刷する_4031]=TRUE”, acWindowNormal
End If

’[印刷する_4063]=にチェックがついているレコードがあればレポートをプレビュー表示する
If DCount(“*”, “T_POP”, “[印刷する_4063]=TRUE”) <> 0 Then
DoCmd.OpenReport “R_POP書式40×63”, acViewPreview, “”, “[印刷する_4063]=TRUE”, acWindowNormal
End If

End Sub

ADOを使用する方法

ADOを使用して、対象とするテーブルや選択クエリの件数を取得することができます。

ADOを使用する際はMicrosoft ActiveX Data Objects 〇〇 Libraryにチェックを入れる必要があります。

テーブルの中から特定の条件のレコード件数を取得するためには条件をSQLで指定します。

Private Sub 印刷_Click()

Me.Requery

’Microsoft ActiveX Data Objects 〇〇 Libraryの参照設定にチェックを入れる
Dim RS(2) As ADODB.Recordset
Set RS(0) = New ADODB.Recordset
Set RS(1) = New ADODB.Recordset
Set RS(2) = New ADODB.Recordset
Dim CN As ADODB.Connection
Set CN = CurrentProject.Connection

Dim SQL(2) As String
SQL(0) = “SELECT [T_POP].* FROM [T_POP] WHERE ([T_POP].[印刷する_2031])=True;”
SQL(1) = “SELECT [T_POP].* FROM [T_POP] WHERE ([T_POP].[印刷する_4031])=True;”
SQL(2) = “SELECT [T_POP].* FROM [T_POP] WHERE ([T_POP].[印刷する_4063])=True;”

RS(0).Open SQL(0), CN, adOpenKeyset, adLockOptimistic
RS(1).Open SQL(1), CN, adOpenKeyset, adLockOptimistic
RS(2).Open SQL(2), CN, adOpenKeyset, adLockOptimistic

’RS(0)のレコード件数が0でなければレポートを開いてプレビューを表示する
If RS(0).RecordCount <> 0 Then
DoCmd.OpenReport “R_POP書式20×31”, acViewPreview, “”, “[印刷する_2031]=TRUE”, acWindowNormal
End If

’RS(1)のレコード件数が0でなければレポートを開いてプレビューを表示する
If RS(1).RecordCount <> 0 Then
DoCmd.OpenReport “R_POP書式40×31”, acViewPreview, “”, “[印刷する_4031]=TRUE”, acWindowNormal
End If

’RS(2)のレコード件数が0でなければレポートを開いてプレビューを表示する
If RS(2).RecordCount <> 0 Then
DoCmd.OpenReport “R_POP書式40×63”, acViewPreview, “”, “[印刷する_4063]=TRUE”, acWindowNormal
End If

RS(0).Close
RS(1).Close
RS(2).Close

Set CN = Nothing
Set RS(0) = Nothing
Set RS(1) = Nothing
Set RS(2) = Nothing

End Sub

ADOはテーブルやクエリの情報をすべて取得できるので関数で指定するよりもコードが長くなりますが、レコードを1件ずつ全て取得したり、細かく条件を設定して変換したり、レコードを新たに追加したり様々なことができるのでとても便利です。

イメージとしてはテーブルをExcelVBAでワークシートを操作するような感じで編集することが可能になる感じです。

ADOの使ってテーブルを追加したり編集したりする手順についてはまた別の機会にご紹介します。

コメント