<HOME  <お願い事項  <Access2000 TOP   <Access97 TOP   <サイト内検索
  Ac2002--VBAの沼 > 行の色を交互に変えるレポート
  



行の色を交互に変えるレポートとか

MS-Accessの「レポート」というオブジェクトは、テーブルやクエリの中のレコードを印刷するためのデザインを持ったオブジェクトです。
単純に考えるとレポートというのは、

  レポートヘッダーを印刷し、
  詳細セクションを、テーブルまたはクエリのレコード件数分繰り返して印刷し、
    (要所要所で改ページのためにページフッターを印刷)
  テーブルまたはクエリのレコードがなくなったら、レポートフッターを印刷して終了

という構造を持っています。 

なので、言ってみれば、「詳細セクション」というところに書いたイベントは、テーブルまたはクエリのレコード件数分繰り返されることになるわけですね。
すごくシンプルな構造なので、私たちは普段、1行分のデザインを作っとけばいいわけなのです。

しかし・・・。
日本という国は、印刷物というものに結構こだわりがあります。
見積書とか請求書とか納品書とか、決まったレイアウトにデータを印刷したい場合って結構あると思います。
残念ながら・・・普段はシンプルで手間いらずのはずのレポートでは、うまいこと作れない印刷物も、中にはありそうです。
まあ・・それは仕方がありませんね・・・。

とにかく、レポートの基本的な構造、理解をしておいてくださいね。
レポートは従来、こうした合理的な仕組みを持っているがために、時としてわたしたちのリクエストに答えられない場合もあるんです。
ひとつが、前のコーナーでやっていただいた「ページ合計」ですね。

MS-Accessのレポートには、用紙のサイズっていう情報を持つプロパティ、ありませんよね。
用紙の大きさや向きは、プリンタの能力によるところが大きいです。なぜなのかは、理由はわたしにはわからないですが・・・。

また、テーブルやクエリの中のレコード件数は、レポートが閉じているとき(デザインビューの状態)では、わからないです。
それに、詳細セクションの高さとかも、自由に変えられますよね。
なので、印刷してみるまで(プレビューで見るまで)、1ページに何行印字できるかわからないわけです。
どこで改ページされるかは、印刷をしてみるまでわかりません。
そういう構造なので・・・ページフッターには、詳細セクションの「合計」とか「カウント」とかいう、いわゆるSum関数やCount関数が使えないんです。これらの関数って要は、「そのフォーム、そのレポートに出力予定のデータの合計とかカウント」ですからね・・・。
「グループ」とか「レポート全体」とかっていうのは、テーブルやクエリの中のデータを見ればわかります。でも、「1ページあたりのデータ件数とか合計」って、レポートの都合ですよね。だから、ページフッターではSum関数は使えないんです。


こういった事例を、あとひとつふたつやってみましょうか。
次に・・・例えば、

  ・レポートの行の色を1行ずつ交互に変える
  ・レポートの罫線を、5行おきに印字する

とか、こんなの、どうでしょう。

新しいこともいくつか出てきますが、レポートの基本的な構造を理解できていればそんなに難しいことはありませんですよ。
挑戦してみてください。




■例えば、レポートの行の色を1行ずつ交互に変える

この場合のポイントは、どうやって「交互」を判別させるか、というところにあります。
詳細セクションを印刷するごとに、「今何行目を印刷しているのか」とか「偶数行か奇数行か」とか、そういう判断ができれば、やりようがありますよね。

やり方はいろいろ考えられると思うんですが、今回はModという方法を使ってみようと思います。
Modとは関数ではなくて「演算子」の一種です。つまり、+とか−とかと同じように、数と数との計算の時に使用します。
割り算の余りを出すための演算子なんです。
これね、一見地味そうで、意外と使い道があるんですよ。

  1)今何行目を印刷しているかを判断し、
  2)その行数を割り算した余りを出す。
     2_1)余りが1なら、奇数
     2_2)余りが0なら、偶数

ってことになりますよね。

ここまで思いつけば、後は簡単だと思います。
んでは、行きますよ〜!



例えば、こんな感じのテーブルがあって、これを印刷するための表形式のレポートがあったとします。

まず、詳細セクションの「印刷時」(フォーマット時でもよいですが)のイベントの処理を作ります。
行数をカウントアップするための変数は、レポート全般通して使うので、↓上のほうに書いておきます。

じゃあ・・・色を変えましょうか。
どこの部分の色を変えるかといいますと、

テキストボックスの色とかを変えるんじゃなくて、↑この「詳細」っていうところの色を変えることになります。
これがねぇ。実は、「詳細」っていう名前のコントロール、じゃあないんですよ。
VBEのヘルプで、Sectionっていう単語をキーワードにして調べてみてください。

「Form および Report オブジェクトの Section プロパティ」っていうトピックがあると思います。
こいつを↑見てみてください。
え?調べるのめんどくさいから調べといてって??んもーどうなっても知りませんよ。

ヘルプを見ると、「詳細」セクションは、0という設定値に当たるようですね。
なので、

これで、↑詳細セクションの「背景色」プロパティを表してるわけなんです。
これで、シマシマになりますよ。

わたしのは、こんな感じになりました↑。
色の番号は、ご自分で調べるクセ、つけてくださいよ・・・。
いちおう、以前ご覧いただいた「色番号の一覧」、もう一度リンクしておきますね。参考にしてください。
でも、ホントに、ご自身で調べるクセ、つけといてくださいね。



これで全然オッケーだと思うんですが・・・。
数値型の変数の中身は、宣言した直後は、どうやらゼロになっているみたいなのでこうしたポテンシャルに頼るのも一考ですが、こういうのも・・・レポートを開くときにちゃんとゼロを代入して、いわゆる「変数の初期化」をするようにしましょう。
まあ「なんで?必要ないんでしょ?」って言われると返す言葉もないんですけど・・・宅配のお寿司で、食べ終わった器を回収するとき、どんなにお客がきれいに洗って返却してくれたとしても、多分お寿司屋さんは、寿司桶の中がどうなっていようと一通り洗うと思うんですよね。次の処理に向かう前に、ちゃんとゼロ入れて初期状態にして送っていう心配り、決して無駄ではないと思いますんでね。

もう、どれのどのイベントかわかっているのであれば、このVBEのウィンドウの中から、コントロール名やセクション名などを選ぶことができちゃいます。
画面上のほうのリストから、Reportっていうやつを選んでみてください。

そうすると、勝手にReport_Openっていうプロシージャができると思います。
いわゆる「レポートを開くとき」に発生するイベントってわけですね。

ここで、変数をゼロにしてから、詳細セクションでの処理に移ってもらいましょう。




■5行おきに罫線を引くとか

さてさて、次に、罫線を引いてみましょうか。
日本で「印刷物」を作るとき、縦横に線を引くって必須ですよね。
今日はとりあえず練習なので・・・簡単に、横線だけにしときます。

「罫線」とは申しましたが、MS-Accessのレポートでの罫線は実は罫線ではありません。

図形の、↑「直線」です。
これを詳細セクションに引くことで、罫線が引けてるみたいに見えるわけなんです。

(意図的に赤い線にしてます。↑なんちゃって)

プレビューするとこんな↑感じ。

この直線にも、色とか、線の太さとかのプロパティがあります。
名前もついてるんですよ。わたしのは「直線13」っていう名前が付いてます。
これらのプロパティを、VBAを使って変更したりしながら、もうちょっと変化のあるレポートに仕上げてみましょう。

大まかな仕組みは、さっきの「1行おきに色を変えるレポート」の時と同じです。

   一番上で、レポート全体で使う予定の「行数をカウントするための変数」を宣言しておいて、
   レポートを開くときにその変数にゼロを入れて、初期化しておく。
   詳細セクションで、変数に1ずつ足していく。

と、これで「今何行を印刷中か」が、↓わかるようになるわけですよね。
こいつは既出ですんで、がんばってチャレンジしてみてください。



ここからが本番なワケですが、さて、どんなレポートにしようかな。じゃあ・・・例えば、5行ごとに線を引くようにしてみましょう。
これは、線を表示させたり非表示にしたり、という調節をすれば可能です。
表示非表示は、「可視」というプロパティで調節します。VBAで書くとVisibleですね。

では、例えば、こんなふうに↑書いたとしたら・・・。
さっき使ったMod演算子を再び活用し、5で割った答えが0かどうかを検査します。

と、結果は↑こんな感じです。

線の種類(点線とか実線)を変えることもできます。
「境界線スタイル」というプロパティで変更します。VBAで書くと、プロパティ名は BorderStyle となります。
まずはヘルプで、細かい用法など確認してみてください。



書き方の例としては、こうすると↓

こんなふうになります↓ ・・・赤いと変ですね・・・。

いけてます?これ、工夫次第でいろいろ応用が利きそうでしょ。
でもでも、残念ながらこれって、「詳細セクションの印刷時イベント」ってもんがあるレポートだけの特権なんですよね。
同じことをフォームでやろうと思っても、フォームではできないんです。

表形式のフォームの場合は、「条件付き書式」という機能を使えば、似たようなことができるかもしれませんが・・・。
興味ある方は、「条件付き書式」、ヘルプで調べてみてくださいね。うまいこと使いこなせば、いろいろ応用できると思います。