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

余白に応じて行数指定無く用紙の最後まで罫線を出力する

余白に応じて行数指定無く用紙の最後まで罫線を出力する

レコードがない場合も用紙の最後まで罫線を出力する方法は、このブログでも3つの方法を紹介しています。ただし、どれも1ページの行数は固定です。

「印刷時拡張」やグループヘッダーが挿入されたりして1ページの行数が変更になる場合でも、最後まで罫線を出力したいという要望がたまにあるようです。
最近では、下記で同様の質問がありました。

[Access Report] 余白に応じて行数指定無く用紙の最後まで罫線を出力する方法について - マイクロソフト コミュニティ

難易度:

総ページ数取得のダミーのフォーマットを利用する

上記の掲示板での質問者は、[Pages]で総ページ数を取得するために最終ページまで、ダミーのフォーマットが発生してから、先頭に戻り本番のフォーマットが再度発生するというAccessの性質を利用して、最終ページに必要な空白行数をFormatCount で取得するというアイデアのコードを採用しています。

総ページ数を取得するメカニズムについては下記を参照してください。
レポートのイベントの発生メカニズムの研究 その2 - hatena chips

この方法は素晴らしいアイデアだと思いました。コードもシンプルで無駄がないです。上記のリンク先をみてコードを解析されることをお薦めします。

Report.Topプロパティを利用

実は、以前、同様の案件があったときは、このロジックは思いつかなかったので、別の方法を使いました。今回、この質問を見て思い出しながらコーディングしてみたら、シンプルで汎用性の高いものができました。

Report.Topプロパティを利用します。Report.Topプロパティは、ヘルプには、下記のように解説されています。

構文
式.Top
式 Report オブジェクトを表す変数です。
備考
Visual Basic でこのプロパティを設定するには、数式を使います。値の単位は twip です。
レポートの場合、"Top/上位置" プロパティの設定値は、現在のセクションがページの上端からどれぐらい移動しているかを示します。このプロパティの設定値は twip 単位で表示されます。このプロパティを使用して、セクションの Format イベント プロシージャでセクションが印刷される位置を指定できます。

つまり、Me.Topでセクションの印字位置のページ上端からの距離が取得できるということです。

サンプル

下記のような仕様でサンプルを作成します。

用紙サイズ A4
空白行用フッター グループフッター1

詳細セクションに配置してテキストボックスは「印刷時拡張」を「はい」に設定してあるので、1行の高さは増減します。
また、グループヘッダーを2つ配置してあり片方は「セクション繰り返し」が「はい」になっていますので、これでもページにより1ページ当たりの行数は変化します。

サンプルレポートのデザインビュー

空白行用フッターには、詳細セクションと同じように直線コントロールを配置します。

レポートのモジュールのコードは下記になります。

2016.11.24追記: ページの高さ(PageHeight)を取得するコードをレポートヘッダーのフォーマット時からレポートの「開く時」に移動しました。レポートヘッダーのないレポートに対応するため。

Printerオブジェクトを利用して、下余白を取得してますので、Access2002以降の対応です。それ以前のバージョンの場合は、PrtMipプロパティで取得する必要があります。こちらのコードは下記のAccess2000形式のサンプルファイルを参照してください。

NextRecord = False を使用すると、コードミスや設定ミスで無限ループに陥る場合があるので、安全のために指定回数以上のフォーマットの繰り返しが発生しないようにしています。

やっていることは、レポートヘッダーのフォーマット時の開く時で、用紙の高さから、下余白とページフッターの高さを引いて、印字可能範囲の下限を取得します。ページフッターがない場合のエラーは On Error Resume Next で無視します。

空白行用のグループフッターのフォーマット時で、印字可能範囲に収まるかどうかをチェックして、収まる場合は NextRecord = False で繰り返します。収まらない場合は、Cancel = True で出力をキャンセルします。

サンプルレポートの印刷プレビュー

印刷時拡張で縦罫線を連続させる

印刷時拡張でテキストボックスや詳細セクションの高さが増えた場合、縦罫線の高さは増えないので、罫線が途切れてしまいます。それに対処するために、印刷時に、Lineメソッドで罫線を引くコードを追加します。縦罫線の可視は「いいえ」にしておきます。

縦罫線を指定して、その個数分のコードを記述してもいいのですが、汎用性を持たせるために、For Each で詳細の全コントロールをループして、非表示で幅が0の直線コントロールを縦罫線と判断して、Lineメソットで罫線を描画していますので、このままコピーして利用できます。

まとめ

行数可変の場合に対応しているということは、当然、行数固定でも問題なく使用できるということです。コードもシンプルですし、印刷プレビューからページ設定で余白を変更しても問題ないです。デザインビューでの設計もシンプルです。いままで、用紙の最後まで罫線を出力する方法は、いろいろ紹介してきましたが、これがオールマイティな最終形といえるかもしれません。

サンプルファイルが下記からダウンロードできます。
RptDrowLinePageBottom_07.zip (Access 2007-2010 形式 - 25kb)
RptDrowLinePageBottom.zip (Access 2002-2003 形式 - 22kb)
RptDrowLinePageBottom_2k.zip (Access 2000 形式 - 28kb)

拍手する

5 Comments

AA says..."サンプルについて"

いつもこちらのサイトには大変お世話になっております。

Windows10、access2010使用中
RptDrowLinePageBottom_07.zip (Access 2007-2010 形式 - 25kb)

今日上記環境で同サンプルファイルをダウンロードしたのですが、なぜかレポートが3ページ目(ページフッターのみ表示、それ以外のセクションは白紙)まで出力されます。
試しにテーブルに新たなグループとしてレコードを追加してみても、そのグループの後に、同じく最終ページとしてフッターのみのレポートが出力されました。
コードを確認し、グループフッター1の改ページが最終レコードでも有効のままなのが原因かな?と検討してみたのですが修正方法が分かりません(まったくの見当違いかもしれません…)。

どうかアドバイスを頂けませんでしょうか。
どうぞよろしくお願いいたします。

2016.11.28 22:02 | URL | #- [edit]
hatena says..."re:サンプルについて"

> いつもこちらのサイトには大変お世話になっております。
>
> Windows10、access2010使用中
> RptDrowLinePageBottom_07.zip (Access 2007-2010 形式 - 25kb)
>
> 今日上記環境で同サンプルファイルをダウンロードしたのですが、なぜかレポートが3ページ目(ページフッターのみ表示、それ以外のセクションは白紙)まで出力されます。
> 試しにテーブルに新たなグループとしてレコードを追加してみても、そのグループの後に、同じく最終ページとしてフッターのみのレポートが出力されました。

同じ環境で試してみましたが、症状が再現できませんでした。
プリンターのページ設定は、A4縦になってますか。

Const A4Height As Long = 29.7 * 567 'A4用紙の高さ

の部分を下記のように少し減らしてみて試してみてください。

Const A4Height As Long = 29.7 * 567 - 50 'A4用紙の高さ

2016.11.28 22:24 | URL | #5uE6dEgY [edit]
AA says...""

返信ありがとうございます。
アドバイス頂いた件、以下の通り確認いたしました。

・プリンターは現在持っていないため、印刷プレビューからのPDFエクスポートでの確認しかできませんでした。
 A4縦、余白6.4mmでした。
・A4Heightの値を小さくしましたが(-50~-1000まで)、やはりフッターのみのページが出力されました。
・公開されている他の明細行をページの最後まで出力するサンプル(「用紙の最後まで罫線を出力-1ページ目と2ページ目以降の行数が異なる場合(access2007形式)」等)も確認しましたが、これらは表示に問題はありませんでした。

お手数をお掛けして申し訳ありません。
どうぞよろしくお願いいたします。

2016.11.29 00:40 | URL | #- [edit]
hatena says..."re:"

> ・プリンターは現在持っていないため、印刷プレビューからのPDFエクスポートでの確認しかできませんでした。
>  A4縦、余白6.4mmでした。
> ・A4Heightの値を小さくしましたが(-50~-1000まで)、やはりフッターのみのページが出力されました。

PDFへのエクスポートはどのような手順でしましたか。

当方、プレビューから、リボンの「PDFまたはXPS」ボタンをクリックしてPDFに出力してみましたが、問題なく出力できました。

症状が再現できないので、とりあえず思いつくアドバイスとしては、
グループフッターの「改ページ」プロパティを「しない」にしてみてください。

2016.11.29 09:37 | URL | #5uE6dEgY [edit]
AA says...""

アドバイスありがとうございます。
「グループフッターの「改ページ」プロパティを「しない」にする」でページフッターのみのページが出力される現象は出なくなりました!

(解決しましたので以下は補足です。
ご質問いただいたPDF出力については、hatena様と同じく印刷プレビューのリボン部のデータ→PDFまたはXPSから実行しましたが、印刷プレビュー時と同じくページフッターのみの最終ページが出力されていました。また印刷プレビュー上で右クリック→エクスポート→PDFまたはXPSでも同じ症状が出ていました。)

印刷時拡張と罫線をページ末尾まで出力するのとを両立できるこのサンプルはまさに必要としていた内容でした。
あとは同じく公開していらっしゃる「Page/Pages形式を表示する」を組み合わせるべく頑張ります。
こちらの拙い説明にもかかわらず、真摯にお答えくださいまして本当にありがとうございました。

2016.11.30 00:25 | URL | #- [edit]

Leave a reply






Trackbacks

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