印刷設定が遅い理由
VBAに限らず、Excelでの印刷設定関連の操作は印刷しようがしまいが関係なく、ことごとく遅いです。
遅い理由は、印刷設定を行うWorksheetオブジェクトなどのPageSetupオブジェクトを操作する度にプリンターと通信を行うためです。
しかし実際の印刷までの一連の作業では、事前に印刷範囲の確認をしたりヘッダーやフッターの設定だけをしたいような印刷設定を行うだけの場合の方が多く、設定だけしかしないのに、不必要なプリンターとの通信で処理が遅くなることは迷惑でしかありません。
実際の印刷はPageSetupオブジェクトとは別のPrintOutメソッドで行うため、本来であれば印刷の設定(PageSetup)ではプリンターと通信する必要がないことから、Excel自体の印刷周りの設計や実装に不備があるのかもしれません。とは言っても言語仕様がこうなってる以上、仕方ありません。
問題なのはPageSetupが遅いことなので、これを回避できれば問題は解決します。回避する方法は2通りあります。
印刷設定が遅くなることを回避する方法
PrintCommunicationプロパティにFalseを設定して回避する
一番簡単な方法はApplication.PrintCommunicationプロパティをFalseに設定することです。Falseを設定するとプリンターとの接続を切断します。Trueは接続します。
PageSetupオブジェクトの設定を行う直前にPrintCommunicationプロパティにFalseを設定し、PageSetupプロパティの設定が終わったらTrueを設定すればプリンターとの通信を行わないため、印刷設定を高速に行うことが可能です。
なお、PrintCommunicationプロパティはExcel2010より古いバージョンでは利用できません。
コードは以下のような感じになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub PrintCommunicationTest() '// プリンタとの接続を切断 Application.PrintCommunication = False '// 印刷設定 With ActiveSheet.PageSetup .CenterHeader = "タイトル" .RightHeader = "&D" .CenterFooter = "&P" & "/" & "&N" End With '// プリンタと接続する Application.PrintCommunication = True End Sub |
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関数を用意しています。
実際にこれを使うことはまず無いので詳細は省略しますが、使い方は以下のような感じになります。
1 2 3 |
Sub PageSetupExcel4MacroTest() Call PageSetupExcel4Macro(LeftHeader:="abcdd") End Sub |
以下がPAGE.SETUPをそのまま実行するには使いにくいので各パラメータを省略可能な引数にして関数化したものです。過去には使っていましたが今は使うことはまずないと思います。設定値はApplication.PageSetupと同様なので省略します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
'// LeftHeader As String :左ヘッダー '// CenterHeader As String :中央ヘッダー '// RightHeader As String :右ヘッダー '// LeftFooter As String :左フッター '// CenterFooter As String :中央フッター '// RightFooter As String :右フッター '// LeftMargin As String :左余白 '// RightMargin As String :右余白 '// TopMargin As String :上余白 '// BottomMargin As String :下余白 '// HeaderMargin As String :ヘッダー余白 '// FooterMargin As String :フッター余白 '// PrintHeadings As String :行列番号印刷 '// PrintGridlines As String :枠線印刷 '// PrintComments As String :コメント '// PrintQuality As String :印刷品質 '// CenterHorizontally As String:ページ中央水平 '// CenterVertically As String :ページ中央垂直 '// Orientation As String :用紙の向き '// Draft As String :簡易印刷 '// PaperSize As String :用紙サイズ '// FirstPageNumber As String :先頭ページ番号 '// Order As String :ページの方向 '// BlackAndWhite As String :白黒印刷 '// Zoom As String) :ズーム Public Sub PageSetupExcel4Macro(Optional LeftHeader As String, Optional CenterHeader As String, Optional RightHeader As String, Optional LeftFooter As String, Optional CenterFooter As String, Optional RightFooter As String, Optional LeftMargin As String, Optional RightMargin As String, Optional TopMargin As String, Optional BottomMargin As String, Optional HeaderMargin As String, Optional FooterMargin As String, Optional PrintHeadings As String, Optional PrintGridlines As String, Optional PrintComments As String, Optional PrintQuality As String, Optional CenterHorizontally As String, Optional CenterVertically As String, Optional Orientation As String, Optional Draft As String, Optional PaperSize As String, Optional FirstPageNumber As String, Optional Order As String, Optional BlackAndWhite As String, Optional Zoom As String) Dim c As String: c = "," '// 項目区切り文字 Dim sSetting As String '// 印刷設定 Dim sHeader As String '// ヘッダ文字列 Dim sFooter As String '// フッタ文字列 '// ヘッダー設定 sHeader = GetHeaderFooter(LeftHeader, CenterHeader, RightHeader) '// フッター設定 sFooter = GetHeaderFooter(LeftFooter, CenterFooter, RightFooter) '// 印刷設定文字列をカンマで連結 sSetting = sHeader & c & sFooter & c & LeftMargin & c & RightMargin & c & TopMargin & c & BottomMargin & c & PrintHeadings & c & PrintGridlines & c & CenterHorizontally & c & CenterVertically & c & Orientation & c & PaperSize & c & Zoom & c & FirstPageNumber & c & Order & c & BlackAndWhite & c & PrintQuality & c & HeaderMargin & c & FooterMargin & c & PrintComments & c & Draft '// 印刷設定を実行 Call ExecuteExcel4Macro("PAGE.SETUP(" & sSetting & ")") End Sub Function GetHeaderFooter(a_sLeft As String, a_sCenter As String, a_sRight As String) As String Dim s As String '// ヘッダ左が設定されている場合 If a_sLeft <> "" Then s = "&L" & a_sLeft End If '// ヘッダ中央が設定されている場合 If a_sCenter <> "" Then s = s & "&C" & a_sCenter End If '// ヘッダ右が設定されている場合 If a_sRight <> "" Then s = s & "&R" & a_sRight End If '// ヘッダが設定されていない場合 If Not s = "" Then s = """" & s & """" End If GetHeaderFooter = s End Function |