Accessのレポートでページごとに合計を置く

スポンサーリンク

アクセスのレポートは、グループヘッダーやグループフッターに集計用のテキストボックスを置くことで、グループごとに集計することができます。

ですが、ページごとの小計ってできないんですね。

職場で以前、銀行に提出する書類に、ページごと小計を置いてください、と依頼されたことがあります。

簡単にできると考えて、「承知しました。」と返事したものの、いざやってみるとできないではありませんか😱

スポンサーリンク

ページフッターに集計用のテキストボックスを置く

使用される際は、そちらの環境で十分テストのうえ使用してください。

Accessのレポートに合計値を表示する
アクセスのレポートは、グループごとに集計する機能があります。

前回の記事で作成したレポートを使います。

まず、購入日でグループ化しましたが、これを削除します。

グループヘッダーからラベルとテキストボックスを移動させたところ

いきなりグループヘッダーを削除すると、そこに配置しているラベルやテキストボックスも削除されてしまうので、ラベルはページヘッダーに、テキストボックスはページフッターに、それぞれ退避させましょう。

グループヘッダーを削除する

退避できたら、グループヘッダーを削除します。

ページごとの集計はできません
テキストボックスがエラーになる

印刷プレビューしてみると、集計行がエラーになってしまいました。

アクセスの基本機能では、ページごとの集計には対応していません。

では、強引に実現してみたいと思います。

スポンサーリンク

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ページ目に累計が表示された
2ページ目に累計が表示された

次のページを見ると、ページ計はそのページの合計ですが、累計は、1ページ目の合計と2ページ目の合計が足されていることが分かります。

最終ページに累計が表示された

最終ページのページフッターです。

エクセルで検算

先ほどと同じように、エクセルで検算してみます。

ページフッターに表示した累計と一致

レポートの値と一致しました。

成功です。

(´▽`)v

コメントをどうぞ!

タイトルとURLをコピーしました