<HOME  <お願い事項   <Access2002 TOP   <Access2000 TOP   <サイト内検索
 MS-Access97大魔法陳列棚>印刷設定をするプロシージャ



【仕 様 な ど】MS-Access97で作成。Windows95でのみ動作確認。

【ダウンロード】←Zip形式
              (解凍後、mdb初期状態:およそ126KB)

【主 な 機 能】

mdbファイルを別のパソコンにコピーしたら、印刷設定がもとに戻っちゃってる〜というご経験、ありません?


【作 り 方 等】

このサンプルでは、下のような手作りフォームから、印刷部数とか、用紙の大きさとか、用紙の向きなどを指定して印刷(サンプル内ではプレビュー画面にしてます)するプロシージャをご紹介してます。
残念ながら、わたしが動作確認をしているのは以下の3種の設定だけで、他の設定変更は試していません。どうやら、プロパティによっては、これだけでは変更ができないものなどあるようです。

「Accessのデータベースを家で作って、ばっちりだったのでフロッピーディスクにコピーして会社のパソコンに入れたら、A3横サイズに設定したはずのレポートが、プレビューで見ると全部A4縦サイズになってる!」なんてこと、ありませんでした?

これは、基本的にどうしようもないことなんです。こういうものなんです。

これをなんとかしようと思って作ってみたのがこのサンプルです。のっけから腰抜けですが、ほんとうは、別のPCにコピーしたり印刷装置の機種を変更したりしたら、印刷の設定はもとに戻ってしまうもので、その都度ページ設定し直すものなのだと理解しなければなりません。

しかししかし、これをしてバグだバグだとのたまう人も多い。バグではないです〜。そういう意味で使う言葉じゃないのだ〜バグって〜!!

こういうご質問、結構今までにもあったんで、多分みなさん目指しておいでのことは同じかなと思います。実際、わたしも「これくらいレポートのプロパティとかに持てないのかよ」と思ったりしてるんですが、そこはあまり声に出さず、自分なりにちっこい仕組みを作ってみました。

Accessのいまいちなとこ第2位ですねぇ・・。わたしの中では。。。


まず、印刷の仕組みについてカンタンに考えてみようと思います。

MS-Excelという表計算ソフトがありますね。あれは、画面ではどのセルにどう入力したらA4縦サイズの用紙に入りきれるのか、そういう考え方はないんです。しかし、最近の新しいバージョンでは、印刷の設定のところで、用紙の大きさや向き、縮小印刷の設定など、けっこう細かいことができるようになっています。そして、これらの情報は、このファイル(.xls)の情報として、保存時にいっしょに記憶されます。

つまり、このxlsファイルをフロッピーディスクにコピーして自宅に持ちかえって家のPCで開いても、この用紙の設定はファイルに記憶されているので、そのまま継承されるというわけです。

ワープロなんかも大概そうですよね。B4横の用紙に入力し始めたら、B4横の印刷ができる印刷装置を使っていさえすれば、べつにどこでどう印刷しようと、B4横で出てきます。考えるこたぁないですよね。

しかし・・・

Accessのレポートって、そうはいかないと思いません?

わたしの記憶に間違いがなければ、パソコン変ったり別のプリンタから出すようにしたりすると、だいたいどのプリンタもA4縦が基準らしく、A4縦で印刷する状態になってしまってるような気がします。

これはなぜか!!??

レポートなんていう名前がついていながら、なぜ??(黄色い声)


レポートのプロパティをじっくり見てみても、どこにも「用紙サイズ」なんていう項目はないです。
デザイン画面で、横幅を設定しますけど、マウスでびよーんとドラッグできちゃいますよね。こんなカンタンに広げたり狭めたりできちゃって、それがそく用紙の大きさ設定に反映されているとはとても思えない気軽さです。

実際、まったく反映されていません。

あんまり用紙の大きさとか向きっていう概念、ないんですかねぇ。世界視野で見ると・・・。

んじゃ、用紙の大きさや向きといった情報はいったいどこに保存されているのか・・・。どっかに保存されているのでしょうが、マウスでいじれるようなところにはなさそうです。


んじゃ、どうやって用紙のサイズを変えるのかというと・・・???

方法はひとつです。

レポートをとりあえずデザインビューかプレビューかどっちかで開き(デザインの方がいいでしょう)、メニューバーの[ファイル]→[ページ設定]を開きます。で、この中のページ設定を変更します。

で、このレポートを保存しながら閉じます。

あるいは、印刷するときに印刷のコモンダイアログを出して、プロパティボタンをクリックし、印刷装置のプロパティを変更することで対応してもよいでしょう。

どっちにしても、Accessのオブジェクトの操作をするのではなく、プリンタドライバのプロパティをいじるという動作になります。

レポートはレポートなんて名前ですけど、用紙の大きさや向きといった情報は、印刷する印刷装置のドライバ任せのようです。なので、印刷装置が変ったり、PCが変ったりしたら、変っちゃってるように見えるんですね。実際には変っちゃってるんじゃなくて、もともとそんな情報、レポートの中には残ってないのかもしれません。

その辺はわたしもよくわからんのですが・・・。

とにかく、ExcelやWordのようにはいかんな、ということになりそうです。


で、どうやるのかというと、上記の印刷ダイアログボックスの各値に、直接設定値を代入するプロシージャを作ります。このダイアログのプロパティ名をPrtDevModeといいます。

なあんだ、と思うなかれ。これはAccessのオブジェクトのプロパティではありません。PrtDevModeというプロパティは、いくつもの細かい設定値がつながって、ひとつの値を形成しています。個々の設定値のことを、メンバと表現するとして、こんないっぱいメンバがあるのです。

メンバ名 ひとくちメモ
DeviceName ドライバがサポートする印刷装置の名前。
SpecVersion 『Win32 Software Development Kit』の DEVMODE 構造体のバージョン番号
DriverVersion プリンタ ドライバのバージョン
Size DEVMODE 構造体のサイズをバイト数で指定
DriverExtra 装置独自のデータ
Fields DEVMODE構造体内でどのメンバが初期化されているかを示す長整数型 (Long) の値
Orientation 用紙の方向。1 (縦方向) または 2 (横方向) 。
PaperSize 印刷する用紙のサイズ。詳細はPrtDevModeヘルプ参照。
PaperLength 1/10 ミリ単位で用紙の長さを示す整数型の値。PaperSizeより優先される。
PaperWidth 1/10 ミリ単位で用紙の幅を示す整数型の値。PaperSizeより優先される。
Scale 印刷の出力が縮小される因数
Copies 印刷部数
DefaultSource 用紙を送る既定のビンを指定。PrtDevModeヘルプ参照。
PrintQuality プリンタの解像度。 4 (高)、3 (中)、2 (低)、および 1 (ドラフト)。
Color カラー プリンタに対して、出力をカラー印刷の有無を指定。1 (カラー) および 2 (モノクローム) 。
YResolution プリンタの y 軸の解像度をインチ当たりのドット数 (dpi) で指定
Duplex 両面印刷できるプリンタに対して両面印刷の有無を指定。1 (片面)、2 (水平)、および 3 (垂直) 。
TTOption TrueType フォントがどのように印刷されるかを示す。PrtDevModeヘルプ参照。
Collate 印刷部数が複数ある場合に、照合を行う必要があるか。
FormName 用紙のサイズを示す 16 字までの文字列
Pad 調整用。
Bits ディスプレイ装置のカラー解像度
PW 表示装置の表面 (画面またはプリンタ) の幅
PH 表示装置の表面 (画面またはプリンタ) の高さ
DFI 装置の表示モード
DFr 特定のモードの表示装置の周波数

うへぇぇぇ・・・。くらくらします。

「わたしは用紙のサイズだけ変更できればいいから、PaperSizeに値を代入すればいいのね」というのはだめ〜。これは全部セットです。

つまり、これら全部のメンバを、ひとつひとつプロシージャの中で変数にして、その変数をずらっと上記の順番につなげて、PrtDevModeというプロパティにぶち込まなければならないわけです。

このサンプルでは、OrientationPaperSizeCopiesの3つのメンバに、フォームから選択した任意の値を代入する動作を作ってみました。
まあ・・・この3つが一番使うかなぁと思いまして・・。あとはプリンタのドライバを変更するとか、それくらいかなぁ。よく意味のわからんメンバもありますねぇ。

で、ポイントは

1)とにかくまず、レポートを何らかのカタチで開く(デザインビューでこっそり開くのがよいでしょう)

2)上記の各メンバを配列として宣言する。

3)フォームのテキストボックスやコンボボックスから、該当する値を拾い、PrtDevModeの新しい値を作成する。

4)レポートを保存しながらいったん閉じる。

5)で、そのレポートをもう一度開く(今度は印刷してもよいし、プレビューでもいいでしょう)

1)は絶対不可欠。最初にお話したように、Accessのプリンタおよびページ設定というのは、レポートそのものの情報として保存されるわけではありません。
「今アクティブになってるレポートの印刷設定」という意味合いになりますので、とにかく何とかして開いてないといけません。プレビューというのは複雑なレポートの場合などだと負荷が大きいような気がするので、こっそりデザインビューで開いて、こっそり閉じてしまうのがよいでしょう。

2)は、変数をひとまとめにして操作できるよう、配列として宣言します。ちょっとめんどうですが、できればメンバと同じような名前にした方が、どの変数にどの値が入るのか分かりやすいと思います。

これらは全部セット。上記のメンバが順番に並んで、94バイトのひとつの値を形成します。どれか抜けても、使わないからといって宣言しないで省いてもだめ〜。

ここの部分は欲張らず、PrtDevModeのヘルプの使用例からそっくりコピーして持ってきましょう。


サンプルではフォームから任意の値を代入するようにしました。
印刷部数は、印刷プレビューではわからないですが、印刷ツールボタンで印刷すれば、指定した部数印刷されてくるはずです。用紙の大きさや向きは、プレビューでも確認いただけると思います。

この処理を一度くぐらせれば、印刷装置が変ったり他のPCにコピーしたりしない限り、用紙の大きさや向きはずっと継承されるはずです。ということは、A3用紙固定のレポートなら、毎回こんな処理をせず、PaperSizeに8を代入(8はA3用紙をあらわす数値です。詳しくはPrtDevModeのヘルプ参照)するよう固定値にしてしまえばよいと思います。

で、一回くぐらせれば、あとは必要ないでしょう。他のPCにコピーして最初に実行するセットアッププログラムみたいなのを工夫して作ってみてもよいかもしれないですね。

まあ・・・次のバージョンあたりで、こんなことしなくてもよくなっちゃうかもしれないですが・・・(笑)。


この動作を作る前に、必ずPrtDevModeのヘルプをお読みください。
というか、絶対読んだ方がいいと思う。