Microsoft Access 掲示板

レポート作成、定価の表示 / 4

9 コメント
views
4 フォロー
4
hatena 2020/11/04 (水) 14:47:46 修正

簡単に実現できる方法を思いつきました。

各グループの小計はグループフッターセクションで表示しているとします。
それぞれのグループの小計を表示しているテキストボックス名を、
A小計、B小計 とします。

Bグループのフッターセクションのフォーマット時に下記のように記述します。

Private Sub グループフッター3_Format(Cancel As Integer, FormatCount As Integer)
    Cancel = (Me.A小計 = Me.B小計)
End Sub

要は、Aグループ内のBグループ数が1件ならA小計とB小計は同じになります。同じものを表示するのは無駄だということですよね。
同じなら、Cancel を True にしてそのセクションの出力をキャンセルしてます。

グループ内で集計テキストボックスを参照するとそのグループ内での集計値が取得できますので上記のコードでうまくいきます。

もし、マイナスの集計があり、たまたまA小計とB小計が同じになる可能性かあるなら、=Count(*) で件数を表示させるテキストボックスを配置しておいてそれを比較するようにすればいいでしょう。

通報 ...
  • 6
    hiroton 2020/11/05 (木) 08:27:04 修正 b95b2@f966d >> 4

    これすごいですねぇ。試してみたら確かにBグループのフッターのformatイベントでAグループのフッターの小計が取れました。Aグループのフッターのformatイベント入る前なのでどうかと思ってたんですが計算自体は終わってる上にちゃんと自分のグループの数値が取れるんですね

    テストデータ

    IDABn
    1A1
    2A10
    3B1
    4B10
    5C100
    6D1000
    7D10000
    8E1
    9E10

    レポートのグループ化の設定
    グループ化:A、フッターにテキストボックス[A小計](=Sum([n]))
    └グループ化:B、フッターにテキストボックス[B小計](=Sum([n]))

    テストコード

    Private Sub Aグループフッター_Format(Cancel As Integer, FormatCount As Integer)
        Debug.Print "AFooter", Me!A小計
    End Sub
    
    Private Sub Bグループフッター_Format(Cancel As Integer, FormatCount As Integer)
        Debug.Print Me!ID, Me!A小計, Me!B小計
    End Sub
    

    出力結果

     1             11            11 
    AFooter        11 
     3             11111         11 
     5             11111         100 
     6             11111         11000 
    AFooter        11111 
     8             11            11 
    AFooter        11 
    

    ※未出力のフッターの集計がきちんととれてる(Me!A小計)
    ※レコードの参照はグループの最後のレコードっぽい(並び順指定してなかったらIDはなぜか降順に・・・)

    7
    hatena 2020/11/05 (木) 09:54:12 修正 >> 6

    グループヘッダーに集計用テキストボックス=Sum()=Count()を置いた場合でもちゃんとグループ内の集計が取得できますので、formatイベントに関係なくグループ全体の集計をしているみたいですね。

    ちなみに詳細セクションに集計関数を置くと全体の修正をするようです。一番目のレコードでも全体集計になります。

    8
    ポンタ 2020/11/05 (木) 16:45:35 0029a@1c915 >> 6

    こちらの方法で1回うまくいったと思っていたのですが、「nullの値が不正です」との警告が出て、固まるようになりました。なにか間違っているのでしょうか…

    9
    ポンタ 2020/11/05 (木) 20:23:38 0029a@1c915 >> 6

    ケアレスミスしてました…うまくいきました。

    Private Sub グループフッター3_Format(Cancel As Integer, FormatCount As Integer)
    
    
    If IsNull(Me.グループA) Or IsNull(Me.グループB) Then
    Else
    Cancel = (Me.グループA = Me.グループB)
    End If
    End Sub