<HOME  <お願い事項   <Access2002 TOP   <Access97 TOP   <サイト内検索
 Access2000物置き>印刷設定をするプロシージャ例_2000



【仕 様 な ど】MS-Access2000で作成。Windows98/WindowsNTで動作確認。

【ダウンロード】←Zip形式

            (解凍後、mdb初期状態:およそ168KB)

 【主 な 機 能】ヘルプの「PrtDevModeの使用例」に載っていたソースをそのまま使ってます。要VBA知識。


MS-Access97の世界の方に置いてたやつをそのまま持ってきました。
このサンプルでは、下のような手作りフォームから、印刷部数とか、用紙の大きさとか、用紙の向きなどを指定して印刷(サンプル内ではプレビュー画面にしてます)するプロシージャをご紹介してます。

必ずPrtDevModeのヘルプを参照してください。


残念ながら、わたしが動作確認をしているのはこのの3種の設定だけで、他の設定変更は試していません。
どうやら、プロパティによっては、これだけでは変更ができないものなどあるようです。



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

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

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


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

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

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

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

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

あんまり用紙の大きさとか向きっていう概念、ないんですかねぇ。世界視野で見ると・・・。
んじゃ、用紙の大きさや向きといった情報はいったいどこに保存されているのか・・・。どっかに保存されているのでしょうが、マウスでいじれるようなところにはなさそうです。

んじゃ、どうやって用紙のサイズを変えるのかというと・・・???
方法はひとつです。
レポートをとりあえずデザインビューかプレビューかどっちかで開き(デザインの方がいいでしょう)、メニューバーの[ファイル]→[ページ設定]を開きます。で、この中のページ設定を変更します。

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



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

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

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

その辺はわたしもよくわからんのですが・・・。
とにかく、ExcelやWordのようにはいかんな、ということになりそうです。


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

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

ヘルプからそのままパクってきました。必ずPrtDevModeのヘルプ、読んでくださいね。

メンバ 内容
DeviceName 最大 32 バイトの文字列で、ドライバがサポートする装置の名前を示します。たとえば、指定されたプリンタが Hewlett-Packard LaserJet IIISi の場合は、"HP LaserJet IIISi" が装置名です。各プリンタ ドライバには、固有の文字列の名前が付いています。
SpecVersion 『Win32 Software Development Kit』の DEVMODE 構造体のバージョン番号を指定する整数型 (Integer) の値です。
DriverVersion プリンタ ドライバの開発者によって割り当てられたプリンタ ドライバのバージョン番号を指定する整数型の値です。
Size DEVMODE 構造体のサイズをバイト数で指定した整数型の値です。この値には、この構造体の後に任意に続けることができる、装置独自のデータを格納する dmDriverData メンバのサイズは含まれません。データのデバイス依存の部分のみがアプリケーションによって操作される場合は、このメンバを使って、バージョンの違いを考慮せずに、構造体のサイズを調べることができます。
DriverExtra 装置独自のデータを格納するオプションの dmDriverData メンバのサイズを、バイト数で指定した整数型の値です。このメンバは、この構造体の後ろに続けることができます。装置独自の情報がアプリケーションによって使われない場合は、このメンバに 0 を設定します。
Fields DEVMODE 構造体内でどのメンバが初期化されているかを示す長整数型 (Long) の値です。特定の定数の組み合わせであっても、何も指定しなくてもかまいません。
Orientation 用紙の方向を指定する整数型の値です。1 (縦方向) または 2 (横方向) を指定できます。
PaperSize 印刷する用紙のサイズを指定する整数型の値です。このメンバに 0 から 256 までを設定した場合は、用紙の長さと幅が、それぞれ PaperLength メンバと PaperWidth メンバによって指定されます。それ以外の値を設定した場合は、PaperSize メンバに、あらかじめ定義された値を設定できます。
PaperLength 1/10 ミリ単位で用紙の長さを示す整数型の値です。独自の用紙サイズに対して、または多様な用紙サイズに印刷できるドット マトリックス方式のプリンタなどの装置に対して PaperSize メンバで指定された用紙の長さよりも、このメンバの値が優先します。
PaperWidth 1/10 ミリ単位で用紙の幅を指定する整数型の値です。PaperSize メンバで指定された用紙の幅よりも、このメンバの値が優先します。
Scale 印刷の出力が縮小される因数を指定する整数型の値です。見た目のページ サイズは、scale/100 の因数で物理的なページ サイズから縮小されます。たとえば、Scale の値を 50 にした 8.5 x 11 インチのレター サイズの用紙には、出力されるテキストとグラフィックスが元の高さと幅の半分であるので、17 x 22 インチの用紙と同じ量のデータを含めることができます。
Copies 印刷装置が複数ページの複写をサポートしている場合は、部数を示す整数型の値です。
DefaultSource 用紙を送る既定のビンを指定する整数型の値です。
PrintQuality プリンタの解像度を指定する整数型の値です。指定できる値は 4 (高)、3 (中)、2 (低)、および 1 (ドラフト) です。
Color 整数型の値です。カラー プリンタに対して、出力をカラーで印刷するかどうかを示します。指定できる値は、1 (カラー) および 2 (モノクローム) です。
Duplex 整数型の値です。両面印刷できるプリンタに対して、出力が用紙の両面に印刷されるかどうかを示します。指定できる値は、1 (片面)、2 (水平)、および 3 (垂直) です。
YResolution プリンタの y 軸の解像度をインチ当たりのドット数 (dpi) で指定する整数型の値です。プリンタがこのメンバを初期化する場合、PrintQuality メンバは、プリンタの x 軸の解像度を dpi で示します。
TTOption TrueType フォントがどのように印刷されるかを示す整数型の値です。
Collate 印刷部数が複数ある場合に、照合を行う必要があるかどうかを示す整数型の値です。データはプリンタに 1 回だけ送られるので、照合を行わない方が、速く、効率的に印刷できます。
FormName 用紙のサイズを示す 16 字までの文字列です。たとえば、"レター" や "標準" があります。
Pad 将来のバージョン用にスペース、文字、値などを埋めるために使う長整数型の値です。
Bits ディスプレイ装置のカラー解像度をピクセル当たりのビット数で示す長整数型の値です。
PW 表示装置の表面 (画面またはプリンタ) の幅をピクセルで示す長整数型の値です。
PH 表示装置の表面 (画面またはプリンタ) の高さをピクセルで示す長整数型の値です。
DFI 装置の表示モードを示す長整数型の値です。
DFR 特定のモードの表示装置の周波数を hertz (秒当たりのサイクル数) で示す長整数型の値です。

うへぇぇぇ・・・。くらくらします。
わけわかりませんね。
「わたしは用紙のサイズだけ変更できればいいから、PaperSizeに値を代入すればいいのね」というのはだめ〜。これは全部セットです。
つまり、これら全部のメンバを、ひとつひとつプロシージャの中で変数にして、その変数をずらっと上記の順番につなげて、PrtDevModeというプロパティにぶち込まなければならないわけです。

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

で、ポイントは

1)とにかくまず、レポートを何らかのカタチで開く(デザインビューでこっそり開くのがよいでしょう)
2)上記の各メンバを配列として宣言する。
3)フォームのテキストボックスやコンボボックスから、該当する値を拾い、PrtDevModeの新しい値を作成する。
4)レポートを保存しながらいったん閉じる。
5)で、そのレポートをもう一度開く(今度は印刷してもよいし、プレビューでもいいでしょう)

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

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

これらは全部セット。上記のメンバが順番に並んで、94バイトのひとつの値を形成します。どれか抜けても、使わないからといって宣言しないで省いてもだめ〜。
ここの部分は欲張らず、PrtDevModeのヘルプの使用例からそっくりコピーして持ってきましょう。

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

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

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

くどいですがこの動作を作る前に、必ずPrtDevModeのヘルプをお読みください。
絶対読んでくださいね。