MS Access Tips/Sample and VBA and Blog customize etc...

印刷プレビューに[印刷][閉じる]ボタンを付加する関数-改良版

以前の記事

印刷プレビューに[印刷][閉じる]ボタンを付加するOpenReport互換関数 - hatena chips

の改良版です。

上記の関数は、複数のプレビューを同時に開いたとき、最後に開いたものだけしか[印刷][閉じる]ボタンが付加されません。前に開いていたものからはボタンが消えてしまいます。これを改良して、複数のプレビューにもそれぞれ[印刷][閉じる]ボタンが付加されるようにしました。

また、レポートの開くときイベントから呼び出すことで[印刷][閉じる]ボタンが付加される関数も追加しました。

複数のプレビューにボタン配置

難易度:

まずは、導入法と使用例から。その後で、内容の詳細な解説をします。「使えればいい」というかたは導入法と使用例のみ読まれてもいいです。

導入法

このページ下部のリンクから、お使いのAccessバージョンにあったサンプルファイルをダウンロードします。
Zipファイルになってますので、適当なフォルダーにコピーして開いて正常に動作することを確認してください。

この関数を利用したデータペースファイルに上記のサンプルファイルから下記のオプジェクトをインポートしてください。

フォーム F_PreViewChildMenu
標準モジュール Z

あるいはVBEでサンプルファイルを参照設定しても利用することができます。

参照設定

使用法

レポートの「開くとき」プロパティに、

=AddPreviewMenu()

と設定します。

レポートの「開くとき」プロパティに設定

「開くとき」に [イベント プロシージャ] が設定してある時は、イベントプロシージャ内に、

Call AddPreviewMenu()

と記述します。

これで、ナビゲーション(データベース)ウィンドウでダブルクリックする、マクロの「レポートを開く」アクション、VBAの DoCmd.OpenReport などで普通に印刷プレビューすれば、[印刷][閉じる]ボタンが付いてきます。

レポートの方はいじらずに、

Z.OpenReport "レポート名", acViewPreview

というコードでレポートをプレビューしても、ボタンを付加することができます。
VBEで Docmd.OpenReport を Z.OpenReport に置換すれば一気に変更できて楽です。
こちらの方法の使用法の詳細は下記を参照ください。

印刷プレビューに[印刷][閉じる]ボタンを付加するOpenReport互換関数

お好みで使い分けてください。

解説 OpenReport互換関数

普通はプレビューを複数開くということはあまりないと思いますが、ないとは言えないので対応しておいたほうがいいだろうということで改良することにしました。

[印刷][閉じる]ボタンを配置したフォームを DoCmd.OpenForm で開いて、それをAPIでレポートの子ウィンドウにするという方法なので、通常は同じフォームを複数の開くことはできません。フォームを開いた状態で、DoCmd.OpenForm しても開いてるフォームがアクティブになるだけです。

しかし下記で紹介した Newキーワードでインスタンスを生成する方法なら同じフォームを複数開くことが可能です。

同じフォームを複数表示する
同じフォームを複数表示する その2

問題は、生成した複数のフォームをどこに格納するかです。その1では、配列、その2では Collection に格納しました。開く枚数が不明なので Collection を使うのが良さそうです。

で、その方針で作りかけたのですが、

メニューフォーム(F_PreViewChildMenu)を閉じるとき、 Collection に格納したインスタンスを Remove する必要があります。
ちょっとメンドウだな、、、
そこでふと、F_PreViewChildMenu にパブリック変数を宣言して、そこに格納したらどうだろうと、思い付きました。

F_PreViewChildMenuフォームモジュールでオブジェクト変数をパブリック宣言しておいて、
標準モジュールで Newでインスタンスを生成して、それをその変数に代入しておきます。

自分自身を、自分自身内の変数に格納する、なんか非常にトリッキーな感じですが、テストしてみると問題なく動作しているようです。

オブジェクト変数に代入すると言っても、オブジェクトがまるごと格納されるわけではなくアドレスが格納されるだけなので、たぶん問題ないのだろう、と理解してますが、この考えであっているのかは自信無いです。

レポートに設定する関数

OpenReport互換関数は使わずに、レポートの開くときに設定する関数も追加しました。やっていることはOpenReport互換関数と同じです。が、直接印刷した場合はボタンは必要ないので、プレビューか印刷かの判断を「開くとき」イベントで行う必要か有ります。これは、下記で紹介した方法を使用しました。

レポートで印刷かプレビューか判断する

フォーム設計

フォーム上にコマンドボタンを2つ配置して下記のように設定します。

プロパティ設定
名前cmdPrint
標題印刷(&P)
プロパティ設定
名前cmdClose
標題閉じる(&C)

フォームのサイズはなるべく小さくします。
フォーム名は、F_PreviewPopupMenu とします。
フォームのプロパティ設定は下記のようになります。

プロパティ設定
標題印刷プレビュー
境界線スタイルなし
レコードセレクタいいえ
サイズ自動修正はい
移動ボタンいいえ
コントロールボックスいいえ
閉じるボタンいいえ
最小化/最大化ボタンいいえ
ポップアップはい

フォームデザインビュー

コード

標準モジュール モジュール名 Z

F_PreViewChildMenu フォームモジュール

サンプルファイルが下記からダウンロードできます。
RptPreViewMenuFunc2_07.zip (Access 2007-2010 形式 - 43kb)
RptPreViewMenuFunc2.zip (Access 2002-2003 形式 - 32kb)
RptPreViewMenuFunc2_2k.zip (Access 2000 形式 - 31kb)


拍手する

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/404-00601d10
該当の記事は見つかりませんでした。