MS Access Tips/Sample and VBA and Blog customize etc...

ページの最後の罫線を太線にする

詳細の境界線を、細線の点線で、ページの最後の行の下の線だけ実線、太線にしたい

こういう要望があったとします。1ページの行数が決まっているなら、VBAでその行数のときに
直線の種類を変更して、改ページすればいいのですが、グループヘッダー/フッターがあったり、印刷時拡張/縮小で高さが変化する場合などで、1ページの行数が固定でないときは、困ります。

ページの最後の罫線を太線にする

事前に次で改ページするかどうかを取得できるプロパティがあればいいのですが、残念ながらありません。
今回は、次に改ページするかどうかを取得する方法を考えてみます。

難易度:

まずは、グループヘッダー/フッターがなくて1ページの行数が固定の場合のコード例から

と簡単にできます。しかし、高さの違うグループヘッダー/フッターがあったり、印刷時縮小/拡張で高さが変化すると1ページの行数も変化するので簡単にはいきません。このセクションの後で改ページするかどうか事前に取得できれば実現できます。

これを実現するには、レポート上にコントロールソースが =Pages のテキストボックスを配置しておくと、Access は総ページ数を取得するために、事前に最後までの予行演習のフォーマットイベントを発生させます。その後、最初から本番のフォーマット、印刷イベントを発生させます。 この予行練習のフォーマットイベントでどのレコードで改ページされたかを記録しておいて、それを利用します。
(この方法は、レポートでグループ毎に Page/Pages 形式のページ数を表示する でも利用してます。)

詳細セクションの最下部に、直線を配置します。

名前  直線1
境界線スタイル  点線1 
境界線幅 細線 

レポートヘッダーにテキストボックスを2つ配置して、下記のようにプロパティを設定。
名前  txtPages
コントロールソース  =[Pages]
可視 いいえ 

名前  cnt
コントロールソース  =Count(*)
可視 いいえ 

レポートヘッダーを表示させたくないときは、レポートヘッダーの 可視 を いいえ に設定。
 
あとは、レポートのモジュールとイベントプロシージャを下記のように記述

サンプルファイルが下記からダウンロードできます。
RptPageLastLine_07.zip (Access 2007-2010 形式 - 24kb)
RptPageLastLine.zip (Access 2002-2003 形式 - 17kb)
RptPageLastLine_2k.zip (Access 2000 形式 - 16kb)

拍手する

7 Comments

titti says..."大変助かりました。"

途方にくれてましたが、なんとかこのページにたどり着けました。
フォーマットイベントとは、私の知識外でした。

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

2012.02.08 11:57 | URL | #blJnQEm. [edit]
loveDog says...""

なるほどナー
大変役にたちました。ありがとうございます

2016.08.31 11:55 | URL | #- [edit]
sakura says..."グループヘッダがある場合"

いつも参考にさせていただいています。
ありがとうございます。
今回、請求書で利用させて頂いています。
顧客先グループの下に伝票番号グループがあります。
伝票番号グループヘッダが最終行の場合罫線が細く、次ページの詳細1行目の下線が太くなります。
グループヘッダーの下線の方は詳細と同様のコードを書くことで解決しました。が、詳細下線の方は解決策が思いつきません。
何か方法がありますでしょうか?

2016.09.05 18:27 | URL | #- [edit]
hatena says..."re:グループヘッダがある場合"

> 顧客先グループの下に伝票番号グループがあります。
> 伝票番号グループヘッダが最終行の場合罫線が細く、次ページの詳細1行目の下線が太くなります。
> グループヘッダーの下線の方は詳細と同様のコードを書くことで解決しました。が、詳細下線の方は解決策が思いつきません。

シンプルかつ現実的な解決策は、グループの「その他」の設定で、
現状は、
1ページにグループをまとめない
になっていると思いますが、それを、
1ページにグループをまとめる

1ページにヘッダーと最初のレコードをまとめる
に変更することかと思います。

ページの最後にヘッダーだけ残されるというのは、あまり見栄えがよくないと思います。
上記の設定にすればそのようこともなくなりますし、最後にヘッダーが来ることもないので今回の問題も発生しないです。

2016.09.05 22:51 | URL | #5uE6dEgY [edit]
SAKURA says...""

ご回答ありがとうございます。
1ページの行数が固定の方がいいという意見もありまして、解決方法を探していました。
(こちらを拝見するまでは、すべて同線種にしたりして対応していました)
「1ページにヘッダーと最初のレコードをまとめる」も参考にして考えたいと思います。
本当にありがとうございました。

2016.09.06 08:58 | URL | #- [edit]
hatena says..."re:行数固定"

> 1ページの行数が固定の方がいいという意見もありまして、解決方法を探していました。

行数固定ということなら、別の方法になります。このページの方法は、ヘッダーと詳細の高さが違ったり、印刷時拡張などで、行数が固定にならない場合の対処法なのです。

下記は10行固定の場合のコード例です。だだ、実際に試していないのでバグがあるかもしれません。考え方を参考にしてください。

Dim RowCnt As Long

Private Sub グループヘッダー0_Format(Cancel As Integer, FormatCount As Integer)
  RowCnt = RowCnt + 1
  If RowCnt Mod 10 = 0 Then
    Me.直線6.BorderStyle = 1 '実線
    Me.直線6.BorderWidth = 1 '1ポイント
    Me.グループヘッダー0.ForceNewPage = 2 '改ページ カレント セクションの後
  Else
    Me.直線6.BorderStyle = 4 '点線1
    Me.直線6.BorderWidth = 0 '細線
    Me.グループヘッダー0.ForceNewPage = 0 '改ページ しない
  End If
End Sub

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
RowCnt = RowCnt + 1

  If RowCnt Mod 10 = 0 Then
    Me.直線5.BorderStyle = 1 '実線
    Me.直線5.BorderWidth = 1 '1ポイント
    Me.詳細.ForceNewPage = 2 '改ページ カレント セクションの後
    RowCnt = 0
  Else
    Me.直線5.BorderStyle = 4 '点線1
    Me.直線5.BorderWidth = 0 '細線
    Me.詳細.ForceNewPage = 0 '改ページ しない
  End If
End Sub

2016.09.06 09:32 | URL | #5uE6dEgY [edit]
SAKURA says...""

コードの記載ありがとうございます。
1ページにヘッダーと最初のレコードをまとめる方向で考えていたので確認が遅くなり申し訳ありません。

早速サンプルのコードを利用させていただきました。
サンプルのコードの下に最終ページの最終行の下の罫線を太くするコードを追加しました。

If CurrentRecord = cnt Then
 Me.直線1.BorderStyle = 1 '実線
Me.直線1.BorderWidth = 1 '1ポイント
Me.詳細.ForceNewPage = 0 '改ページ しない
End If

同様の件で考えている方のために記載しましたが、いろいろと調べて書いたのでコードとしておかしかったらご指摘ください。
1ページ目と2ページ目以降の行数が違うため、まだまだ修正が必要ですがhatenaさんのサイトを参考に見栄えのいいレポートに仕上げたいとおもいます。
ありがとうございました。

2016.09.06 16:17 | URL | #- [edit]

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/70-4e5d5039
該当の記事は見つかりませんでした。