レポートのいいところは、何はさておいても「グループ化したものを集計しつつ印刷できる」という点にあります。
Wordが印刷がきれいでも、こんな機能は備えてません。いや、いいんだけど・・別に。
せっかくグループ化したレポート、グループごとにページ番号も振りなおしてしまいましょう。
まずはレポートのイベントのおさらい。
レポートのイベントはセクションごとのフォーマットを行った後、セクションごとのPrint時イベント、そしてレポート全体のPageイベント、の順番で発生します。
各々のデータの情報に基づいて、コントロールの表示、非表示,計算を行わせるにはフォーマット時、配置されたデータと関係なくグラフィカルな要素を追加するにはプリント時、でした。
これからやろうとしている「グループ毎にページ番号を振りなおす」とき考えなくてはならないのは、ページを複数にまたがる詳細セクションを持つグループの場合、どこでグループ毎のページの総数を取得するか、です。
実はレポートはページヘッダーかページフッターに総ページを取得するためのプロパティ「Pages」をコントロールソースに持つテキストボックスがあると、必ず複数回、全体をフォーマットします。
最初にフォーマットするとき、レコード数がどのくらいで、各セクションが次のページに送られるかどうかを見極めるリハーサルを行います。総ページ数を取得できるのはこのリハーサルが存在するからです。
そして全部のデータを取得し、総ページ数が確定すると今度は印刷のための正式なフォーマットをします。 最初のフォーマット時にグループ毎のページ数を配列変数に蓄えておきます。グループの値が次へ行くときに、ページ数を初期化してグループ毎のページ数を取得させてあげます。
そして、正式なフォーマットの時にページヘッダーかページフッターに配置したテキストボックスに”グループ毎の各ページ/総ページ”を入れてあげます。
(テキストボックスを「印刷時拡張」にしていると、この高さが決まるのは「フォーマット時」の次に発生する「印刷時」イベントです。今自分なりに頑張ってみた限りでは「印刷時拡張」を指定すると今回ご紹介するプロシージャは動きません)
今回は簡単なサンプルではMIDIファイルをテーマ別フォルダに分けて管理している、という想定で、フォルダ毎の演奏時間を計算させ、レポートに出力します。
(えーっ、ヘンな名前のサンプル、って突っ込みはなしで)
グループ化はフォルダごと、グループフッターで演奏時間のトータル数の計算をさせ、グループフッターで改ページ(カレントセクションの後、ですね)
わかりやすいように詳細セクションは3行で改ページする設定にしました。(これはVBAからの制御です)
![]() |
デザインビュー

こんな感じです。
詳細セクションのフォーマット時と、ページフッターのフォーマット時にイベントが分かれるので、両方で使う「グループごとのページ数」を格納する配列変数をクラスモジュールの宣言セクションで宣言します。
Option Explicit
Dim Gpage() As Integer
Dim g As Integer
あとはページ数を取得して、書き込むだけ。
Private Sub グループフッター1_Format(Cancel As Integer, FormatCount As Integer)
If FormatCount = 1 Then
If Pages = 0 Then
ReDim Preserve Gpage(g)
Gpage(g) = Page
End If
g = g + 1 '新しい変数の領域確保
Page = 0
End If
End Sub
Private Sub ページヘッダーセクション_Format(Cancel As Integer, FormatCount
As Integer)
If Pages > 0 Then Me.txtPage = Page & "/" & Gpage(g)
End Sub
レポートヘッダーでg=0としてあげると完璧です。
今回は配列を動的に変更する方法を使いました。Redim Preserveしたのは、変数の宣言セクションで余計なメモリ確保をしたくなかったからです。
もうひとつ、必ずページヘッダーかフッターに「pages」をコントロールソースにしたテキストボックスの配置を忘れないでください。不可視にすることで邪魔にはなりません。
実は演算コントロールなら何でもOKかも、と思ったのですが・・やっぱりPagesでないとだめでした。