<HOME  <お願い事項  <Access2000 TOP   <Access97 TOP   <サイト内検索
  Ac2002--VBAの沼 > データがなくても罫線を10行なら10行分引くレポート
   1 2



今回は「データがなくても罫線を10行なら10行分引くレポート」に挑戦します。
これ、需要は多々あるんですけど、はっきりいってめっちゃくちゃめんどくさいです。
今までお話してきた内容が今ひとつ理解できない、どうもよくわからない・・・という方には、お薦めしません。お薦めできません。
ほんとに、めちゃめちゃ面倒です。
ある程度の心積もりがある方のみ、読み進んでください。
マジで、ものすごい面倒ですから・・・。

今回の元ネタは、Microsoftのサイト掲載されている情報です。
[AC97] レコードがない場合も用紙の最後まで罫線を出力する方法
http://support.microsoft.com/default.aspx?scid=kb;ja;JP404909
ここでは、このコードを土台にして、コードの書き方、意味を理解し、応用ができるようになれるように、細かく解説をしていきます。。
まずは上記のサンプルコードを眺めておいてください。

基本的に、無理なことなんです<データがなくても10行線を引く
「なんで?」と思ってらっしゃる方は、いらっしゃらないですよね・・・
MS-Accessのレポートの構造を考えれば、「データがないところに罫線だけ引く」なんていう考えがないことは一目瞭然です。
でも、やり方次第で、見せかけ「10行で改ページのようなこと」ができないでもない・・・・今回は「見せかけ10行改ページするレポート」にチャレンジしようかと思います。
上記のMicrosoftのサイトの情報は、まさにそれです。
今回はこのサンプルコードを意識しつつ、コツコツやっていきます。



こういうテーブルを用意しました。え?脳がない?おだまりなさい。

フィールドが4つあります。
今、7レコード入るようになってます。

このテーブルを元に、レポートを作りました。「オートレポート表形式機能」で作った簡単な表形式レポートです。

テキストボックスの大きさや位置は適時調整し、コンパクトにまとめてみました。
今回はごくごくシンプルに、「レポートヘッダー」「ページヘッダー」「詳細」の3つのセクションのみ使用し、他のセクションは空っぽの状態になっています。
オートレポートで作った状態のレポートだとページフッターに、ページ番号とか入るようになってたんですけど、消しちゃいました。

詳細セクションの下の部分にでも、直線を引きましょう。

これが、罫線代わりになるんですよね。
(わたしは他の線と区別しやすいように赤い線にしましたけど、皆さんは別に赤くする必要はないです)

このレポートをプレビューすると、こんな感じになります。

当然、テーブルには7件しかレコードがないので、7行で終わりですね。
これを、7件でも、10本線が出るようにしよう、というのが、これからの試みです。
では、レポートのデザインビューに戻って、がんばるといたしましょう。

いちおう、詳細セクションにあるテキストボックスの名前を確認しておきましょう。
わたしの場合は、[社員番号][名前][カナ][部署]と4つのテキストボックスがありました。
で、各テキストボックスのプロパティを見ておいてください。「可視」っていうプロパティがあると思います。
これをVBAで書くとどうなるか、いちおう確認しておきましょう。
といっても、可視ってプロパティ自体は、何度か出てきてますから、皆さん大丈夫ですね。



次に、このレポート上に「改ページコントロール」というものを作ります。

詳細セクションの下に、ぺったりくっつくように作ってください。
わかりにくいコントロールなんですが、わかりにくいからといっていくつもいくつも作らないように注意してくださいよ。ひとつでいいんですからね・・・。
罫線が既に引いてありますが、改ページコントロールはこの罫線より下に作る必要があるんです。
改ページコントロールはすごく見難いし、細かい作業になりますけれど・・・。ひとがんばりしてください。
この改ページコントロールが、罫線より上にあったり、下に隙間ができてると、これから書くコードは正しく動作しませんので、しっかり確認しておいてくださいね。

作れたら、改ページコントロールの名前を調べておきましょう。

では・・・いよいよコードの記述です。
基本的な考え方をまとめてみましょう。

  テーブルにデータがあるうちは普通に印刷します。
  テーブルにデータがなくなったけれど、まだ10行分印刷してない場合は、(5件目とか6件目とか)、空の行を印刷します。

ここでの空の印刷とは、データはないけど、罫線だけを印刷する(正確には4つのテキストボックスを不可視状態にして見えなくする)という状態を言います。コレをやるためには、レポートのNextRecordというプロパティを使います。
ちょっとヘルプで調べてみてください。VBEのウィンドウの方のヘルプですよ。

(ヘルプより)
NextRecord プロパティは、セクションを次のレコードに進めるかどうかを示します。値の取得および設定が可能です。ブール型 (Boolean)
の値を使用します。このプロパティを設定するには、セクションの "OnFormat/フォーマット時" プロパティにマクロまたはイベント プロシージャを指定します。各セクションの Format イベントが発生する前に、このプロパティは True に設定されます。

と、こんなふうに書かれていますね。

レポートというのは、もとのテーブル(またはクエリ)にレコードがあれば次のセクションを印字しようとするし、なければページフッターとかを印刷して完了します。今回は、完了せずに罫線だけ印刷したいわけなのすが、罫線だけというわけにはいかないので、とにかくレコードがなくても詳細セクションを指定回数分繰り返して印刷をしてほしいわけなんです。
このNextRecordというプロパティがTrueになっていると、次のレコードに進めようとします。で、次のレコードがなければ、終わりになります。
NextRecordがFalseになっていると、次のレコードに進めようとしないので、レコードがなくても詳細セクションの印刷が1回行われることになります。
このプロパティをフル活用しようというわけです。

このプロパティの判断がつくイベントは、Formatイベントのようですね。
そこで、各詳細セクションのFormat時のイベントに、こうした判断をするコードを書くことにします。
そして、テーブルにデータがなくなった上、10行に達した場合は、印字を終わるわけです。


え?もういやになった?
んもー、だから言ったじゃないですか。面倒くさいって。



では・・・。まずはすごくシンプルな例をとってやってみましょう。
詳細セクションをフォーマットするときに、以下のような判断をさせます。

  今、何件目を印刷しているのかを調べる。→変数AAAに代入しておく
  テーブルの中に何件レコードがあるか調べる。→変数BBBに代入しておく
  AAAとBBBを比較してみる。
 
    BBBの方が数が多い場合 → ふつうに印刷。
     AAAの方が数が多い場合 →  Me.NextRecordを無理やりtrue。

こういう処理が、毎行毎行繰り返されるわけです。
AAAは、前のコーナーでやったやり方がそのまま使えそうなので、1ずつ足しこんだ答えを出していこうと思います。
BBBは・・・うーん、今回はDcount関数という関数を使って、テーブルの中のレコード件数を数えるとしましょう。
Dcount関数の書き方など、ヘルプで確認をしておいてください。

では、マイリマショウ。
ツールバーのこのボタンをクリックすると、このレポートのプライベートプロシージャを全部表示するVBEウィンドウが表示されます。
手っ取り早くソースを見たり、とりあえず先頭部分に変数の宣言だけしたいときなどは、この方法でVBEを開くといいかもしれません。

では、このふたつの変数を、一番上の「共通部分」に宣言しておきましょうか。
とりあえずIntegerでよいと思います。印刷の対象となるレコードの件数が5万件とか6万件とかになる場合は、Longなどにしないとならないですけどもね。
複数の変数の宣言の仕方なんですが、半角のカンマで区切って1行で宣言することができます。

でも、これだと↑、整数型になるのはBBBだけです。
AAAは型の指定がないことになってしまい、Variantという「なんでもあり」のデータ型になってしまいます。
まあ、コレでも別にいいんですが、AAAも整数型にできてると思ってたら大間違いなので、

こうやって↑、ひとつひとつ型を宣言していくものだと思ってください。

あるいは、こうして↑1行ずつ宣言したほうがいいのかもしれないですね。
こんなふうに↓それぞれコメントつけやすいですからね・・・。

まあ、書き方はいろいろなので、最終的には皆さんのお好みです。
いろんなVBAの入門書とか、サンプルコードとかを見て、わかりやすいなぁと思う書き方を「皆さんの標準」にしていってくださいね。



次に、このふたつの変数にしかるべき値を入れる準備をいたしましょう。
これらの変数は、「詳細セクションの印刷が始まる前」に整っていないとなりません。
なので、逆に「詳細セクションの印刷が始まる前なら」いつでもいいんですが・・・。
今回のこのレポートで、一番最初に印刷されるのは「レポートヘッダー」なので、ここでやりますかね。
画面上のリストから「レポートヘッダー」を選びましょうか。

このタイミングで、AAAとBBBにそれぞれ値の代入をしておきます。

さらに、このタイミングで、「詳細セクションの改ページコントロール」を不可視状態にしておきます。

こうしておくと、改ページコントロールはあるけれど、改ページは行われません。
今回はレコードが7件であることがわかってますから、この改ページコントロールはあんまり効力を発揮しないんですが、もし、印字予定のデータが12件とか25件とかの場合は、「10行で改ページ」することになるわけですよね。その場合はこの改ページコントロールがものを言います。
その辺も含めて、考えていきましょう。