レポートの印刷プレビューウィンドウにボタンを配置する
リボン(2003以前なら、メニューバー、ツールバー)を非表示にしていたり、レポートの「ポップアップ」を「はい」にしているとき、印刷プレビューから印刷しようとすると、右クリックメニューかCtrl+Pなどのショートカットキーで印刷することになります。ユーザーのことを考えれば、できればボタンクリックで印刷できるようにしたいですね。
掲示板でもたまに、プレビュー画面にボタンを配置したいという質問があります。レポートのデザインビューでコマンドボタンを配置できますが、レポートビューでは表示されて機能しますが、印刷プレビューにすると表示されません。
今回は、印刷プレビュー画面で「印刷」「閉じる」ボタンを配置、機能させる方法を検討してみます。
難易度:
ポップアップフォームにボタンを配置
フォーム上にコマンドボタンを2つ配置して下記のように設定します。
プロパティ | 設定 |
---|---|
名前 | cmdPrint |
標題 | 印刷(&P) |
プロパティ | 設定 |
---|---|
名前 | cmdClose |
標題 | 閉じる(&C) |
フォームのサイズはなるべく小さくします。
フォーム名は、F_PreviewPopupMenu とします。
フォームのプロパティ設定は下記のようになります。
プロパティ | 設定 |
---|---|
標題 | 印刷プレビュー |
境界線スタイル | ダイアログ |
レコードセレクタ | いいえ |
サイズ自動修正 | はい |
移動ボタン | いいえ |
コントロールボックス | いいえ |
閉じるボタン | いいえ |
最小化/最大化ボタン | いいえ |
ポップアップ | はい |
フォームのモジュールを下記のように設定します。開くレポート名は「仕入先」の例です。
レポートの「閉じる時」のイベントプロシージャを下記のように設定します。
ポップアップでないレポートだとフローティングツールボックスの感じになりよさそうです。
ポップアップのレポートだと、レポートウィンドウの背後に隠れたりすると使えなくなるという弱点があります。Win API を使って「常に前面に表示」属性にするという方法も考えられます。興味がある方はチャレンジしてみてください(SetWindowPos を使います)。
プレビューウィンドウをフォームの子ウィンドウにする
Windowsには親ウィンドウ、子ウィンドウという概念があります。
子ウィンドウは親ウィンドウが移動するとそれについて一緒に動きます。
上記の画像はレポートのプレビューのように見えますが、ボップアップフォームの中にプレビューウィンドウが子ウィンドウとして載っています。レポートの「境界線スタイル」が「いいえ」になっているので分かりにくいですが、「境界線スタイル」を「サイズ変更可」にすると、子ウィンドウだとよく分かります。(下図)
F_PreviewPopupMenu をコピーして貼り付けます。名前は、F_PreviewParentMenu とします。
フォームのサイズを広げます。このフォーム内にプレビューが入りますので、レポートが十分表示できるサイズにします。
プロパティは下記のように変更します。他のプロパティはそのままでOKです。
プロパティ | 設定 |
---|---|
境界線スタイル | 細線 |
レポートも「仕入先」をコピーして「仕入先1」とします。
レポートのプロパティは下記のようにします。
プロパティ | 設定 |
---|---|
境界線スタイル | なし |
ポップアップ | はい |
ポップアップは「はい」にしてください。「はい」にしないとレポートプレビューを操作することができません。
フォームのモジュールは下記のように記述します。
親ウィンドウにするには Win API の SetParent 関数を使います。
レポートの閉じるときイベントプロシージャは上記のそのままでOKです。
これでボタンとプレビューが違和感なく一体化されて表示されます。ただし、ウィンドウサイズは変更できません。これは、フォーム(親ウィンドウ)のサイズを変更してもプレビューのサイズは追随してくれないので、フォームの 境界線スタイル を 細線 にしてリサイズ出来ないようしてあるからです。
「サイズ変更時」イベントでなんとかしようと思ったのですが、子ウィンドウにしてしまうと、DoCmd.MoveSize や Moveメソッドではうまくサイズ変更できなかったので、しかたなくサイズ変更できない仕様としました。
これもWin API を使えばなんとかなるかもしれませんので、やる気のある方はチャレンジしてみてください。
ボタンのフォームをプレビューの子ウィンドウにする
今度は逆に、ボタンフォームを子ウィンドウ、プレビューウィンドウを親ウィンドウにしてみます。
F_PreviewPopupMenu をコピーして貼り付けて、名前を F_PreViewChildMenu とします。下記のプロパティを変更します。
プロパティ | 設定 |
---|---|
境界線スタイル | なし |
レポートも「仕入先」をコピーして「仕入先2」とします。
フォームのモジュールは下記のようになります。
2015/03/05追記:Access2003以前でコマンドボタンで閉じるときエラーが出てAccessが強制終了する不具合があったのでコードを修正しました。サンプルを入れ替えましたので再ダウンロードしてください。
レポートのモジュールのコードは不要なので削除しするか、「コード保持」プロパティを「いいえ」にします。
フォームを子ウィンドウにしたので、プレビューを閉じると道連れに閉じてくれるので、フォームを閉じるコードが不要なためです。
これならプレビューウィンドウのサイズも変更できます。ただ、画像のようにボタンとプレビューが重なる場合がありますが、ボタンを小さくしておけばそれほど問題にはならないと思います。
プレビューウィンドウのサイズが固定でいいのなら前者の方法、サイズ変更したいのならこちらの方法と使い分ければいいかと思います。
今回の記事は、プレビューにボタンを配置できるかどうか、できるならどの方法がいいのか、検証するための実験的なものなので、このままでは、使いにくいものになっています。次の記事で、Docmd.OpenReport の代わりに使える汎用関数を紹介してますのでご参照ください。
印刷プレビューに[印刷][閉じる]ボタンを付加するOpenReport互換関数
サンプルファイルが下記からダウンロードできます。
RptPreViewInFormTest_07.zip (Access 2007-2010 形式 - 36kb)
RptPreViewInFormTest.zip (Access 2002-2003 形式 - 39kb)
RptPreViewInFormTest_2k.zip (Access 2000 形式 - 36kb)