印刷範囲や用紙の向き、余白など、VBAでPageSetup
に関する設定を変更するマクロを実行した際に、「処理が思ったより遅い…」と感じたことはありませんか?特に、ネットワーク上のプリンターを使っているとその遅さは顕著になります。
実はその原因、VBAが印刷設定を変更するたびに、プリンタードライバーと通信して情報を確認しているからなのです。
この記事では、その通信を一時的にオフにすることで、印刷設定の処理を劇的に高速化するための必須テクニックApplication.PrintCommunication
プロパティを解説します。
なぜ印刷設定の変更は遅いのか?
Excel VBAで.PageSetup
オブジェクトのプロパティ(例: .PrintArea
や.Orientation
)を変更すると、Excelはその設定が現在のプリンターで物理的に可能かどうかを、OSを通じてプリンタードライバーに問い合わせます。
これを例えるなら、設定を一つ変更するたびに、わざわざプリンター本体のところまで行って「この設定で大丈夫?」と確認しに戻ってくるようなものです。この往復通信が、特にネットワーク越しの場合に大きな時間的ロスを生みます。
Application.PrintCommunication = False
は、この確認作業を「後でまとめてやるから、今は設定変更に集中して!」とVBAに指示するおまじないです。
完成したVBAコード
以下が、PrintCommunication
プロパティを使って印刷設定を高速化するVBAコードのサンプルです。
Sub FastPageSetup()
' 変数を宣言します
Dim targetSheet As Worksheet
Set targetSheet = ActiveSheet
' 画面更新を停止して、さらなる高速化を図る
Application.ScreenUpdating = False
' --- 1. プリンターとの通信を一時的に停止 ---
Application.PrintCommunication = False
' --- 2. 印刷設定をまとめて変更 (この間の処理が高速化される) ---
With targetSheet.PageSetup
.PrintArea = "B2:H80"
.Orientation = xlLandscape ' 用紙を横向きに
.Zoom = False
.FitToPagesWide = 1 ' 横を1ページに収める
.FitToPagesTall = 1 ' 縦を1ページに収める
.LeftMargin = Application.InchesToPoints(0.5)
.RightMargin = Application.InchesToPoints(0.5)
End With
' --- 3. プリンターとの通信を再開(【重要】必ず元に戻す) ---
Application.PrintCommunication = True
' 画面更新を再開
Application.ScreenUpdating = True
' --- 4. 結果をプレビューで確認 ---
targetSheet.PrintPreview
End Sub
コードのポイント解説
① 通信のOFF: Application.PrintCommunication = False
Application.PrintCommunication = False
.PageSetup
に関する処理を始める直前に、この一行を記述します。これにより、以降の.PageSetup
プロパティへの変更時に、Excelはプリンターへのお問い合わせを行わなくなり、処理がメモリ上で瞬時に完了します。
② 印刷設定の集中変更
With targetSheet.PageSetup
.PrintArea = "B2:H80"
.Orientation = xlLandscape
' ...など、複数の設定変更
End With
PrintCommunication
をFalse
にしている間に、変更したいすべての印刷設定をWith
ブロックなどにまとめて記述します。設定変更の項目が多ければ多いほど、このテクニックによる高速化の恩恵は大きくなります。
③ 通信のON: Application.PrintCommunication = True
Application.PrintCommunication = True
これが最も重要なステップです。すべての印刷設定の変更が終わったら、必ずこのプロパティをTrue
に戻して、プリンターとの通信を再開させます。
これを忘れると、設定がプリンタードライバーに正しく反映されず、印刷プレビューや実際の印刷時に予期せぬエラーやレイアウト崩れが発生する可能性があります。「OFFにしたら、必ずONに戻す」と覚えてください。
まとめ
印刷設定を含むマクロのパフォーマンスを改善したい場合、以下の3ステップは絶大な効果を発揮します。
- 処理の開始時に
Application.PrintCommunication = False
を設定する。 PageSetup
に関するすべての変更処理をまとめて行う。- 処理の最後に
Application.PrintCommunication = True
に戻す。
このパターンは、VBAで帳票やレポートの印刷を自動化する際には、ほぼ必須と言える高速化のテクニックです。処理が遅いと感じたら、ぜひこの「おまじない」を試してみてください。