VBAで印刷プレビューをするためにPrintPreviewメソッドを使っていますか?
PrintPreviewメソッドはエクセルでは頻繁に使いますが、PrintPreviewを実行するとエクセルがフリーズするといった声が寄せられます。
今回はPrintPreviewメソッドで印刷プレビューを表示するとフリーズしてしまうときの対処方法について徹底的に説明していきます。
PrintPreview(印刷プレビュー)すると フリーズになるときの対処方法
PrintPreviewメソッドでフリーズする原因
PrintPreviewでフリーズする原因は以下のような理由が考えられます。
- 印刷プレビュー実行後のアクティブになるワークシートが不定になっている
- ユーザフォームがモーダルになっている
それぞれについて説明していきます。
印刷プレビュー実行後のアクティブになるワークシートが不定になっている
印刷プレビューを実行しようとしたときにアクティブになっているワークシートと違うワークシートの印刷プレビューを実行したときにフリーズしたり、速度が遅くなったりする場合があります。
例えば、
Sheet1がアクティブになっている時に、
Sheet2.PrintPreviewを実行
このような場合、 PrintPreview(印刷プレビュー)を実行後、印刷プレビューの画面を閉じると、どのワークシートをアクティブにするか不定になってしまい、結果的に速度が遅くなったり固まったりしてしまう事があります。
したがって、印刷プレビュー実行後にアクティブにするワークシートは、必ず明示的に指定しておいた方が良いです。
例えば、
Sheet2.PrintPreview
Sheet1.Activate
のようにすることで、余計な問題が生じずにすみます。
ユーザフォームがモーダルになっている
ユーザーフォームに配置したコマンドボタンを使って印刷プレビューを表示できるように、PrintPreviewメソッドを使ったマクロを実行したときにフリーズする場合があります。
これは、ユーザーフォームがモーダルに設定されていることにより、印刷プレビュー画面とユーザーフォームが同時表示されて操作不能になってしまう現象です。
フリーズしてしまったら、エクセルを「Ctrl+Alt+Delete」で強制終了させるしかありません。
念のため、フリーズしてしまうコードは以下のとおりです。(このままだとフリーズします!!)
Private Sub CommandButton1_Click()
ActiveSheet.PrintPreview ’このままだとフリーズします!!
End Sub
対処方法としては、
- 印刷プレビューを表示するときに、ユーザーフォームを「 Hideメソッド」で 隠す
- ユーザーフォームを「vbModeless」でモードレスに設定する
※ユーザーフォームのデフォルトの設定はモーダルです!
モードレスに設定することで、ユーザーフォーム以外を操作することができるようになります。
また、印刷プレビューを表示したときにユーザーフォームが画面に重なってしまうので、Hideメソッドで一時的にユーザーフォームを隠します。
上記を実装したサンプルコードは以下のようになります。
Private Sub CommandButton1_Click()
Me.Hide
ActiveWindow.ActiveSheet.PrintPreview
Me.Show vbModeless
End Sub
これでPrintPreviewメソッドで印刷プレビューを表示しても、フリーズすることなく動作するようになります。
【まとめ】PrintPreview(印刷プレビュー)すると フリーズになるときの対処方法
PrintPreviewでフリーズする原因は、以下のようなことでした。
- 印刷プレビュー実行後のアクティブになるワークシートが不定になっている
- ユーザフォームがモーダルになっている
それらの対処方法として、
- 印刷プレビュー実行後にアクティブにするワークシートは、必ず明示的に指定しておく
- ユーザーフォームを「vbModeless」でモードレスに設定する
といったことが挙げられました。
エクセルでは、PrintPreviewメソッドで印刷プレビューを表示させる機会が多いですので、フリーズしないように今回のテクニックを使っていただければと思います。
参考:Excel VBA入門 その59:PrintPreview(印刷プレビュー)が遅いときの対処方法
コメント
[…] 参考:Excel VBA入門 その64:PrintPreview(印刷プレビュー)すると フリーズになると… […]