Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


124 / 2272 ツリー ←次へ | 前へ→

【12931】ページフッターの合計 maiu 16/2/3(水) 17:02 質問[未読]
【12932】Re:ページフッターの合計 maiu 16/2/3(水) 17:05 質問[未読]
【12934】Re:ページフッターの合計 かるびの 16/2/5(金) 0:29 回答[未読]
【12935】funcKEISANを実験してみた かるびの 16/2/5(金) 1:47 発言[未読]
【12940】Re:ページフッターの合計 maiu 16/2/10(水) 11:57 お礼[未読]

【12931】ページフッターの合計
質問  maiu  - 16/2/3(水) 17:02 -

引用なし
パスワード
   いつも参考にさせてもらってます。

Access2003レポートで仕入れ等の計算を行っており

レポート部分--------------------------------------------------------
ページフッター
 [取引先] [仕入額]  [税]   [合計]
詳細
 [GYOSYA] [SIREGAKU] [ZEI]  [GOKEI]
 A社   \1,000   \80    \1,080 [=funcKEISAN](背景色:白)
 B社   \2,000   \160   \2,160 [=funcKEISAN](背景色:白)
 C社   \3,000   \240   \3,240 [=funcKEISAN](背景色:白)
 ・
 ・
ページフッター
      [仕入計]  [税計]  [合計計]
      (非連結) (非連結)  (非連結)

---------------------------------------------------------------------
このようにレポートを作っており
VBAで
VBA部分--------------------------------------------------------------
Dim SIRE As Long,ZEI As Long,GOKEI As Long
Function funcKEISAN()
  SIRE = SIRE + Me.SIRE
  ZEI = ZEI + Me.ZEI
  GOKEI = GOKEI + Me.GOKEI
End Function

Private Sub ページフッターセクション
  Me.仕入計 = SIRE
  Me.税計 = ZEI
  Me.合計計 = GOKEI
End Sub
---------------------------------------------------------------------

このようにしてページフッター毎に数値が加算される仕組みなのですが
例えばこれが10ページまであるとして
10ページ目だけを印刷した場合に10ページの部分のみの数値が計算されてしまいます。
当然ですが・・・
ページ指定した時でもそのページまでの分は計算される方法というのはあるでしょうか?
VBAの詳細セクションに単純にSIRE = SIRE + Me.SIRE を記述するとレポートの見た目的には
表示されてない次のレコードの分までの加算されており、数値がおかしくなってしまいます。
レポートに表示されてない分までVBA上で計算してしまうのは仕様ということをお聞きしました。

どうかよろしくお願い致します。

【12932】Re:ページフッターの合計
質問  maiu  - 16/2/3(水) 17:05 -

引用なし
パスワード
   レポート部分--------------------------------------------------------
ページフッター

上記の部分
 ○ページヘッダー
 ×ページフッター
 でした。訂正いたします。

【12934】Re:ページフッターの合計
回答  かるびの  - 16/2/5(金) 0:29 -

引用なし
パスワード
    レポートは苦手なので、以下のレスは外している可能性があります。


>Dim SIRE As Long,ZEI As Long,GOKEI As Long
>Function funcKEISAN()
>  SIRE = SIRE + Me.SIRE
>  ZEI = ZEI + Me.ZEI
>  GOKEI = GOKEI + Me.GOKEI
>End Function
>
>Private Sub ページフッターセクション
>  Me.仕入計 = SIRE
>  Me.税計 = ZEI
>  Me.合計計 = GOKEI
>End Sub
 このコードですが、かなりリスクのあるコードだと思います。
 というのは、ページフッタが印刷される時点において、
変数SIRE等の値が、当該ページにおける最終レコードまでの仕入額等の合計額となっている
保証がないからです。
 なので、これらのプロシージャを使って、仕入額等の合計を出すのは不安です。

>10ページ目だけを印刷した場合に10ページの部分のみの数値が計算されてしまいます。
とのことですが、この原因もこの不安が原因なのではないかと思います。
 
 もっとも、上記引用の事態については、本当にそうなのかなと思いますし、
実験してみたわけではないので、私の考えは外している可能性もあります。


 一応、私の不安を前提として考えを進めると、
仕入額の合計を出す方法として、他の方法を採用してみたらどうだろうかと思います。
 累計を使う方法です。


 その方法ですが

1 詳細セクションに集計用のテキストボックス(txt仕入れ累計)を設けます。

2 その集計実行プロパティを「全体」にし、その可視プロパティを「いいえ」にします
(ただし、テストのためには、可視プロパティは「はい」にしておいた方が確認しやすいです)。

3 詳細セクションの印刷時イベントで、txt仕入れ累計の値を、
ページフッタで「仕入計」を表示するテキストボックス(txt仕入れ計)に代入する
というコードを書きます。


 この方法については、簡単なサンプルを作り、1回だけテストしてみましたが、
御希望のことが実現できそうです。


 とはいえ、上記3で印刷時イベントを使うことについては、不安もあります。
 レポートのイベントのメカニズムはかなり複雑なため、本当に印刷時イベントでいいのだろうかと
思うからです。
 なお、イベントのメカニズムについては、

hatena chips 〜レポートのイベントの発生メカニズムの研究
ht tp://hatenachips.blog34.fc2.com/blog-entry-147.html

hatena chips 〜レポートのイベントの発生メカニズムの研究 その2
ht tp://hatenachips.blog34.fc2.com/blog-entry-148.html

が参考になります。
私の知る限り、これに関する唯一の文献であり、目を開かせてくれると思います。必見です。

 この文献を元に研究してみてください。

【12935】funcKEISANを実験してみた
発言  かるびの  - 16/2/5(金) 1:47 -

引用なし
パスワード
    次のコードを、サンプルを作って試してみました。

>Dim SIRE As Long,ZEI As Long,GOKEI As Long
>Function funcKEISAN()
>  SIRE = SIRE + Me.SIRE
>  ZEI = ZEI + Me.ZEI
>  GOKEI = GOKEI + Me.GOKEI
>End Function
>
>Private Sub ページフッターセクション
>  Me.仕入計 = SIRE
>  Me.税計 = ZEI
>  Me.合計計 = GOKEI
>End Sub

 その結果、
>10ページ目だけを印刷した場合に10ページの部分のみの数値が計算されてしまいます。
という事態には至らず、ページフッタの合計を表示するテキストボックスには、
1ページ目のレコードの合計額と10ページ目の合計額の併せた数値が表示されました。


 maiu さんにおける設定とは異なっているはずですので、
当方のサンプルの概要を記載しておきます。
 なお、オブジェクトの命名方法に統一性がなく、いつもならそんな命名方法はしませんが、
サンプルなので、その点は御容赦。


テーブル構成
 テーブル名 T仕入れ
 フィールド
  ID オートナンバー 主キー
  取引先 テキスト型
  仕入額 長整数型


レポート
 レポート名 R仕入れ_関数実験
 レコードソース T仕入れ
 配置したコントロール
  txtID    (詳細セクションに配置。コントロールソースは「ID」フィールド)
  txt取引先  (詳細セクションに配置。コントロールソースは「取引先」フィールド)
  txt仕入額  (詳細セクションに配置。コントロールソースは「仕入額」フィールド)
  txt関数   (詳細セクションに配置。コントロールソースは「=funcKEISAN()」)
  txtPageSum (ページフッタに配置。非連結コントロール。仕入額のそのページまでの合計を表示)          


標準モジュール
Dim lngSiire AS Long    ’パブリック変数

Function funcKEISAN() AS Long
  lngSiire = lngSiire + Reports!R仕入れ_関数実験!txt仕入額

  Debug.Print "ID:" & Reports!R仕入れ_関数実験!txtID.Value

  funcKEISAN = 9
End Function

Sub SrPageFooterSection()
  Reports!R仕入れ_クエリ実験!txtPageSum.Value = lngSiire
End Sub

        
「R仕入れ_関数実験」のモジュール 
Private Sub ページフッターセクション_Print(Cancel As Integer, PrintCount As Integer)
  Call SrPageFooterSection
  
  Debug.Print "PageFooterSection_Printイベント,Page=" & Me.Page
End Sub
 
 
 なお、上記における「Debug.Print」のコードですが、
「funcKEISAN」プロシージャや「ページフッターセクション_Print」プロシージャの
挙動を確認するためのコードです。
 当該ページまでの仕入額の合計表示には全く関係のないコードです。


 以上の構成の下で、
まず、R仕入れ_関数実験を開きます。レポートは全4ページからなっています。
 次に、アクセスのメニューの印刷コマンドを選択し、3ページ目だけを印刷します。

 すると、3ページ目のtxtPageSumには、
1ページ目のレコードの仕入額の合計と3ページ目の仕入額の合計を併せた額が表示されました。


 冒頭のコードについては、私の前レスでは、
> というのは、ページフッタが印刷される時点において、
>変数SIRE等の値が、当該ページにおける最終レコードまでの仕入額等の合計額となっている
>保証がないからです。
> なので、これらのプロシージャを使って、仕入額等の合計を出すのは不安です。
と書きましたが、
実験の結果、冒頭のコードでも、実用的にはいけそうだなと思いました。

 しかし、これは経験則に過ぎず、理論的なバックボーンを持ちません。
 つまり、txt関数のコントロールソースに設定した「=funcKEISAN()」が
どのタイミングで実行されるのか、必ずしもはっきりしません。
 そのため、不安払拭には至りません。

【12940】Re:ページフッターの合計
お礼  maiu  - 16/2/10(水) 11:57 -

引用なし
パスワード
   かるびの様

ご回答ありがとうございました。
おかげ様でなんとか希望する仕様に変更できました。
自分はレポート上に[=function] を配置して計算させるのが癖なのですが
その場合、連続して1ページから最終ページまで印刷する時は
思ったとおりの動きをしてくれるのですが
飛ばしてページを印刷する時は上手く動かないので今後は注意します。

ありがとうございました。

124 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078188
(SS)C-BOARD v3.8 is Free