![]() |
||
<HOME <お願い事項 <Access2000 TOP <Access97 TOP <サイト内検索 | ![]() |
|
![]() |
||
Ac2002--VBAの沼 > データがなくても罫線を10行なら10行分引くレポート | ||
1 2 |
変数がそろったら、いよいよ詳細セクションのFormat時のイベントを書きましょう。
レポートヘッダーのときと同様に、リストから「詳細」を選んでください。
詳細セクションのFormat時のイベントを書く欄ができましたでしょうか。
まず最初に↑、変数AAAに1を足します。これで、AAAに「今印字している行の行番号」が入ることになります。
次に、「10行に達しているかどうか」を調べて処理を分岐するためのIf文を入力します。
いちおう、忘れないうちにEnd If も書いといてください。
この2行の間に、いろんな処理を書いていきます。
前のコーナーで使ったMod演算子をここでも活用しようと思います。
「AAA(今印字している行)は、10で割れるかどうか」をまず調べます。
・10で割った余りが0なら、10行目ということになりますから、改ページをします。
・余りが0以外なら、まだ10行目に達していない(あるいは13行目とか15行目とか)なので、改ページはしません。
という処理分岐になります。
10行目だったら、改ページコントロールの可視プロパティをTrueにして、改ページをします。
Elseと入力して、「10行目でない場合」の処理」を書きます。
ここで、さらに細かく状況を分けていかないとならないです。
もう一度、この時点で変数AAAとBBBに何が入っているか、おさらいしておいてくださいね。
AAA : 今印字している行が何行目か
BBB : このレポートがモトにしているテーブルのレコード件数
10行目でない場合で、
まだ印字するレコードがある場合(AAAよりBBBの方がまだ大きい場合)
→
NextRecordをTrue。各テキストボックスを可視。
もう印字するレコードがない場合(AAAの方がBBBより大きい場合)
→ NextRecordをFalse。各テキストボックスをFalse。
と、さらにこういう分岐になるわけなんです。
ここまでのところ、いかがでしょうか。
NextRecordの使い方が今ひとつピンとこないかもしれませんが、とりあえずここまで仕上げてみてください。
では、コンパイルをして書き間違いなどがないかどうか最終チェックをし、VBEのウィンドウを閉じてレポートをプレビューしてみましょう。
わたしのは、↑こんなふうになりました。
・・。
なんか・・・1件少ないような気がしません?
確か7レコードあったはずなんだけどな・・・。
今の状態だと、「AAAとBBBが同じ数だった場合」という条件分岐がないですよね。
AAAも7、BBBも7のときにどうすればいいのか、条件をひとつ追加してやりましょう。
そうなると、3択になるんですけど、If文でせっかく書いたのに、これをSelect文とかに書き換えるのめんどくさいですよね。。。
こういう場合は、ElseIfというのがいいかもしれません。
こうして、Elseに条件式をくっつけて、「Aか、Bか、それ以外か」という構文にすることができるんです。
これで、最後のレコードはNextRecordだけFalseにして、テキストボックスはそのまま印字するようになります。
これで、最後のレコードも印字されるようになったと思います。
では次に、レポートフッター部分に、人数の合計を出してみましょうか。
ページフッターでもいいんですが・・・前にお話したように、ページフッターって、使えない関数とかありますから、今回はとりあえずレポートフッターを使いましょう。
Count関数を使って手っ取り早く、件数のカウントをしたとします。
あり・・・・。
印刷が2ページになっちゃうんですけど・・・。
レポートフッターが2ページ目になっちゃう・・・。ということにお気づきですよね。
これは、最初の方の、「10行目かどうか」の判断のところが影響しています。
レポートフッターとかがある場合でも、詳細セクションのところで改ページしちゃうので、レポートフッターだけが次のページになっちゃうわけですよね。
こういうのが実は悩ましいところなんですけど・・・。
今回は7レコードしかないので、1ページでおさまるはずですよね。この場合は無理に改ページなどせず、自然にレポートフッターも印字して終わってほしいんですが・・・。
ええと、
AAAが10で、BBBが7のときは、改ページしてほしくない、と。
でも、12レコードあるときは、10レコードめで改ページしてくれないとならないわけです。
じゃ、
AAAが10で、BBBが12のときは、改ページしてほしい。
じゃあ、テーブルにあるレコードが10行のときは・・・。ここのところが非常に重要なポイントになります。
皆さんはどうなってたほうがいいですか?
10行目で改ページして、レポートフッターだけ次ページに印字されていた方がいいですか?
それとも、10行目で改ページせず、レポートフッターを最終ページの一番下に収めたいですか?
AAA > BBB → 改ページしてほしくない
AAA = BBB → 改ページしてほしい?ほしくない?
AAA < BBB → 改ページしてほしい
さっきと同じで、3択になるか2択になるか、AAA=BBBのときどうするかにかかってきます。
テーブルのレコード件数を10件にして試してみますね。
2択の場合は↓こんなです。
この場合は、レコード件数が10件の場合は、10行で改ページして、レポートフッターは次のページになります。
この場合は↓、3択になります。レコード件数が10行の場合は、改ページせずに、10行目を普通に印字します。
どうも実感がつかめないという人は、テーブルのレコード件数を増やしたり減らしたりして、試してみてください。
AAAとBBBの変数の中に何が入ってるかを調べながら、<>の向きを変えていけば、違いが見えてくると思います。
なんかもうワケがわかんなくなってきましたね・・・。
結局、別にそんな画期的なことをやってるわけではなくて、改ページするタイミングと、テキストボックスを可視不可視するタイミングを計ってるだけなんです。当然、レポートのデザインとかが変わると、当然もっと考えなくちゃいけないことが出てくるわけですよ。
その都度、If文が増えていくわけです。
だからこそ、コードを丸写しするのではなく、各If文がどういう条件判断をしているのか、細かく知っていただきたいなあ・・・と思います。そうすれば、同じ動作をしない場合でも、条件を書き換えれば何とかなる場合も、あるかもしれませんもんね。。。
いちおう、ここまで書いたコードです。
わたしはこれで、とりあえず「10行で改ページするレポート」になりました。
結果的に、[AC97] レコードがない場合も用紙の最後まで罫線を出力する方法
http://support.microsoft.com/default.aspx?scid=kb;ja;JP404909
と、同じになったことはなったんで、いけてるんじゃないかと思うんですけどね。
![]() |
![]() |
![]() |