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

グループ毎に Page/Pages 形式のページ数を表示する

Access掲示板の FAQ TOP 10 に入るであろう、レポートで、グループ毎に Page/Pages 形式のページ数を表示する方法を紹介します。

MS サポート技術情報 で紹介されている方法がよく知られていますが、これは、コードが長くかなり難解な方法になっています。一時テーブルも使うのでデータペースファイルの肥大化も気になります。

RptPagePages.png

難易度:

概要

MS サポート技術情報 では、

ページ番号と、Microsoft Access のレポートにグループごとに合計ページ数をリセットする方法

で紹介されています。機械翻訳でわかりづらいので、こちらの方が解りやすいかも。

[AC97]レポートでグループ毎にPage/Pages形式のページ番号をつける方法

原理は、Pages を参照するテキストボックスがあると総ページ数をカウントするために、一端、Formatイベントのみ最終ページまで発生させています。その後、また先頭に戻って Format, Print を発生させて実際に出力しています。

Accessのこの動作を利用して、最初のダミーのスキャンの時に、テーブルにグループ毎の総ページ数を記録しておこうというのが MS サポート技術情報 の方法です。

しかし、レポートをプレビュー、印刷するたびに、テーブルにデータを書き込んだり、削除したりを繰り返すのは、無駄だし、MDBファイルの肥大化をまねきます。出来る限り不必要なワークテーブルは使いたくないというのが hatena のポリシーです。

テーブルの代わりに配列にグループ毎の総ページ数を格納するという方法を、いままで各掲示板で紹介してきたが、YU-TANG さんの
ページヘッダーでグループの最終ページかどうかを知る方法
で、Dictionary オブジェクトを使う方法が紹介されているのをみて、これを参考に、配列に代わりに、Dictionary オブジェクトに格納する方法を採用してコーディングしてみました。

サンプル作成

Page/Pagesを表示するテキストボックスをページフッターに配置して、

プロパティ設定
プロパティ設定値
名前txtGrpPages
コントロールソース設定しない

レポート上のどこでもいいので Pages を参照するテキストボックスを配置します。

プロパティ設定
プロパティ設定値
コントロールソース=[Pages]
可視いいえ

また、グループ化しているフィールド名は、分類 と仮定します。

レポートのモジュールに下記のように記述します。

ページヘッダーに表示する場合

2012/09/01 追記

単純に上記の txtGrpPages テキストボックスをページヘッダーに移動して、ページヘッダーのイベントで代入すればようさそうですが、それだけではダメです。

イベントの発生順として、[ページヘッダー]→([グループヘッダー])→[詳細セクション]→([グループフッター])→[ページフッター]となりますので、ページヘッダーに表示する場合、グループヘッダーのイベントでページ数の初期化をしては手遅れです。グループフッターのフォーマット時で、Me.Page = 0 と初期化する必要があります。ページヘッダーで、グループフィールドの値が変化したかどうかをチェックしてMe.Page = 1 と初期化するよう変更しました。

レポートのモジュール

2015.06.24 追記: グループフッターで初期化する方法だと、グループ最終ページにグループヘッダーだけのときグループページ数が正しくないので、ページヘッダーで初期化する方法に変更しました。

サンプルファイルが下記からダウンロードできます。
RptPagePages_07.zip (Access 2007-2010 形式 - 46kb)
RptPagePages.zip (Access 2002-2003 形式 - 41kb)
RptPagePages_2k.zip (Access 2000 形式 - 41kb)

拍手する

10 Comments

ちーまげ says..."グループが複数の場合"

hatenaさん、こんにちは。
ちょうど2年前にAccess Clubでアドバイスしていただきhatena信者になったちーまげと申します。

グループ毎のページ数をPage/Pages形式で表示する方法を使わせていただいていますが、グループが複数(注文書を作成していまして1.注文先毎 2.納入先毎)の場合に、自分ではいろいろ工夫してみたつもりなのですがうまくいきません。

コメントなんで、こんな漠然とした質問しか書けませんが、こーいう質問でhatenaさんにコンタクトしてもよろしいんでしょうか?

2011.12.08 15:02 | URL | #oinxtzb2 [edit]
hatena says..."re: グループが複数の場合"

グループフッターのフォーマット時で Dictionary に代入するときに複数グループのキーを組み合わせたインデックスにすればどうでしょうか。

Private Sub グループフッター1_Format(Cancel As Integer, FormatCount As Integer)
  If Me.Pages = 0 Then
    d(Me.注文先CD.Value & ";" & Me.納入先CD.Value) = Me.Page
  End If
End Sub

(キーフィールド名は実際のものに変更してください。)


これでうまく行かない場合は、下記の掲示板で続けてもらうといいかと思います。

http://hatena-access.progoo.com/bbs/
hatena の Microsoft Access 掲示板

2011.12.08 16:19 | URL | #5uE6dEgY [edit]
ちーまげ says..."re:グループが複数の場合"

hatenaさん、ありがとうございます(T_T)

実は同じようなことをやってみたのですが、セミコロンで接続してませんでした。(・Θ・;)

今、サクッと試してみたのですが、イジリ倒したせいなのか、なんか壊れちゃったみたいで(グループフッター:納入先CDなのに『納入先CDフィールドがみつかりません。』とか言い出されちゃいました)実行時エラーになってしまいました。

今日はもうヘロヘロになってしまいましたので、明日リトライしたいと思います。

結果はまたご報告致します。
ありがとうございました!!

2011.12.08 17:59 | URL | #oinxtzb2 [edit]
hatena says..."re: 『納入先CDフィールドがみつかりません。』"

レポート上のどこかに、納入先CD と連結したテキストボックスがないと、そのようなエラーになります(可視はいいえでもOK)。
フォームの場合は、レコードソースにあるフィールドなら参照できますが、レポートの場合はコントロールとして配置してある必要があります。

2011.12.08 19:26 | URL | #5uE6dEgY [edit]
ちーまげ says..."グループが複数の場合のPage/Pages形式できました!"

まったくhatenaさんのご指摘どおりでした。

元々レポート上に表示していた「納入先CD」フィールドにテキストを追加したせいでコントロールが変わってしまい、結果的に「納入先CD」フィールドがレポート上に存在しない状態になっていました。

そもそもレポートもフォームと同じ感覚で作成していましたので、hatenaさんに指摘された概念がまったくありませんでした。
今さらながら目からウロコです。

そしてhatenaさんのアドバイスのおかげで、複数のグループでのPage/Pages形式できました!
何日も試行錯誤を繰り返した末の完成なので、ウレシくて何度もプレビューしちゃいました。

今回も本当にありがとうございました。
感謝感謝です!!

2011.12.09 14:46 | URL | #oinxtzb2 [edit]
マサじい says..."罫線を最後まで印刷し、グループごとのページ設定"

hatenaさん、こんにちは。
以前、罫線を最後まで印刷する方法を参考にさせていただきました。今度、このレポートを内容によってグループごとに総ページ番号とそれぞれのページ番号をつけることになりました。
そこでネットから探してみると、またもhatenaさんがわかりやすいデータをアップして下さっています!テスト的に作ってみるとうまく表示されたのですが、罫線のレポートと組み合わせるとすべて"1/1"と表示されてしまいます。どうやらグループヘッダーの繰り返しセクションを「はい」に設定するとダメになります。
これを回避する方法をおしえていただけないでしょうか。

2012.08.15 13:47 | URL | #LU0ICOqE [edit]
hatena says..."re: 罫線を最後まで印刷し、グループごとのページ設定"

グループヘッダーでグループページ数をリセットしてますので繰り返し表示させるとそうなりますね。

現在のグループの上位に、同じフィールドでグループを作成してグループヘッダーを表示させて、そこのフォーマット時のイベントプロシージャに、現在のグループヘッダーのコードを移動させてください。

新しく作成したヘッダーの高さを 0cm にしておけばレイアウトに影響は受けません。

2012.08.15 16:44 | URL | #5uE6dEgY [edit]
マサじい says..."できました!"

hatenaさん、早速のご連絡をありがとうございます。
今日は割と暇なので、普段なら仕事終わりで行う作業を昼間やっておりました。
おかげで一歩前へ進むことができました。
ありがとうございます!!

次の壁も立ちはだかっておりますが、まずは自力で頑張ってみます。
本当にありがとうございました。

2012.08.15 17:22 | URL | #LU0ICOqE [edit]
いぷ says..."1ページ目と最後のページ以外のグループページ数が表示されません。"

お世話になります。今回初めて拝見させて頂いた、いぷと申します。

「グループ毎にPage/Pages形式を表示する」を実践していますが、
うまくいきません。どううまくいかないかは、
「1ページ目と最後のページは、Page/Pagesで表示されるのに、
途中のページは、Page/ のみとなり、Pagesが表示されません。」
というものです。
表示しているセクションは、レポートのヘッダ、フッタと、ページの
ヘッダ、フッタと、グループのヘッダ、フッタと、詳細です。

ソースにあるフォーマットする関数に合わせて、各セクションの
フォーマット時=イベントプロシージャに設定してます。
また、レポートフッタのプロパティで、改ページをセクションの後に
設定しております。

こんなところですが、レポートの表示および印刷すると、
「1/2、2/、1/ ・・・」となってしまいます。

なにかアドバイスがありましたらご教授いただけないでしょうか。
少々困り果てております・・・

2014.01.17 14:06 | URL | #mQop/nM. [edit]
hatena says...""

解説通りに作成すればできるはずです。

とりあえず思いつく間違いの可能性は、
コード中の「分類」を、実際のグループ化しているフィールド名になっていないことぐらいかな。

どうしても間違いが分からない場合は、このページの上部のメニューバーの「BBS」をクリックして移動する掲示板で質問してください。

2014.01.18 01:44 | URL | #5uE6dEgY [edit]

Leave a reply






Trackbacks

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