MS Access Tips/Sample and VBA and Blog customize etc...

レポート上でグループ化した項目を集計

レポート上でグループ化して表示したい場合、グループ化の設定を使用するか、重複データ非表示プロパティを使用します。
このようなフィールドを集計する場合、レポートフッターで
=Count([グループフィールド名])
と設定すると、詳細の件数分集計されてしまいます。

このような場合でも、グループの件数をカウントする方法を紹介します

グループ化した項目をカウント

難易度:

概要

下記のようなテーブルまたはクエリがあるとします。
(実際は、一対多のテーブルをクエリで結合したクエリの場合が多いと思いますが、)

Group1Fld1Fld2Fld3ID
Aa1001
Ab2002
Ac3003
Ba1004
Bb2005
Aa1006
Ab2007
Ba3008
Aa1009
Ab20010

これをもとにレポートを作成します。

ウィザードで作成て、途中で Group1 でグループ化を指定します。
デザインビューで下図のようなものになります。

レポートデザインビュー

Group1 テキストボックスの「重複データ非表示」は「はい」になっています。
Fld1 テキストボックスも「重複データ非表示」は「はい」に変更します。

レポートフッターにテキストボックスを4つ配置してそれぞれ下記のように設定します。

ラベルの標題 グループ件数
コントロールソース =Count([Group1])

ラベルの標題 Fld1件数
コントロールソース =Count([Fld1])

ラベルの標題 A件数
コントロールソース =Sum(IIf([Fld1]="A",1,0))

ラベルの標題 B件数
コントロールソース =Sum(IIf([Fld1]="B",1,0))

これで、レポート上で表示されている項目の件数を表示させることを期待してます。

しかし、結果は下図のとおり。

レポートプレビュー失敗

非表示の分も含めた詳細の件数分の集計が表示されます。

これは、Count関数やSum関数の集計の対象はレコードソースのフィールドであり、レポート上のコントロールではないからです。例えば、「Group1」テキストボックスの名前を「txtGroup1」と変更して、 =Count([txtGroup1]) とするとエラーになることから分かります。

グループ化したフィールドを集計

ではコントロールを対象にして集計をしたい場合はどうしたらいいでしょうか。

テキストボックスには「集計実行」というプロパティがあります。これは、本来は累計を表示するためのものです。
例えば、連番を表示したいとき、詳細セクションにテキストボックスを配置して、

コントロールソース =1
集計実行 全体

などとすると、1から始まる連番が表示されます。コントロールソースの 1 が順に加算されていくからです。
ではこのテキストボックスをグループヘッダーに移動させてみましょう。
グループでの連番が表示されます。
このテキストボックスの名前を「グループ連番」としましょう。

レポートフッターのグループ件数のコントロールソースを下記で上記のテキストボックスを参照します。

=[グループ連番]

これで、グループ件数が表示されます。
グループヘッダーの表示が不要なら、「可視」を「いいえ」にして非表示にします。

レポートプレビューグループ化

「重複データ非表示」のフィールドを集計

サンプルのデータなら、Fld1 でグループ化して、グループヘッダーを表示させて、上記と同じ方法で表示させることもできます。
ただ、グループ化すると並び順が希望と異なるとか、グループ化できない場合もあるでしょう。

その場合で、表示されている項目のみの集計はできないでしょうか。

テキストボックスには IsVisible というプロパティがあります(プロパティシートには表示されないので、あまり知られてませんが・・)。

これは、「重複データ非表示」によってテキストボックスが表示されているのか非表示になっているのかを取得します。ヘルプの使用例を見ると、VBAでテキストボックスの表示/非表示に合わせて、罫線(直線コントロール)の可視を制御するために使っています。

実は、これはコントロールソースからでも参照することができます。これを使うとグループ化しなくても、表示された項目だけの集計が可能になります。

詳細セクションにテキストボックスを配置して下記のように設定します。

コントロールソース =[Fld1].[IsVisible]

これをプレビューすると、表示さている時は -1、表示されていない時は 0 となります。-1になるのはAccessでは True = -1 だからです。
さらにプロパティを下記のように変更します。

コントロールソース =-[Fld1].[IsVisible]
集計実行 全体

これで表示されている項目のみの集計が表示されます。

Fild1 の A の件数は下記のようになります。

詳細セクションにテキストボックスを配置して、

名前 A連番
コントロールソース =[Fld1]="A" AND [Fld1].[IsVisible]
可視 いいえ

レポートフッターにテキストボックスを配置して下記のように設定します。

コントロールソース =-[A連番]

Bの件数も同様にします。

レポートプレビューグループ化

拍手する

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/420-cf605e14
該当の記事は見つかりませんでした。