アクセスのレポートは、グループヘッダーやグループフッターに集計用のテキストボックスを置くことで、グループごとに集計することができます。
ですが、ページごとの小計ってできないんですね。
職場で以前、銀行に提出する書類に、ページごと小計を置いてください、と依頼されたことがあります。
簡単にできると考えて、「承知しました。」と返事したものの、いざやってみるとできないではありませんか😱
ページフッターに集計用のテキストボックスを置く
前回の記事で作成したレポートを使います。
まず、購入日でグループ化しましたが、これを削除します。
いきなりグループヘッダーを削除すると、そこに配置しているラベルやテキストボックスも削除されてしまうので、ラベルはページヘッダーに、テキストボックスはページフッターに、それぞれ退避させましょう。
退避できたら、グループヘッダーを削除します。
印刷プレビューしてみると、集計行がエラーになってしまいました。
アクセスの基本機能では、ページごとの集計には対応していません。
では、強引に実現してみたいと思います。
VBAを使って集計する
詳細行をレポートに出力される度に1行ずつ枚数と購入金額を足していって、ページフッターに到達したら、そこにあるテキストボックスにその値を表示させる、という方法です。
レポートが生成されるタイミングで動くVBAを仕込んで、実現します。
なお、枚数を集計した値を表示させるテキストボックスは、「txt_枚数ページ計」、購入金額を集計した値を表示させるテキストボックスは、「txt_購入金額ページ計」という名前を付けました。
さらに、「txt_枚数ページ計」と「txt_購入金額ページ計」のコントロールソースは削除して、「非連結」状態にしておいてください。
レポート読み込み時、ページヘッダーセクション印刷時、詳細印刷時、ページフッターセクション印刷時にイベントプロシージャを設定します。
記述するコードは次の通りです。
Option Compare Database Option Explicit Dim PGCNT_maisu As Long Dim PGTOTAL_kingaku As Currency Private Sub Report_Load() PGCNT_maisu = 0 PGTOTAL_kingaku = 0 End Sub Private Sub ページヘッダーセクション_Print(Cancel As Integer, PrintCount As Integer) PGCNT_maisu = 0 PGTOTAL_kingaku = 0 End Sub Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer) PGCNT_maisu = PGCNT_maisu + Me.txt_枚数 PGTOTAL_kingaku = PGTOTAL_kingaku + Me.txt_購入金額 End Sub Private Sub ページフッターセクション_Print(Cancel As Integer, PrintCount As Integer) Me.txt_枚数ページ計 = PGCNT_maisu Me.txt_購入金額ページ計 = PGTOTAL_kingaku End Sub
注目していただきたい所は、4行目と5行目に変数を宣言しているところです。
いつもなら、Sub ~ の次に記述するのですが、今回はこのレポート内で変数に格納した値を受け渡していくため、一番上に記述しています。
記述が完了したら、印刷プレビューしてみましょう。
どうですか?ページフッターに枚数と購入金額の集計値が表示されていますか?
ホンマかどうかあやしいので、エクセルで検算してみましょう。
ページフッターの集計行と一致しました。
ページフッターの累計を計算する
応用すれば、ページごとの数値を足していくこともできます。
まず、レポートのページフッターには、累計を表示するためのテキストボックスを設置しました。
枚数の累計を表示させるテキストボックスが「txt_枚数累計」、購入金額の累計を表示させるテキストボックスが「txt_購入金額累計」です。
何の値を表示しているかわかるように、ページ計、累計のラベルも設置しました。
続いて、コードを変更します。
変数「TOTALCNT_maisu」、「SUBTOTAL_kingaku」を追加します。
Option Compare Database Option Explicit Dim PGCNT_maisu As Long Dim PGTOTAL_kingaku As Currency Dim TOTALCNT_maisu As Long Dim SUBTOTAL_kingaku As Currency Private Sub Report_Load() PGCNT_maisu = 0 PGTOTAL_kingaku = 0 TOTALCNT_maisu = 0 SUBTOTAL_kingaku = 0 End Sub Private Sub ページヘッダーセクション_Print(Cancel As Integer, PrintCount As Integer) PGCNT_maisu = 0 PGTOTAL_kingaku = 0 End Sub Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer) PGCNT_maisu = PGCNT_maisu + Me.txt_枚数 PGTOTAL_kingaku = PGTOTAL_kingaku + Me.txt_購入金額 TOTALCNT_maisu = TOTALCNT_maisu + Me.txt_枚数 SUBTOTAL_kingaku = SUBTOTAL_kingaku + Me.txt_購入金額 End Sub Private Sub ページフッターセクション_Print(Cancel As Integer, PrintCount As Integer) Me.txt_枚数ページ計 = PGCNT_maisu Me.txt_購入金額ページ計 = PGTOTAL_kingaku Me.txt_枚数累計 = TOTALCNT_maisu Me.txt_購入金額累計 = SUBTOTAL_kingaku End Sub
このレポートを印刷プレビューに切り替えると、このようにページ計の下に設置した累計に値が表示されます。
次のページを見ると、ページ計はそのページの合計ですが、累計は、1ページ目の合計と2ページ目の合計が足されていることが分かります。
最終ページのページフッターです。
先ほどと同じように、エクセルで検算してみます。
レポートの値と一致しました。
成功です。
(´▽`)v
コメントをどうぞ!