今回は鑑別報告書を印刷するコードを書いていきましょう。予め印刷する枚数等も決めておいて、印刷ボタンを押すとプリントアウトされるというコードも書くことができます。

 

しかし普段使用するプリンタはモノクロで、鑑別報告書はカラープリンタで印刷したい場合もあると思いますし、印刷前にプレビュー画面を見たいという方もいるかもしれませんので、今回は印刷ダイアログ画面を表示するように設定します。ではいきます。

スポンサーリンク

Application.Dialogs(xlDialogPrint).Show

 

vba5-14-1印刷ボタンをダブルクリック。又は右クリックからコードの表示。

 

vba5-14-2こうなりましたね。シートの保存の前も印刷の前も基本的に同じ処理が必要です。つまりVBA講座5-13で書いたコードを使い回す事ができます。

 

vba5-14-3全部コピーします。

 

vba5-14-4Private Sub btnPrint_Click()の下に貼り付けます。ただそのままは使えませんので一部修正します。

 

まず印刷シートをアクティブにしておく必要がありますので、

.Acivate

を加えています。赤枠の部分です。そして赤で×を付けた部分は削除して下さい。ファイルの保存に関するコードは今回は使用しません。

 

まずは印刷ダイアログを表示する方法。

Application.Dialogs(xlDialogPrint).Show

これでOKです。これはこれでまず覚えて下さい。しかしこれだけだとちょっと問題があるんです。

 

先ほど修正したコードの下に

Application.Dialogs(xlDialogPrint).Show

を書いてF5で実行してみてください。

 

vba5-14-5印刷ダイアログが表示されましたね。続いて左下の印刷プレビューを押してみて下さい。

 

vba5-14-6印刷プレビュー画面が出ましたが、frmInputが上に表示されてフリーズしたようになっていませんか?frmInputを閉じる事もできないし、印刷プレビューを閉じる事もできません。

 

そうなんです。ユーザーフォームが開いている状態で印刷プレビューを表示するとユーザーフォームが動作を受け付けなくなってしまいます。

 

そのため印刷プレビューを行う時は、一時的にユーザーフォームを隠すという作業が必要になります。故障ではありませんのでご安心を(笑)。

 

vba5-14-7Excelのタスクバーを右クリックしてウインドウを閉じるを選択すると印刷プレビューが閉じられます。

 

vba5-14-8その後右上の×をクリックしてユーザーフォームを閉じて下さい。

Hideメソッド

 

一時的にユーザーフォームを隠すコード、それがHideメソッドです。

Me.Hide
frmMenu.Hide

今回は上記のように使用します。これを印刷ダイアログボックスを表示する前、つまり

Application.Dialogs(xlDialogPrint).Show

の上に追加して下さい。

 

Meは今開いているfrmInput、そしてfrmMenuもその裏で実は開かれています。それを文字通りHide(隠す)、となります。

 

ユーザーフォームを閉じるコードとしてUnload Meを以前解説しましたよね?

 

Unload Meですと完全に閉じるのでデータは残りませんが、Hideだとあくまで隠すだけなので、印刷プレビューから戻ってもテキストボックスやコンボボックスに入力されたデータはそのまま残っています。そのため今回はHideを使用する方が都合がいいのです。

 

もう一度印刷プレビューを表示させて問題ない事を確認して下さい。大丈夫ですね。

 

さてプレビューを確認したり、実際に印刷した後は、またユーザーフォームを表示する必要がありますよね。それが

frmMenu.Show
Me.Show

になります。

 

frmMenuを表示する。frmInputを表示する。そのまんまですね。ではこのコードを追加して、F5を押して実行します。

 

印刷プレビューを表示させ、印刷プレビューを閉じるを押して戻ると、frmMenuは表示されますが、なぜかfrmInputが表示されませんね。見た目上コードは間違っていません。なぜでしょうか?

スポンサーリンク

vbModalとvbModeless

 

ここでvbModalとvbModelessについてお話します。これまでユーザーフォームを表示する時は

ユーザーフォーム.Show

と書いてきましたね。

 

ですがShowの後に実は省略されている部分があります。

ユーザーフォーム.Show vbModal

vbModalです。これはどういう意味を持つかというと、例えばユーザーフォームを表示している時に「そのユーザーフォーム以外の動作を行う事ができない」という事です。

 

ユーザーフォーム.Show vbModeless

vbModeless。lessは否定を意味しますので上記の逆、つまり「そのユーザーフォーム以外の動作を行う事ができる」となります。

 

Showの後に何も書かなければvbModalとなります。つまり先ほどのコードを省略せずに書くと

frmMenu.Show vbModal
Me.Show vbModal

となります。

 

なぜfrmInputが表示されなかったのか?それはfrmMenuがvbModalで表示されたからです。「frmMenu以外の動作は受け付けないよ!」という状態になっているのです。

 

そのためMe.Showは単純に実行されていない、という事になります。ではどうすればいいのか。答えは出ましたね。

frmMenu.Show vbModeless
Me.Show

これでOKです。Me、つまりfrmInputを表示した後は、frmInput以外の動作はしませんのでこちらはvbModelessは不要です。実際にF5を押して実行してみて下さい。問題なく動作しましたね。

 

もう1つ別の方法もあります。

vba5-14-9frmMenuのプロパティウインドウを見て下さい。下の方にあるShowModalに注目。

 

TrueだとModal、FalseだとvbModelessで表示します。今回はこれをTrueにしてあげればOKです。個人的には最初の方法をオススメします。

 

後者だとfrmMenuが表示されている時にワークシートに数値を入力したりする事が可能です。ワークシートがおかしくなることでエラーが発生する可能性もありますからね。

 

それでは今回は以上とさせて頂きます。お疲れ様でした。次回は医薬品新規登録画面の医薬品引用ボタンの処理について解説します。

>>Excel VBA講座 目次へ