Accessレポートで最終ページにのみ合計を表示する方法|ページフッター制御

Accessのレポートで帳票を作成する時に、

明細を一覧表示してページフッターに合計金額を表示させる

といったことを行いたいケースってありませんか?

工事現場のような管理をAccessで行っているようなケースを例にすると、現場ごとにかかった経費を現場台帳として一覧表示して、最終ページにその合計金額を表示するような帳票のイメージです。

このようなレポートをAccessで作成する場合、合計金額の表示はページフッター部分に定義しますが、単純に設定するとすべてのページに合計金額が表示されるようになります。

Accessレポートの金額合計表示(1枚目)
1ページ目にも合計が表示されてしまう
Accessレポートの金額合計表示(2枚目)
2ページ目(最終ページ)

これだと合計金額が全ページに出力されてしまいますので、人によってはミスリードさせてしまう発生する可能性がありイマイチです。(例えば、1ページ目に表示されている金額を合計してもページフッタに表示されている合計値とは合わないので、「違うんだけど・・・」という指摘につながる可能性もあります)

どうせなら、明細が複数ページにまたがるような場合は次のように合計金額は最終ページにのみ表示させるようにしたいですよね。

Accessレポートの金額合計は1ページ目は表示しない
1ページ目
Accessレポートの金額合計は最終ページのみ表示
2ページ目(最終ページ)

これなら、ミスリードもなくなります。

そこで今回は、Accessのレポートで最終ページにのみ合計値を表示する方法をご紹介します。

この記事を見れば、ページフッターをどう制御すればこのようなに最終ページにのみ合計を表示させることができるようになるのかが分かるようになります。

ページフッターへの合計表示の設定方法

まず、Accessのレポートでページフッターに合計を表示する方法について説明します。

サンプルでは次のように、ページフッター内にテキストボックスを用意し、ここで関数を使用して合計値を算出するようにしています。

ページフッターの合計部分

データは次のようにDSUM関数を用いて算出しています。

ページフッターの合計欄の計算式

=DSum("請負金額",[RecordSource],[Filter])

この数式では、

  1. 『第2引数:RecordSource(レコードソース)』に設定しているテーブルorビュー内を
  2. 『第3引数:Filter(フィルター)』に設定している条件で抽出し
  3. 『第1引数:"請負金額"カラム』の値を合計した数を返す

ということを行っています。

レポート表示時は大抵、条件指定(フィルタ)された形で出力しますので、DSUM関数ではこのような引数を設定することで、フィルター条件が変えられても動的に値を抽出できるようにしています。

DSUM関数の補足

この例では、DSUM関数の

  • 第2引数に[RecordSource]
  • 第3引数に[Filter]

を定義していますが、それぞれ次の意味を表しています。

RecordSouceとFilterの意味

次のようにそれぞれを文字で設定しても問題ありませんが、固定でテーブルorビュー名とフィルター条件を指定するのに比べて簡単に合計値を出せますので、この方法を覚えておくと便利です。

=DSum("請負金額","テーブルXXX","現場NO > 20")

DSUM関数を使わずに、「=SUM(請負金額)」でも表示は可能ですが、ページフッタの制約やSUM関数の制約、合計値に対してさらに計算をかけたいような場合を考慮すると、DSUM関数で合計を出しておいたほうが後々良くなるケースも多いです。

特に意識しないでページフッタを表示した場合

ページフッターに先述の金額を合計するテキストボックスを追加して表示した場合、次のように全ページに金額が表示されるようになります。

フッターへの累計の表示

累計なので、最後のページにのみ表示させたいですよね。

次からその方法をご紹介します。

ページフッタ制御の準備

VBAを用いて最終ページのみページフッターを表示させることができます。

ページフッター内のオブジェクトの名前の確認

まず、ページフッター部分の中で、最終ページのみ表示したいオブジェクトの名前を確認します。

次のサンプルでは、オブジェクトが4つ配置されています。

  • 直線(フッター欄用)
  • ラベル("累計"の文字用)
  • テキストボックス(合計金額)
  • テキストボックス(表示ページ数)

そのため、この4つのオブジェクトについて、名称を確認します。(ここで確認した名称は、後述するVBAにて使用します)

参考:オブジェクトの名前の確認方法

対象のオブジェクトをクリックするとプロパティシートが画面右側に表示されますので、その中の「名前」部分がオブジェクト名です。

Accessレポート内のオブジェクト名確認方法

もしプロパティシートが表示されない場合、リボンのデザイン→プロパティシートをクリックすると表示されます。

Accessレポートでプロパティシートを表示する方法

ページフッター内で最終ページのみ表示させるオブジェクトを決める

サンプルの場合、オブジェクト名は次のようになっていました。

  • 直線(フッター欄用):lineFooter
  • ラベル("累計"の文字用):lbl請求金額_合計
  • テキストボックス(合計金額):txt請求金額_合計
  • テキストボックス(表示ページ数):txtPage

この中から、最終ページのみ表示させるオブジェクトを決めます。

サンプルでは金額部分のみを最終ページの表示させたいため、

  • ラベル("累計"の文字用):lbl請求金額_合計
  • テキストボックス(合計金額):txt請求金額_合計
  • 直線(フッター欄用):lineFooter

について最終ページでのみ表示するような制御をVBAで入れていきます。

※直線についても、ついでに最終ページのみ表示させるようにします。

最終ページのみページフッターを表示させたい場合

ページヘッダーのフォーマット時イベントに表示制御を入れる

では、VBAでどのように処理を入れるかというと、

ページヘッダーのフォーマット時イベント

に処理を入れます。

注意

ページフッターに対して表示する・しないの制御を入れようとしているため、「ページフッターのイベント」に対して処理を入れがちですが、ページヘッダーに対して入れます。

間違いやすいため注意しましょう。

まず、レポートをデザインビューで開き、ページヘッダー部分をクリックします。

Accessレポート内のページヘッダー部分

すると、ページヘッダーのプロパティシートが表示されますので、イベントタブ→フォーマット時のリストの▽ボタンをクリックし、[イベントプロシージャ]を選択します。

イベントプロシージャを選択

[イベントプロシージャ] を選択後に…ボタンをクリックします。

イベントのVBA開くボタンをクリック

するとVBA(Microsft Visual Basic for Applications)エディタが表示されます。

VBAのページヘッダー Formatイベント関数

赤枠で囲った関数内に、フッターを制御するコードを入れます。

フッター全体を最終ページのみ表示

フッター自体を最終ページのみ表示させる場合、次のようなVBAコードを入れます。

Private Sub ページヘッダー_Format(Cancel As Integer, FormatCount As Integer)
    '最終ページのみページフッターを表示する
    If Page = Pages Then
        Me.ページフッター.Visible = True
    Else
        Me.ページフッター.Visible = False
    End If
End Sub

Page変数が処理中のページ、Pagesが全体ページ数を表しています。

Page=Pagesの場合、つまり最終ページの場合はページフッターをVisible = Trueで表示し、それ以外の場合はVisible = Falseで非表示としています。

このコードを入れてレポートを表示すると次のようになります。

最終ページのみページフッターを表示するVBA

ページフッター自体が最終ページのみに表示されますので、その他のページではフッターがなくなり、結果的に累計も表示されなくなります。

「最終ページにのみ合計金額を表示する」という目的はこれで達成できますが、フッターにページ数を表示しているような場合、ページ数も見えなくなるという懸念も発生します。この対応を利用する場合、ページ数はページフッターではなくページヘッダーなどに表示させるようにしたほうが良いでしょう。

フッター内の特定オブジェクトを最終ページのみ表示

先述方法ではフッター自体が非表示となり見えなくなりますので、サンプルのようにフッターに背景色をつけているような場合、最終ページだけ背景色ありのレポートとなってしまいます。そのため、ページ全体で統一感が無くなり、最終ページのみ色付きフッターが出てくるため違和感を感じるかもしれません。

これを回避するには、次のようなVBAコードに変えることで対応可能です。

Private Sub ページヘッダー_Format(Cancel As Integer, FormatCount As Integer)
    '最終ページのみページフッター内のオブジェクトを表示する
    If Page = Pages Then
        Me.lineFooter.Visible = True
        lbl請求金額_合計.Visible = True
        Me.txt請求金額_合計.Visible = True
    Else
        Me.lineFooter.Visible = False
        lbl請求金額_合計.Visible = False
        Me.txt請求金額_合計.Visible = False
    End If
End Sub

行っている内容は「ページフッター全体を非表示にする」とほぼ同じです。非表示する項目を

ページフッター

ではなく

ページフッター内のオブジェクト(直線、ラベル、合計金額用テキストボックス)

としています。

このコードを入れてレポートを表示すると次のようになります。

最終ページのみページフッター内オブジェクトを表示するVBA

ページフッター内のオブジェクトに対してのみ制御をしているため、ページフッタの背景やページ数は全ページで表示されるようになり、最終ページにのみ合計金額が表示されるようになりました。

レポートで細かくページフッターを制御したい場合は、こっちの方法のほうがいいかもしれませんね。

まとめ

VBAを使用して、Accessレポートのページフッターの表示を最終行のみ表示させる方法をご紹介しました。今回紹介した方法を応用することで、最終ページのみ、最初のページのみ、特定のページのみ表示させるといったことへの応用も可能になるかと思います。

また、今回紹介した方法以外でも、グループ化することで対応できる場合もありますので、グループ化で表示する方法もうまく使いながら、Accessレポートを意図したとおりに出力してみましょう。

また、この記事に書いたようなちょっとした困ったことでも、自分に経験や知識が足りないために対応できなかったり、時間をかけたわりに全然進まなかったりと、思うようにいかない事ってありますよね。そんなときは専門家に相談したり解決してもらったりする方法もありますので、一人で悩まず対処してみましょう。

Twitterでフォローしよう