Access Tips by pPoy

  
トップへ←Top    QueryへQuery  FormへForm  ReportへReport  Module(Sub)へSub  Module(Function)へFunction  ExcelへExcel  Etc.へEtc.  Word連携へWord

Report レポートのページフッターへグループ毎の頁番号設定 New
 (ADO) (Ac2000,Ac2002)
Access でレポートを印刷する時、ページ番号は Page/Pages 形式で振るのが一般的です。

ところが、グループ毎にページ番号を振りたいときがあります。これは Access の標準の機能にはありません。
以下は、グループ毎のページ番号を、ADO を使ってページフッターに表示する方法です。

≪準備≫

この例では、Access 2002 に付属しているサンプルデータベースの Northwind.mdb 内の
「商品」 テーブルを レポートのデータソースとして使用しています。

ただし、Northwind.mdb の 「商品」 テーブルは、それ自身で完結したテーブルではなく、
別のテーブルとリンクしています。
商品テーブルに表示された情報をそのまま単独で使用するために、一旦 「商品」 テーブルを
Excel ファイルとして出力してから、これをインポートして使用しています。

ただし通常のエクスポートでは、「商品区分」 等は名称ではなくコードとなってしまいますので、
以下の方法で出力します。
  1. まず、Northwind.mdb の 「商品」 テーブルを開き、プレビュー画面を表示します。

  2. その状態で、ツールバーから、「Office Links」 の 「Excel に出力」を選択します。
    Office Links

  3. ユーザの 「My Documents」 フォルダに 「商品.xls」 が作成され、Excel が開きます。
    「仕入先」 と 「商品区分」 に名称が表示されていることを確認し、Excel を終了します。
    商品.xls

  4. ここで作られた 「商品.xls」 を Access にインポートし、「商品」 テーブルの名前で保存します。
≪1.≫

レポートでグループ化するフィールド名を、「商品区分」 とします。
このグループ別ページ番号格納用の、テーブルを新規に作成します。
  1. テーブル名は、「T_Grp_Page」 とします。

  2. テーブルの構造は以下のように設定します。
    T_Grp_Page

    1. 「商品区分」 フィールドを 「テキスト」 型で設定し、サイズは 50 程度とします。
    2. 「商品区分」 フィールドを 「主キー」 に設定します。
      ※ 今回の例では、商品テーブルの、「商品区分」 でグループ化し、
      商品区分単位で改ページを設定するためです。
    3. 「頁番号」 フィールドは、「長整数」 型で設定します。
テーブル名、フィールド名は、間違えないでください。
≪2.≫

レポートを一覧表形式で作成します。
  1. レポートウィザードで 「商品」 テーブルを指定します。
  2. レポートに表示するフィールドには必ず 「商品区分」 を含めてください。
  3. グループレベルで、「商品区分」 を指定します。
  4. 並び替えや集計のオプションは、必要に応じて設定します。
  5. 印刷の向きを横に指定します。
  6. スタイルは 「報告書」 とします。
  7. 最後に、レポート名を 「rpt_商品」 として、完了を押します。
  8. 以下のようにプレビューされます。
    rpt_商品
  9. このままではグループ化のテストには、少々行間が狭すぎますので、
    詳細行の 行高さ 0.5 cm → 1 cm 程度に変更します。
≪3.≫

次に、グループフッターの設定をします。
商品区分フッター」 のプロパティを表示し、「改ページ」 を
カレントセクションの後」 に変更します。
商品区分フッター
≪4.≫

レポートにコードを挿入します。
VBE 画面の宣言セクションに、以下のコードを貼り付けてください。
Option Compare Database
Option Explicit

'ADOを使ってグループ毎にページ番号を振る
'2006/12/09 pPoy
Dim cnn As New ADODB.Connection
Dim GrPages As New ADODB.Recordset
≪5.≫

続けて、新規プロシージャを追加します。
以下のコードを宣言セクションの下に貼り付けてください。
Function GetGrPages()
'頁番号表示用関数
'グループ化対象は、「商品区分」なので注意! 2006/12/09 pPoy
    GrPages.Seek Me![商品区分], adSeekFirstEQ
    If GrPages.EOF = False Then
            GetGrPages = Me.Page & "/" & GrPages![頁番号]
    End If
End Function
≪6.≫

レポートの 「開く時」 イベントに下記のイベントプロシージャを作成してください。
Private Sub Report_Open(Cancel As Integer)
'予め古い頁数の情報を削除し、インデックスを設定
'グループ頁番号格納用テーブル名は、「T_Grp_Page」 2006/12/09
    Set cnn = CurrentProject.Connection
    cnn.Execute "DELETE * FROM [T_Grp_Page]"
    Set GrPages = New ADODB.Recordset
    GrPages.Open "T_Grp_Page", cnn, _
        adOpenKeyset, adLockOptimistic, adCmdTableDirect
    GrPages.Index = "PrimaryKey"
End Sub
≪7.≫

商品区分 ヘッダー」 セクションの 「フォーマット時」 イベントに下記のイベントプロシージャを作成してください。
Private Sub グループヘッダー0_Format(Cancel As Integer, _
FormatCount As Integer)
'ページ番号の初期化
'グループ化用の「商品区分」ヘッダーに設定
    Me.Page = 1
End Sub
≪8.≫

ページ フッター」 セクションの 「フォーマット時」 イベントに下記のイベントプロシージャを作成してください。
Private Sub ページフッターセクション_Format(Cancel As Integer, _
FormatCount As Integer)
'頁番号格納用テーブルに、グループ毎の頁数を入力
'グループ化フィールド名は、「商品区分」なので注意 2006/12/09
    GrPages.Seek Me![商品区分], adSeekFirstEQ
    If GrPages.EOF Then
        GrPages.AddNew
        GrPages![商品区分] = Me![商品区分]
        GrPages![頁番号] = Me.Page
        GrPages.Update
    Else
        If GrPages![頁番号] < Me.Page Then
            GrPages![頁番号] = Me.Page
            GrPages.Update
        End If
    End If
End Sub
≪9.≫

ページ フッター」 セクションに下記の2つのテキストボックスを作成してください。
  • テキストボックス 1 (ここに、グループ毎の頁数を表示します)
     コントロールソース: =GetGrPages()
  • テキストボックス 2 (コレは、非表示に設定します)
     コントロールソース: =Pages
≪10.≫

最後に 「レポート フッター」 セクションは高さを 0 にして、表示しないようにします。
(これがあると、最後のページ数が余分に設定される為)
以下が出来上がったデザイン画面です。

デザイン画面
≪11.≫

全ての設定を保存してからプレビューします。
無事に頁番号が振られています。(ちょっと見にくいですが商品名の下にあります)
プレビュー
≪12.≫

ページ番号管理用テーブル 「T_Grp_Page」 の中身は 以下のようになっています。

T_Grp_Page

これは出力例です。
中身はページ数やグループの種類によって変わります。
≪注意≫
  • これは以前に UP したものを、より分かりやすく、画像を増やして再作成したものです。
    以前のものとは、グループ化するフィールド名や、グループページ番号格納用のテーブル名が異なっています。
    したがって、VBA で参照する名前も変更になっています。
    以前のものは、こちら に置いてあります。

  • ADOを使用しますので、Access97 では使用できません。 
    Access97 の場合は、こちら (オリジナルのままです)

  • これはページフッター以外では正しく動きません。

  • これは、以下のマイクロソフト技術情報を元に作成したものです。
    (より解り易く加工したつもりですが、それでも不明な点は本家?の方をどうぞ。)

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


この頁のTOPへTop
【念の為の注意書きです。】
このページ(下位ページ含む)の全ての物の無断転載を禁止いたします。又、当ページ(下位ページ含む)に記載されていることは、全て自己の責任において実行してください。

Copyright(C) pPoy 2006