Microsoft Access 掲示板

「余白に応じて行数指定無く用紙の最後まで罫線を出力する」の最下部横線太さについて

5 コメント
views
4 フォロー

お世話になっております。

https://hatenachips.blog.fc2.com/blog-entry-463.html
「余白に応じて行数指定無く用紙の最後まで罫線を出力する」

上記の方法を用いたレポート印刷について、ページ最下部の横線のみ太くすることは可能でしょうか?
イメージとしては、両側、最下部の線を太くして、枠全体を太枠で囲うように見せたいです。

両側縦線については何とか太くできたのですが、最下部横線の位置はページ毎に変動するのでどうにもうまくいきません。

何か解決策がありましたら、ご教授よろしくお願い致します。

mae
作成: 2022/01/19 (水) 16:23:43
最終更新: 2022/01/20 (木) 09:12:36
通報 ...
1

リンク先のサンプルのコードを下記のように修正しててみてください。

Option Compare Database
Option Explicit

Const A4Height As Long = 29.7 * 567 'A4・スp・ス・ス・スフ搾ソス・ス・ス=29.7cm 1cm=567twips
Dim PageHeight As Long
Dim BottomPos As Long '追加
Dim PageTop As Long   '追加

'ページフォーマット時イベント 追加
Private Sub Report_Page()
    BottomPos = BottomPos + PageTop
    Me.DrawWidth = 4 '罫線の太さを設定
    Me.Line (0, BottomPos)-(Me.Width, BottomPos)
End Sub

Private Sub レポートヘッダー_Format(Cancel As Integer, FormatCount As Integer)
    '印刷可能領域下辺のページ上端からの高さを取得
    On Error Resume Next
    PageHeight = A4Height - Me.Printer.BottomMargin
    PageHeight = PageHeight - Me.Section(acPageFooter).Height
    PageTop = Me.Top  '追加
End Sub

Private Sub グループフッター1_Format(Cancel As Integer, FormatCount As Integer)
    If Me.Top + Me.グループフッター1.Height <= PageHeight Then
        Me.NextRecord = False
        If FormatCount > 20 Then Me.NextRecord = True
        '↑想定外の動作で無限ループになった場合でも、20回で止まる
        BottomPos = Me.Top '追加
    Else
        Cancel = True
    End If
End Sub

'詳細のフォーマット時イベント 追加
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
    BottomPos = Me.Top - Me.詳細.Height
End Sub

Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)
    Me.DrawWidth = 1
    Dim ctl As Control
    For Each ctl In Me.詳細.Controls
        If ctl.ControlType = acLine And ctl.Visible = False Then
            If ctl.Width = 0 Then Me.Line (ctl.Left, 0)-(ctl.Left, 14400)
        End If
    Next
End Sub
2

hatena 様

お世話になっております。
早々のご教授ありがとうございます。
上記コードにてトライしてみます。
また結果ご報告いたします。

3
hiroton 2022/01/20 (木) 13:37:21 3c477@f966d

縦線についてはきれいな表形式のレポートならレイアウト機能(レポートデザインツール→テーブル→表形式)を使って縦線の代わりにテキストボックスを使うと印刷時拡張で一緒にサイズが変わるのでちょっと楽かもしれません


最下部の横線考えてたらhatenaさんがいい感じの回答してますが、

Private Sub Report_Page()
    BottomPos = BottomPos - PageTop     '//変更
    Me.DrawWidth = 4 '罫線の太さを設定
    Me.Line (0, BottomPos)-(Me.Width, BottomPos)
End Sub

Private Sub レポートヘッダー_Format(Cancel As Integer, FormatCount As Integer)
    PageTop = Me.Top  '//これだけでいい
End Sub

Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)
    BottomPos = Me.Top + Me.拡張設定のあるテキストボックス.Height '//追加
End Sub

単に印刷領域上からの位置でいいんじゃないかなぁというのと、Formatイベントは処理が複雑なので実際に描画したPrintイベントで位置を取得すると楽じゃないかなと

見る方向が逆になっているので+-が逆になるのと、印刷時拡張後の高さが欲しいので高さを取得するコントロールをきちんと指定する必要があります
グループヘッダー・フッターについても、ページの最後に印刷される可能性があるならPrintイベントで同様に最下部の位置を取得しておけばいいです
いずれにせよReport_Pageイベント直前のPrintイベントでBottomPosがその「セクションの印刷開始位置(Me.Top)+セクションの高さ」で上書きされていればちょうど最下部に線を描画できます

※大本のコード(その他の目的)部分は考慮していません

5
mae 2022/01/20 (木) 14:49:58 修正

hatena様
hiroton様

お世話になっております。
hiroton様のコードを混ぜながらトライしたところ、見事に私がイメージしている形で印刷することが出来ました。
色々なレポートで活用していきたいと思います。

大変助かりました。ありがとうございました。