今回は鑑別報告書を印刷するコードを書いていきましょう。
予め印刷する枚数等も決めておいて、印刷ボタンを押すとプリントアウトされるというコードも書くことができます。
しかし普段使用するプリンタはモノクロで、鑑別報告書はカラープリンタで印刷したい場合もあると思いますし、印刷前にプレビュー画面を見たいという方もいるかもしれません。
そのため今回は印刷ダイアログ画面を表示するように設定したいと思います。ではいきます。
スポンサーリンク
Application.Dialogs(xlDialogPrint).Show
印刷ボタンをダブルクリック。又は右クリックからコードの表示。
シートの保存の前も印刷の前も基本的に同じ処理が必要です。つまりVBA講座5-13で書いたコードを使い回す事ができます。
全部コピーします。
Private Sub btnPrint_Click()の下に貼り付けます。ただそのままは使えませんので一部修正します。
まず印刷シートをアクティブにしておく必要がありますので、
を加えています。赤枠の部分です。そして赤で×を付けた部分は削除して下さい。ファイルの保存に関するコードは今回は使用しません。
印刷ダイアログを表示する方法ですが、
これでOKです。これはこれで定型文のようなものなので、まず覚えて下さい。
しかし今回はこれだけだとちょっと問題があるんですね。
先ほど修正したコードの下に
を書いてF5で実行してみてください。
印刷ダイアログが表示されましたね。続いて左下の印刷プレビューを押してみて下さい。
印刷プレビュー画面が出ましたが、frmInputがその上に表示されてフリーズしたようになっていませんか?
frmInputを閉じる事もできないし、印刷プレビューを閉じる事もできません。
そうなんです。
ユーザーフォームが開いている状態で印刷プレビューを表示すると、ユーザーフォームが動作を受け付けなくなってしまいます。
そのため印刷プレビューを行う時は、一時的にユーザーフォームを隠すという作業が必要になります。
パソコンの故障ではありませんのでご安心を(笑)。
それではExcelのタスクバー(パソコン画面下のExcelのタブ)を右クリックしてウインドウを閉じるを選択すると、印刷プレビューが閉じられます。
その後右上の×をクリックしてユーザーフォームを閉じて下さい。
Hideメソッド
先ほどユーザーフォームを一時的に隠すというお話をしました。それを行うのがHideメソッドです。
frmMenu.Hide
今回は上記のように使用します。
これを印刷ダイアログボックスを表示する前、つまり
の上に追加して下さい。
Meは今現在開いているfrmInputを意味します。
そしてfrmMenu(システムで起動時に表示されるユーザーフォーム)も実はその裏で開かれています。
それを文字通りHideする(隠す)のがHideメソッドです。
ここでこう思う方もいるかもしれませんね。
「ユーザーフォームを閉じるならUnload Me」でも良いんじゃないの?」
ですが、今回は「Unload Me」よりも「Hide」を使用する方が都合がいいのです。その理由を解説しますね。
「Unload Me」はユーザーフォームを完全に閉じることになりますので、テキストボックスやコンボボックスに入力されたデータは残りません。
しかし「Hide」はあくまで隠すだけ(システム利用者に見えないようにするだけ)なので、印刷プレビューから戻ってもテキストボックスやコンボボックスに入力されたデータがそのまま残っているからです。
それではコードを追加した状態で、もう一度印刷プレビューを表示させて問題ない事を確認して下さい。大丈夫でしょうか?
さてプレビューを確認したり、実際に印刷した後は、またユーザーフォームを表示する必要がありますよね。それが
Me.Show
になります。
「frmMenuを表示する。」「frmInputを表示する。」そのまんまですね。
ではこのコードを追加して、F5を押して実行します。
印刷プレビューを表示させ、印刷プレビューを閉じるを押して戻ると、frmMenuは表示されますが、なぜかfrmInputが表示されませんね。
見た目上コードは間違っていません。なぜでしょうか?
スポンサーリンク
vbModalとvbModelessとは?
ここでvbModalとvbModelessについてお話します。
これまでユーザーフォームを表示する時は
と書いてきましたね。
ですがShowの後に実は省略されている部分があるのです。それがvbModalとvbModelessになります。
vbModalはどういう意味を持つかというと、例えばユーザーフォームを表示している時に「そのユーザーフォーム以外の動作を行う事ができない」という事です。
vbModeless。lessは否定を意味しますので上記の逆、つまり「そのユーザーフォーム以外の動作を行う事ができる」となります。
ちなみにShowの後に何も書かなければvbModalとなります。つまり先ほどのコードを省略せずに書くと
Me.Show vbModal
となっているのです。
ではなぜfrmInputが表示されなかったのか?
それはfrmMenuがvbModalで表示されたからです。「frmMenu以外の動作は受け付けないよ!」という状態になっているのです。
そのためMe.Showは単純に実行されていない、という事になります。
ではどうすればいいのか。答えは出ましたね。
Me.Show
これでOKです。Me、つまりfrmInputを表示した後は、frmInput以外の動作はしませんのでこちらはvbModelessは不要です。
上記を追加したあと、実際にF5を押して実行してみて下さい。問題なく動作しましたね。
ちなみにもう1つ別の方法もあります。
frmMenuのプロパティウインドウを見て下さい。下の方にあるShowModalに注目。
TrueだとvbModal、FalseだとvbModelessで表示します。
今回はこれをTrueにしてあげればOKです。ですが、個人的には最初の方法をオススメします。
後者だとfrmMenuが表示されている時にワークシートに数値を入力したりする事が可能となってしまいます。
システム利用者が下手にワークシートをいじってしまうことでエラーが発生する可能性もあることは覚えておきましょう。
それでは今回は以上とさせて頂きます。お疲れ様でした。
次回は医薬品新規登録画面の医薬品引用ボタンの処理について解説します。