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

指定行数毎に空白行を挿入する

よくある要望ですね。某知恵袋で下記のようなコードをみましたが、実はバグを含んでいます。

3レコード毎に空白行を挿入するというつもりのものです。これでプレビューするとうまく言っているようにみえますが、実は不具合含みのコードです。

プレビューではいいのですが、プレビューから印刷したり、印刷ダイアログでページ指定して印刷したりすると、プレビューとは異なった結果になる場合があります。

レポートのイベントの発生メカニズムの研究 でも取り上げましたが、レポートのイベントの発生タイミングは複雑で、これを理解せずにコーディングすると思わぬ不具合に遭遇します。

プレビューだけで判断せずにいろいろなデータ、設定で実際に印刷して確認する必要があります。

RptBlankRowInsert.png

難易度: 難易度: 2

ちなみに、いつもお世話になっているAccess Clubさんのサンプル
任意のレコード数ごとにレポートで空白行を表示させる方法 : SampleFile233 でも上記コードと同じ間違いを犯しています。

一つめの間違い

変数 intCount で行数をカウントしてますが、その変数の初期化をレポートの「開くとき(Report_Open)」で行ってます。しかし、「開くとき」イベントは、プレビューしてから、印刷するときには発生しません。よって、プレビューでの代入値が残ってままになりますので、空白行の挿入される位置がずれる場合があります。

初期化するのは、レポートヘッダーのフォーマット時イベントにする必要があります。

2つめの間違い

詳細セクションの印刷時イベントで、intCount = intCount + 1 とカウントアップしてますが、印刷ダイアログでページ指定して印刷する場合は、跳ばされるページでは印刷イベントが発生しません。例えば、3ページ目から印刷するようにすると、1, 2ページではカウントアップされず、かつ、空白行も挿入されないので、プレビューしたときはずれて印刷されてしまいます。

では、フォーマット時イベントにすれば、跳ばされるページでもイベントが発生しますので、大丈夫そうに思えます。しかし、フォーマット時イベントは、改ページの前後で同じレコードで2回発生しますので、カウントアップがずれてしまいます。FormatCount引数で1回目のみカウントアップするという方法もありますが、今回は、NextRecordで同じレコードを繰り返し出力してますので、その場合も FormatCountが2になり、改ページでの2回目なのか、NextRecordで2回目なのか区別がつきません。

ということでなかなか簡単にはいきません。

正しい対処法

AC2000以降なら CurrentRecordプロパティでレコード番号を取得できますので、それを利用するのがいいでしょう。それ以前のバージョンの場合は、非表示のテキストボックスを配置して、コントロールソース =1、集計実行 全体 で連番が取得できますのでそれを利用します。

3行ごとに空白行を挿入する場合のレポートモジュール例

これで、プレビューから印刷しても、ページ指定して印刷しても、プレビューと印刷で結果が異なることもなく、正確に指定したレコード件数毎に空白行が挿入されます。

グループ化していてグループ毎に改ページしている場合は、非表示のテキストボックスの「集計実行」を「グループ全体」にして、それをコードから参照するようにします。

サンプルMDB が下記からダウンロードできます。
RptBlankRowInsert_07.zip (Access 2002-2003 形式 - 29kb)
RptBlankRowInsert.zip (Access 2002-2003 形式 - 26kb)
RptBlankRowInsert_2k.zip (Access 2000 形式 - 25kb)

拍手する

Leave a reply






Trackbacks

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