2017年10月24日

PrintPreviewで固まってしまう(エクセル2016 VBA)

普通にエクセルを使っている方には
印刷プレビューは懐かしいかも知れませんね。



エクセル2010からでしたか(2007だったかな)、
ファイルタブでバックステージビューを開き、
「印刷」をクリックすると印刷の設定と
印刷プレビューが表示されますし、
クイックアクセスツールバーに「印刷プレビューと印刷」を設定していても、
それと同じことになります。
それ以前にあった純粋(?)な印刷プレビュー画面は、
通常にエクセルを使用している場合は、見られる事がなくなりましたね。

しかしVBAでは、今日でも(エクセル2016でも)、
例えば、
Sheet1.PrintPreview
のように書くと、
昔ながらなの印刷プレビューの画面で、
Sheet1の印刷プレビューが表示されます。

ところで、PrintPreviewで印刷プレビューを表示すると、
上のメニューにある「印刷」とか「ページ設定」
「印刷プレビューを閉じる」などの
どのアイコンも反応せず、固まってしまう事があります。
右上の「☓」で消す以外、何も出来なくなります。

この原因と対処法ですが、私の経験で分かっている事を書きます。
.罅璽競侫ームがモーダルになっている。
VBAで印刷プレビューを表示する場合、ユーザフォームでメニューを作り、
「印刷」とか「印刷プレビュー」のようなボタンを設ける、
このボタンをクリックする事で
例えば「Sheet1.PrintPreview」のような実行をする、
という事が多いかと思いますが、
この場合、このユーザフォームがモーダルになっていると、
印刷プレビューが表示されても、そちらのメニューは操作できないことになります。
ユーザフォームのプロパティで「ShowModal」を「False」にして、
モードレスにします。

もし、そのユーザフォームが印刷プレビュー実行以外では
モーダルである必要があるのなら、
印刷プレビュー実行の直前で、
ユーザフォーム.Show vbModeless を実行し
印刷プレビュー実行後に、
ユーザフォーム.Show vbModal で戻す事も考えられます。
(エクセルVBAでモーダルでユーザフォームを表示する必要性は
まずない、と思いますが。私はこれまでに経験がありません)

また、固まる件とは、直接関係はありませんが、
メニューとして使っているユーザフォームを表示したまま、
印刷プレビューを実行すると、
印刷プレビューのメニューに
ユーザフォームのメニューが重なってしまう事があります。
印刷プレビュー実行の直前で、
ユーザフォーム.Hide(普通はMe.Hideと書きます)で表示を隠し、
印刷プレビュー実行後に、
ユーザフォーム.Show(Me.show)でユーザフォームを表示し直します。
なお、余計な事ですが印刷プレビュー実行後とは、
印刷プレビューで印刷を実行した(あるいはキャンセルした)、または、
「印刷プレビューを閉じる」をクリックした後の動作です。

印刷プレビュー実行後のアクティブになるワークシートが不定になっている
これは、ひょっとするとエクセル2016あたりから、そうなるのかも知れませんが。
以外と盲点です。
印刷プレビューを実行しようとしたときにアクティブになっている
ワークシートそのものの印刷プレビューを行うときは多分問題ないのですが、
印刷プレビューを実行しようとしたときにアクティブになっている
ワークシートと違うワークシートの印刷プレビューを実行した場合、
例えば、
Sheet1がアクティブになっている時に、
Sheet2.PrintPreviewを実行

このような場合、印刷プレビュー実行後、印刷プレビューが画面を閉じたら、
どのワークシートをアクティブにするか、不定になってしまい、
結果的に固まってしまう事があるようです。
したがって、印刷プレビュー実行後にアクティブにするワークシートは、
必ず明示的に指定しておいた方が良さそうです。
例えば、
Sheet2.PrintPreview
Sheet1.Activate
(印刷プレビュー実行前でSheet1がアクティブだったとしても、
念のため書いて置いた方が、効率が落ちる訳でもないし、無難でしょう)
この印刷プレビュー実行後のアクティブにするワークシートが不定になる現象は
必ず起きると言う訳でもないようですが、
予防策として、覚えていくと良いかと思います。



katsuyausami at 17:23│Comments(0)エクセルVBAメモ 

コメントする

名前
URL
 
  絵文字