印刷設定が遅い理由

VBAに限らず、Excelでの印刷設定関連の操作は印刷しようがしまいが関係なく、ことごとく遅いです。

遅い理由は、印刷設定を行うWorksheetオブジェクトなどのPageSetupオブジェクトを操作する度にプリンターと通信を行うためです。

しかし実際の印刷までの一連の作業では、事前に印刷範囲の確認をしたりヘッダーやフッターの設定だけをしたいような印刷設定を行うだけの場合の方が多く、設定だけしかしないのに、不必要なプリンターとの通信で処理が遅くなることは迷惑でしかありません。

実際の印刷はPageSetupオブジェクトとは別のPrintOutメソッドで行うため、本来であれば印刷の設定(PageSetup)ではプリンターと通信する必要がないことから、Excel自体の印刷周りの設計や実装に不備があるのかもしれません。とは言っても言語仕様がこうなってる以上、仕方ありません。

問題なのはPageSetupが遅いことなので、これを回避できれば問題は解決します。回避する方法は2通りあります。

印刷設定が遅くなることを回避する方法

PrintCommunicationプロパティにFalseを設定して回避する

一番簡単な方法はApplication.PrintCommunicationプロパティをFalseに設定することです。Falseを設定するとプリンターとの接続を切断します。Trueは接続します。

PageSetupオブジェクトの設定を行う直前にPrintCommunicationプロパティにFalseを設定し、PageSetupプロパティの設定が終わったらTrueを設定すればプリンターとの通信を行わないため、印刷設定を高速に行うことが可能です。

なお、PrintCommunicationプロパティはExcel2010より古いバージョンでは利用できません。

コードは以下のような感じになります。

Excel4.0のExecuteExcel4Macroメソッドを使って回避する

Application.PrintCommunicationプロパティはExcel2010で追加された機能のため、それより古いExcelの場合では利用できません。

その場合は、Excel4.0マクロを使うための「ExecuteExcel4Macro」メソッドで、「Page」オブジェクトの「Setup」メソッドを使うと高速に印刷関連の処理を行うことができます。

構文は以下の通り、引数だらけです。

PAGE.SETUP(Header, Footer, LeftMargin, RightMargin, TopMargin, BottomMargin, PrintHeadings, PrintGridlines, CenterHorizontally, CenterVertically, Orientation, PaperSize, Zoom, FirstPageNumber, Order, BlackAndWhite, PrintQuality, HeaderMargin, FooterMargin, PrintComments, Draft)

このままだと使いにくいので、下にPageSetupExcel4Macro関数を用意しています。

実際にこれを使うことはまず無いので詳細は省略しますが、使い方は以下のような感じになります。

以下がPAGE.SETUPをそのまま実行するには使いにくいので各パラメータを省略可能な引数にして関数化したものです。過去には使っていましたが今は使うことはまずないと思います。設定値はApplication.PageSetupと同様なので省略します。