ページの合計 |
|
今までVBAの説明をしてきましたが、基本的にVBAはあまり使わずにマクロなどでプログラムを作成するほうが初心者にはとりかかりやすいでしょう。 |
|
ただ、今回は、VBAでないとちょっと無理かな、という処理について説明します。 |
|
レポートというオブジェクトがありますね。 |
アクセスの「レポート」は「改ページ」や「ページ合計」というような「用紙サイズに左右される」操作は苦手なのでそのへんをVBAでカバーしていきたいと思います。
|
|
|
こういうテーブルがあったとします。 |
|
それをもとにレポートを作ります。 |
|
|
|
そのレポートの中で全部の売り上げ合計を出す時には、レポートフッター部分でSum関数を使えば |
最後のページの一番最後のレコードのすぐ下に合計金額が計算されて出てきます。 |
|
|
|
しかしデータがもっといっぱいあって何ページにもわたる場合、ページごとの合計も出そうと思います。 |
|
|
ところがSum関数はページフッター部分では動かないのでエラーになってしまいました。 |
|
|
|
動かないというより、この部分を出力しようとしているときはまだ、ページ合計の値が出ていないのですね。 |
どのレコードで改ページされるか、レコードがどういう順番に並んでいるのか、出力してみるまでわからないからです。 |
でもどうしてもページ合計を印刷したい、というときは「VBAで処理を書く」という方法をとるのがベターのようです。 |
|
オーソドックスな方法ですが、一行ずつ売り上げを足し算していきます。 |
まず足し算を保存しておける入れ物のようなものを用意して、改ページする前にその入れ物の中身を「ページ合計」を印刷したいテキストボックスの中に放り込んで、入れ物の中身をゼロにして、次のページに移る…、というようなイメージでやってみましょう。 |
|
では、レポートをデザインビューで開いてください。 |
「詳細」というところで「売り上げ」を足し算して、「ページフッター」で非連結のテキストボックス(ここでは「テキスト13」)に代入します。 |
|
|
フォームほどではないのですがレポートにも独特の「イベント」があるのでそれを活用していこうと思います。 |
では、「売り上げを足し算して入れておく入れ物」として「変数」を使いましょう。 |
|
詳細セクションのプロパティの中の「イベント」のところを見ます。 |
「フォーマット時」と「印刷時」というのがありますが、とりあえず「フォーマット時」で足し算してみましょうか。 |
「変数」の説明をもう一度繰り返しておくと、 |
|
まず変数の名前を決めて(プロシージャ名と同じでありがちな名前は避けましょう) |
その変数名を使いたい、とお願いして(Dimステートメントという行でお願いする) |
その変数にどういった種類の値が入るか決めます。(数値や文字など) |
|
こんな感じで変数の宣言をします。 |
ではここでは「BE」という名前の変数を使って説明していきます。 |
売り上げ金額を足し算するので「数値型、Long(長整数型)」にします。 |
|
|
|
そしてこのBEの中に売り上げ金額を足し算していくのですが、毎行毎行加算していくので |
BEの中身は今までのBEの売り上げ金額を足した数、ということになります。 |
|
|
では、ページフッター部分でBEの中身をテキストボックスに移すので |
ページフッターの「フォーマット時」のイベントを作りましょう。 |
|
 |
|
しかしBEという変数は「詳細_Format」という名前のプロシージャの中で宣言しているので他では使えません。 |
でも今回は「詳細」と「ページフッター」両方で使いたいので、そういう場合は変数の宣言をモジュールの一番上でしましょう。 |
これでこのモジュール内で共通してBEという変数が使えます。 |
|
 |
|
ページフッターセクション_Formatの中でテキストボックスにBEという値を代入して |
次のページに移動するので、BEの中身をゼロにしておきます。 |
1ページごとの集計ではなく累計のするならゼロにしないでいいです。 |
ではプレビューしてみましょう。 |
|
|
|
出てますね。 |
でも不安なので、テーブルデータをエクセルに移して計算しなおしてみました。 |
|
・・・間違っているようですね。 |
どうしてでしょう? |
|
どうやら2ページ目の1レコード目まで足してしまっているようです。 |
|
1ページ目の「ページフッターFormat」の処理より、2ページ目の1レコード目の「詳細Format」の処理のほうが一足先に実行されているようです。 |
Formatイベントのヘルプによると、「レポートの詳細セクションの場合、Formatイベントは、セクションの各レコードのデータがフォーマットされる直前に発生します」となっています。どうもその順番が問題のようです。
|
|
ではためしにイベントを変えてみましょう。 |
フォーマット時のイベントのところの「イベントプロシージャ」は消して、印刷時のイベントを作りましょう。 |
|
|
|
さっきと同じように入力して、Format時のイベントはいらないので、2行とも消してしまいましょう。 |
|
|
|
プレビューをみてみましょう。 |
|
|
|
大丈夫みたいですね。 |
|
|
このようにVBAというのは、コードの中身の書き方だけでなく、どのイベントで動かすか、によっても変わってきます。 |
VisualBasicの知識だけではだめなんですね。 |
AccessのVBAなら、Accessのオブジェクトに関していろいろと知っておかなければならないし、ExcelのVBAなら |
Excelのシートや関数の知識がないといけません。 |
|
簡単ですがVBAの説明をしてきましたが、理解していただけたでしょうか。 |
要するに、コードの書き方を勉強するだけでなく、レポートやフォームの構造やイベントに関しても理解していないと駄目なんですね。大変ですががんばりましょう。 |
|
|
|
|
|