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

レポートのイベントの発生メカニズムの研究

レポートの一般機能では実現が難しい複雑に累計計算とか、レイアウトの制御をレポートのイベント内でVBAで処理したい場合があります。しかし、レポートのイベント発生順序、メカニズムを理解していないと、思い通りにはいかなかったり、思わぬバグを抱え込むことになります。しかし、レポートのイベント発生メカニズムは非常に複雑で、また、目に見えないので確認しづらく、理解するのはなかなか難しいです。

このブログでは応用的な Tips が多いのですが、今回はレポートのイベントについての基本的な理解を深めるために、実験しながらイベント発生メカニズムを探求してみます。

RptEvent.png

難易度:

まずは、レポートでのイベントの発生順序をどのように確認するかですが、各イベントにMsgBoxを埋め込んで確認する方法もありますがレコード数に応じて非常に回数多く発生するのでかなりうっとうしいです。そこで、Debug.Printでイミディエイトウィンドウに出力して確認する方法がいいでしょう。。

まずは、なるべくシンプルなレポートから実験していきましょう。

レコードソースのテーブル

テーブル1
ID F1
1 A
2 B
3 C

・ 



・ 


24 X
25 Y
26 Z

これをレコードソースにしてレポートを作成します。ページヘッダー/フッター、レポートヘッダー/フッターを表示させて、詳細セクションには、フィールドをテキストボックスとして配置します。各セクションのイベントに下記のようにデバッグコードを埋め込みます。

レポートモジュール

これで、レポートをプレビューして、Ctrl+Gでイミディエイトウィンドウを表示させるとそこに発生したイベントが順に表示されてます。下記はプレビューで1ページ目を表示させた場合の結果です。

Page:         ID:           セクション    イベント:     Format(Print)Count:
 1             1            Rヘッダー     Format         1 
 1             1            Rヘッダー     Print          1 
 1             1            Pヘッダー     Format         1 
 1             1            Pヘッダー     Print          1 
 1             1            詳細          Format         1 
 1             1            詳細          Print          1 
 1             2            詳細          Format         1 
 1             2            詳細          Print          1 
 1             3            詳細          Format         1 
 1             3            詳細          Print          1 
 1             4            詳細          Format         1 
 1             4            詳細          Print          1 
 1             5            詳細          Format         1 
 1             5            詳細          Print          1 
 1             6            詳細          Format         1 
 1             6            詳細          Print          1 
 1             7            詳細          Format         1 
 1             7            詳細          Print          1 
 1             8            詳細          Format         1 
 1             8            詳細          Print          1 
 1             9            詳細          Format         1 
 1             9            詳細          Print          1 
 1             10           詳細          Format         1 
 1             10           詳細          Print          1 
 1             11           詳細          Format         1 
 1             11           詳細          Print          1 
 1             12           詳細          Format         1
 1             11           Pフッター     Format         1 
 1             11           Pフッター     Print          1 

レポートヘッダー→ページヘッダー→詳細(レコード移動しながら繰り返し)→ページフッター という順で フォーマット、印刷 イベントが発生しいるのが分かります。ここで、次ページへページ移動してみます。

 2             12           Pヘッダー     Format         1 
 2             12           Pヘッダー     Print          1 
 2             12           詳細          Format         2
 2             12           詳細          Print          1 
 2             13           詳細          Format         1 
 2             13           詳細          Print          1 
 2             14           詳細          Format         1 
 2             14           詳細          Print          1 
 2             15           詳細          Format         1 
 2             15           詳細          Print          1 
 2             16           詳細          Format         1 
 2             16           詳細          Print          1 
 2             17           詳細          Format         1 
 2             17           詳細          Print          1 
 2             18           詳細          Format         1 
 2             18           詳細          Print          1 
 2             19           詳細          Format         1 
 2             19           詳細          Print          1 
 2             20           詳細          Format         1 
 2             20           詳細          Print          1 
 2             21           詳細          Format         1 
 2             21           詳細          Print          1 
 2             22           詳細          Format         1 
 2             22           詳細          Print          1 
 2             23           詳細          Format         1 
 2             23           詳細          Print          1 
 2             24           詳細          Format         1 
 2             24           詳細          Print          1 
 2             24           Pフッター     Format         1 
 2             24           Pフッター     Print          1 

ここで赤字の部分に注目してください。このレポートでは、1ページ目は、IDが11までのレコードが表示されてます。しかし、1ページ目で ID:12 のフォーマット時イベントが発生してます。ただし、印刷時イベントは発生してません。2ページ目でページヘッダーのイベントの後で、もう一度、ID:12 のフォーマット時イベントが発生して、その後、印刷時イベントも発生してます。

何回目のフォーマット時イベントかは、FormatCount 引数で区別が付きます。

このことから次のような仕組みだと推測できます。

フォーマット時イベントでは、印刷する領域、位置を計算して決定する。
印刷領域がページ内に収まれば、印刷時イベントで実際に描画、出力する。
収まらなければ、印刷時イベントは発生させずに、ページフッターイベントに移行する。
改ページしてから、ページヘッダーイベントの後で2回目のフォーマット時イベントを発生させて、印刷時イベントへ移行する。

累計計算をしたいときなど、フォーマット時イベントでVBAで加算していくなどいうコードをたまに見かけますが、上記のようにフォーマット時イベントが複数回発生する場合があるということを理解してないと、期待した結果がでずにとまどうことになります。では、印刷時イベントで加算していけばいいかというとそうは問屋がおろしません。

印刷ダイアログで「ページ指定」で「2ページから、3ページまで」と指定して印刷した結果が下記です。(用紙、インクがもったいないので、プリンタドライバの「印刷時プレビュー」をオンにしておいて実験しましょう)

Page:         ID:           セクション    イベント:     Format(Print)Count:
 1             1            Rヘッダー     Format         1 
 1             1            Pヘッダー     Format         1 
 1             1            詳細          Format         1 
 1             2            詳細          Format         1 
 1             3            詳細          Format         1 
 1             4            詳細          Format         1 
 1             5            詳細          Format         1 
 1             6            詳細          Format         1 
 1             7            詳細          Format         1 
 1             8            詳細          Format         1 
 1             9            詳細          Format         1 
 1             10           詳細          Format         1 
 1             11           詳細          Format         1 
 1             12           詳細          Format         1 
 1             11           Pフッター     Format         1 
 2             12           Pヘッダー     Format         1 
 2             12           Pヘッダー     Print          1 
 2             12           詳細          Format         2 
 2             12           詳細          Print          1 
 2             13           詳細          Format         1 
 2             13           詳細          Print          1 
 2             14           詳細          Format         1 
 2             14           詳細          Print          1 
 2             15           詳細          Format         1 
 2             15           詳細          Print          1 
 2             16           詳細          Format         1 
 2             16           詳細          Print          1 
 2             17           詳細          Format         1 
 2             17           詳細          Print          1 
 2             18           詳細          Format         1 
 2             18           詳細          Print          1 
 2             19           詳細          Format         1 
 2             19           詳細          Print          1 
 2             20           詳細          Format         1 
 2             20           詳細          Print          1 
 2             21           詳細          Format         1 
 2             21           詳細          Print          1 
 2             22           詳細          Format         1 
 2             22           詳細          Print          1 
 2             23           詳細          Format         1 
 2             23           詳細          Print          1 
 2             24           詳細          Format         1 
 2             23           Pフッター     Format         1 
 2             23           Pフッター     Print          1 
 3             24           Pヘッダー     Format         1 
 3             24           Pヘッダー     Print          1 
 3             24           詳細          Format         2 
 3             24           詳細          Print          1 
 3             25           詳細          Format         1 
 3             25           詳細          Print          1 
 3             26           詳細          Format         1 
 3             26           詳細          Print          1 
 3             26           Rフッター     Format         1 
 3             26           Pフッター     Format         1 
 3             26           Pフッター     Print          1 

印刷しない1ページ目ではフォーマット時イベントだけで、印刷時イベントが発生してません。ということで印刷時イベントも累計計算には使えません。

単純な累計ならテキストボックスの「集計実行」プロパティで設定するのが楽ですし、上記のような問題も発生しません。複雑な累計処理で「集計実行」プロパティでは対応できないという場合は、フォーマット時イベントで、FormatCount引数が1の時だけ実行するようなコードを記述するようにします。(後述しますが、実はこれでも設定によっては不具合が出る場合があります。)

まだまだ、続きますが、長くなりましたので、続きは、次の記事投稿で。

サンプルファイルが下記からダウンロードできます。
RptEvent1_07.zip (Access 2007-2010 形式 - 19kb)
RptEvent1.zip (Access 2002-2003 形式 - 30kb)
RptEvent1_2k.zip (Access 2000 形式 - 28kb)

拍手する

Leave a reply






Trackbacks

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