トップ > Access2007目次 > 練習3:納品書作成データベース(9)
1)2)3)4)5)6)7)8)9)

練習3:納品書作成データベース(9)

最後の最後に・・・作成した「納品書」レポートを、どうやって印刷するか、いつ印刷するべきか、ということを考えます。えーと、まあ、主に私が考えますが、皆さんも考えてみてください。
納品書は通常、受注や請求のシステムと連動しているものかもしれませんが、今日はそこまで大掛かりなことをやるわけにもいかないので、納品書に印刷したいデータを手入力し、それを印刷する・・・という流れで考えます。つまりは、このコーナーの前半で作成したフォームにデータを入力した後、印刷をしたいってわけなんですよね。
そこで・・・「納品書フォーム」にもうひと手間加えて、「納品書を印刷する」ためのコマンドボタンを作りましょう。

 

1「納品書」を印刷するためのコマンドボタンを作る

操作中「納品書フォーム」をデザインビューで開きます。なんか超ひさしぶりー。
図1:おひさー

 

操作中右端の方の空いているとこに、コマンドボタンを作成します。どこでもいいですよ。

図2:ボタンをひとつ
操作中作成したボタンのプロパティシートを開き、クリック時のイベントを作成します。
図3:クリックしたときどうしてくれよう

 

操作中コードビルダでイベントを作りましょう。マクロでもいいんですけどね。今回はずっと、VBAでイベント作ってますからね。
図4:コードビルダ使うぜ

 

操作中前に作成したコードの下あたりに、新しくイベントが用意されたと思います。
私は、コマンドボタンの名前が「コマンド14」ってなりましたんで、「コマンド14_Click」ってなりましたけど、誰でも必ず「コマンド14」となるとは限らないので、っていうか、別にボタンの名前は何でもいいので、とにかくクリック時のイベントっぽい書き出しになっていることを確認してください。

ここから図14までの間は、ずっと続きの作業です。もうだいたい、雰囲気には慣れてきたころだと思いますが、一段階ずつ少しずつご説明しますぞ。
図5:コマンドボタンをクリックしたときのあれこれをここに

 

操作中やっぱ不安・・・という方は、図14まで目を通してから入力開始してください。くどくど説明は要らない!という方は、一気に入力しちゃってください。
まず、docmdと入力します。
図6:docmdだ

 

操作中次に、半角のドットを入力します。
すると、右図のように、ずらずらっと何やら一覧が表示されたと思います。
図7:なんか出てきた

 

ここで、マクロを作成したときのことをちょっと思い出してみてください。「アクション」を一覧から選びましたよね。
あの「マクロアクション」の一覧なんです。今、皆さんにご覧いただいている一覧は。

docmdって、マクロアクションをVBAで実行したいときの命令文なんですよ。で、ドットを入力することで、docmdで実行できるマクロアクションの一覧が出てくるってわけなんです。
図8:これを思い出すんだ

 

操作中同じマクロアクション、といっても、VBAで漢字ひらがなの命令文ってのはありませんから、全部アルファベット横文字です。一覧の中から、OpenReport というアクションを探しましょう。
「レポートを開く」というマクロアクションに当たります。

マウス操作でスクロールバーを動かして探すのもいいですが、アクションはアルファベット順になっているので、一文字ずつ入力していくとだんだん候補が絞り込まれてきます。O・P・E・N・R くらいまで入力すれば、すぐ、お目当てのOpenReportが青く選択された状態になります。そしたら、TABキーを押せばOK!
図9:失敗したら入力しなおせばいいので、思い切って行動してみて

 

操作中次に、"(半角のダブルコーテーション)で囲んで、レポート名を入力します。さっき作った納品書ですよ。レポートの名前を別のものにしている人は、間違えないように、ご自分で作ったレポートの名前を入力してください。

レポート名を入力できたら、続けて、半角のカンマを入力します。要するに、マクロアクションの引数を入力しているわけですな。
図10:「レポートを開く」アクションの引数を入力しているわけだ

 

操作中引数の入力の際、カンマを入力すると、候補がある場合は右図のように一覧が表示されます。
一つ目の引数は開くレポートの名前(オブジェクト名)でしたが、二つ目の引数はどうやら、どうやって開くかを選ぶみたいですね。
えーと、今回は、いきなり印刷するのではなくて印刷プレビュー表示で開きたいので、acViewPreviewを選びます。
図11:プレビュー

 

操作中で、次の引数を入力するべく、半角のカンマを入力します。
図12:三つ目の引数は?

 

操作中三つ目の引数は、今回は要らないので、続けてもうひとつカンマを入力します。

図13:図の説明。
操作中そして、ここが一番のポイント。「条件式」を入力します。
「納品書」をそのまま印刷したのだと、基になるテーブルの全てのデータを印刷することになりますよね。「納品テーブル」に5件のデータが入っているなら、「納品書」も5ページ分出てきます。つまり、「どの伝票番号の納品データを印刷したいのか」を、しっかり明確にしてやらないとならないってワケで。

図14:あなたが印刷したいのは金の伝票番号ですか?銀の伝票番号ですか?それとも今表示している伝票番号ですか?

操作中 と、いうわけで・・・。
今表示している伝票のデータを印刷するのに、なんでこんなめんどっちいことをしなきゃならんのか、とお思いのアナタ。もう一度、テーブルとフォームの関係、レポートの仕組みをじっくり思い出してください。フォームやレポートは、テーブルの中のデータをきれいに出力(表示・印刷)するための”枠”です。そのことを常にイメージできるようになっておいてくださいよ。
操作中ではでは、フォームを上書き保存し、フォームビューに切り替えましょう。コマンドボタンの実行テストです。

図15:押してみ押してみ
操作中すると、ちょっとわかりにくいかもしれないですが・・・「納品書フォーム」より手前に、「納品書」レポートが印刷プレビュー状態で開きましたよね。「納品書フォーム」で表示していた伝票番号1件分だけ(1ページだけ)、表示されてるはずです。

図16:開いた開いた
操作中後は、これを印刷するだけ。
印刷し終わったら、印刷プレビュー画面を閉じて、「納品書フォーム」に戻ります。
と、いうのが、このデータベースの主な使い方、ということになりますね。
図17:印刷したければするがいいさ

 

2細かい話

では、最後に、細かい話をひとつ・・・。
例えば、の話ですが、下の図のように、新しく納品書データを入力したとします。左端にエンピツマークが出ているところに注目してください。

図18:新規入力だ
エンピツマークが出ている状態で、「納品書印刷」ボタンをクリックしたとします。
図19:↑印刷すると

 

すると・・・「通信欄」にコメントを入力したはずなのに、何も印刷されない!!という状態に陥ります。
前にもちょっとお話したことがあると思いますが、レコードセレクタにエンピツマーク表示中は注意しないとならないんです。
まだ、そのレコードは、そのテーブルの正式なデータとして保存されたことになってないんです。だから、そのテーブルを基にして印刷するように作ったレポートにも、出力されないんですね。

図20:なんで?なんで?通信欄が空欄だわ!これは何かの陰謀よ!
余談中のさらなる余談ですが、印刷プレビュー画面は、右下のスライダーで拡大・縮小を調節することができます。
ぜひお試しください。
図21:余談ですが

 

「納品書フォーム」に話を戻しまして・・・。
この状況を何とかするためには、つまり、フォームの左端のレコードセレクタ上からエンピツマークを消し去っておけばよいのです。
具体的には、別のレコードにカーソルを移動するとか、フォームを一度閉じるとか。
あるいは、今回のように、サブフォーム形式になっているフォームの場合は、右図のように、一旦サブフォームのどこかをクリックしてカーソルを移せば、メインフォームのほうのレコード、つまり「通信欄」の内容はしっかりテーブルに保存される、ってわけです。
だから、フォームの上の方の「納品日」やら「会社番号」やらはちゃんと印刷されるんですよね。入力しながら、エンピツマークの動向をチェックしてみてください。
図22:サブフォームにカーソルを移動すればエンピツマークは・・・

 

ほら、今度はちゃんと印刷されるよ。

でもなぁ・・・いちいち、エンピツマークとか気にしてられないし、「印刷されない項目があるカモ」なんて説明して、納得してくれる人がいるとも思えない。

こういうときの打開策は大きく分けてふたつ。
ひとつめは、誰が操作しても自然にカーソルが移動されるような、エンピツマークが消えるようなフォームのデザインを工夫する。これが理想なんだけど、なかなかね・・・。
で、ふたつめは、印刷する直前に無理くり、今入力中・編集中のレコードを保存する処理を実行するって方法。
というわけで、最後に、この処理を作ってみようかな、と思うわけなんです。
図23:通信欄が印刷されたよ

 

では、ここからが本番。実際に操作しなくてもいいので、「こんなやり方もあるんだな」というところだけ見ておいて下さい。それと、必ずやらなきゃならない操作ってわけでもないので、今までの前置きとセットで見ていってください。意味もわけも理解せずにやり方だけ覚えられても困るってもんですぜ。

操作中では、「納品書印刷」のボタンのクリック時のイベントに、もうひ手間加えるといたしましょう。右図のように、ビルドボタンをクリックします。
図24:クリック時のイベントの・・・

 

操作中印刷をする(レポートを開く)前に、ちょっとした処理を実行するので、右図のように一行、行をあけます。
図25:処理を書き足しますよ

 

操作中命令文は、マクロの「メニューの実行(コマンドの実行)」です。VBAでは、Docmdの中のRunCommandですね。これは、Accessのメニューバーの中にあるメニューを、マクロやVBAなどで実行させるための命令文なんです。
なので、RunCommandの中に、さらにいろいろな命令文があります。acCmdSaveRecordという命令文があるので、探してみてください。
「レコードの保存」というメニューコマンドです。
図26:あったあった

 

操作中コマンドボタンのクリック時のイベントはこんな感じになりました。

図27:レコードの保存をしてから、印刷を開始するってわけだ
これは、「小手先の手法」といった類の操作で、ほんとはこんな姑息なことをしなくても済めばいいんですけどね。でも、Accessの構造上、私たちが「ちょっと印刷できればそれでいいんだけど」という気持ちに沿わない場面に遭遇することも、多々、考えられます。用意された機能やメニューではなく、Accessの構造を理解し、その上で、自分の思ったとおりの動きを実現させるための”創意工夫”が求められるってわけです。
世の中には、喜んで創意工夫をする人と、一から十まで全てソフトウェアの基本機能をメーカーが保証するべきでユーザーに考えさせるなど言語道断だと言い切る人と、二通りいらっしゃるんで、意見が分かれるところではありますね。

5レポートについて(補足)

最後に、レポートについて少しだけまとめておきましょう。
これも創意工夫の範疇なので、決まったやり方はありません。それに、日本におけるAccessの使われ方の中で、レポートは特に、十人いれば十通りの使われ方があり、見栄えや使いやすさに関しても人それぞれ、価値観というか、センスが異なるところであります。あくまでもひとつの例として、軽く読み流してください。

まず、基本形です。下の図のように、ひとつのテーブルの中のデータを、1レコードにつき1行で印刷するタイプのレポートを作った場合・・・名簿とか、商品一覧とか、そういう感じのレポートですかね。こういうのをウィザードなどでちゃちゃっと作ると、
 --------------------------------------------------------------
  (1)レポートヘッダーにレポート名(ラベル)
  (2)ページヘッダーに各フィールドの名前・項目名(ラベルが横に並ぶ)
  (3)詳細に、テーブルの中のレコード件数分の行数が印刷される
  (4)ページフッターに、日付とページ番号。
 --------------------------------------------------------------
という感じになります。(レポートフッターは折りたたまれていて使われない)

図28:コレを土台にして、テキストボックスの大きさなどを変更してデザインを調整すればよい
これが、今回作ったレポートのように、二つのテーブルから親子関係に当たるデータを印刷するタイプのレポートの場合、ウィザードで作らせたデザインに、あれこれ手を加える必要が出てきます。
まず、ウィザードの作らせた状態のレポートだと、
 --------------------------------------------------------------
  (1)レポートヘッダーにレポート名(ラベル)
  (2)ページヘッダーに、親子両方のテーブルの各フィールドの名前・項目名(ラベル)が横に並ぶ。
  (3)グループヘッダー(今回の場合は、伝票番号ヘッダー)に、親テーブルの各フィールドのテキストボックスが並ぶ。
  (3)詳細に、子テーブルの中のレコード件数分の行数が印刷される
  (4)ページフッターに、日付とページ番号。
 --------------------------------------------------------------
という感じになります。(レポートフッターは折りたたまれていて使われない)

図29:親子関係にある二つのテーブルを基にしたレポートの場合だと・・・
このままでは残念ながら・・・・。「納品書」や「請求書」のように、伝票番号ごとに印刷することが業務上はっきりしているレポートの場合は、レポートヘッダーやページヘッダーは使用せず、グループヘッダー中心のレポートに書き換えていったほうがお奨めです。
 --------------------------------------------------------------
  (1)グループヘッダーに、親テーブルの各フィールドのラベルとテキストボックス
  (2)詳細に、子テーブルのレコード件数分の行が印刷される
  (3)グループフッター(通常は表示されていない)に、親テーブルのフィールドの中で、備考など下の方に印刷したいものを。
 --------------------------------------------------------------
ただ、「絶対に1件ずつしか印刷しない。必ず1ページに全てのデータが収まる」と明言できるのであれば、レポートヘッダーやページヘッダーを使っても、特に違いはありません。
あと、伝票番号ごとに1ページずつ印刷するのであれば、ページ番号とかも要らないですよね。
そんなこんなで、印刷する単位が、伝票番号ごとってわかっているのであれば、レポートも、グループヘッダー/フッター単位で考えていったほうがわかりやすいのかな、と思います。
図30:グループヘッダーごとにまとめるのがお奨め

Accessのレポート作成作業は(欧米人があまり興味を示さない分)、けっこうめんどくさいし、もっと機能が揃っててもいいんじゃないかな・・・って、ちょっぴり思ったりもします。でも、完成形をイメージしやすいオブジェクトでもあるので、慣れてくれば、「ある程度ウィザードで作らせて、あれとこれをあっちに移動して、あのプロパティを変更して・・・」と、段取りが頭の中で組めるようになります。
レポートをセンスよく見栄えよく作れるようになると、差が付くもんなので、ぜひ、ご自身ならではのこだわりを持って、レポート作成作業、何度か挑戦してみてください。面倒ですけど、ある程度パターン化しやすい作業でもあるので、すぐ慣れますよ。
このコーナーで作成したデータベースの、サンプルです。 zip形式で保存してあります。
よかったらダウンロードして参考にしてください。

  folder step6.zip
※解凍後: 納品書作成.accdb (450Kb Access2007のみ使用可)

このページのまとめなど

  • レポートを「いつ」「どこから」「どういうタイミングで」印刷したら使いやすいかイメージしよう。
  • フォームから、レコードの入力後すぐにそのレコードを印刷するなら、レコードの状態にも気を配ろう。
  • ウィザードが作るレポートのデザインの特徴を把握し、これを逆手にとってうまく利用していこう。
Next Step!!!
  • Comming Soon!!!!
作成日:2009-02-13

コピーライト