【VBAリファレンス】VBAで印刷プレビューを自在に操る!PrintPreviewメソッド徹底解説

スポンサーリンク

概要

Excel VBAにおける「印刷プレビュー」は、単なる印刷前の確認機能に留まらず、業務効率化とコスト削減の要となり得る重要な機能です。特に、VBAを介してこの印刷プレビュー(PrintPreviewメソッド)を制御できるようになると、ユーザーは印刷ミスを劇的に減らし、用紙やインクの無駄をなくし、結果として時間とリソースを節約することができます。

本記事では、VBA初心者の方から、より高度な印刷制御を目指す方まで、Excel VBAのPrintPreviewメソッドを徹底的に解説します。単にプレビューを表示するだけでなく、印刷設定(用紙サイズ、向き、余白、ヘッダー/フッター、拡大縮小など)をVBAで動的に制御し、ユーザーのニーズに合わせた柔軟な印刷プレビュー環境を構築するための知識とテクニックを提供します。PrintPreviewメソッドの基本的な使い方から、実務で役立つ応用例、そして潜在的な課題への対処法まで、VBA講師としての長年の経験に基づいた実践的なアドバイスを惜しみなくご紹介いたします。

詳細解説

VBAにおけるPrintPreviewメソッドは、Excelオブジェクトモデルの主要なオブジェクト(Worksheet、Workbook、Range、Chartなど)に属しており、それぞれのオブジェクトが持つ内容の印刷プレビューを表示するために使用されます。

PrintPreviewメソッドの基本構文と対象オブジェクト

PrintPreviewメソッドの基本的な構文は非常にシンプルです。

オブジェクト.PrintPreview (EnableChanges)

– **オブジェクト**: 印刷プレビューを表示したい対象を指定します。
– `Worksheet`: 特定のシートの印刷プレビューを表示します。
– `Workbook`: ブック内の全シート(または指定されたシート)の印刷プレビューを表示します。
– `Range`: 指定した範囲のみの印刷プレビューを表示します。
– `Chart`: グラフシートまたは埋め込みグラフの印刷プレビューを表示します。
– **EnableChanges (省略可能)**: ブール型 (True/False)。既定値は`True`です。
– `True`の場合、ユーザーは印刷プレビュー画面で印刷設定を変更できます。
– `False`の場合、ユーザーは印刷プレビュー画面で設定を変更できません。VBAで設定した内容を固定したい場合に有用です。

例えば、アクティブなシートのプレビューを表示するには、`ActiveSheet.PrintPreview`と記述します。また、`Worksheets(“Sheet1”).PrintPreview`のように、特定のシート名を指定することも可能です。

PageSetupオブジェクトとの連携

PrintPreviewメソッドが真価を発揮するのは、PageSetupオブジェクトと連携させる場合です。PageSetupオブジェクトは、印刷設定のほぼすべての側面を制御するためのプロパティを提供します。これらをVBAで事前に設定し、その結果をPrintPreviewで確認することで、ユーザーは意図した通りの印刷結果を得ることができます。

PageSetupオブジェクトで制御できる主なプロパティには以下のようなものがあります。

– **`PrintArea`**: 印刷範囲を指定します(例: `”A1:G50″`)。
– **`Orientation`**: 用紙の向きを設定します(`xlPortrait`または`xlLandscape`)。
– **`PaperSize`**: 用紙サイズを設定します(例: `xlPaperA4`、`xlPaperLetter`)。
– **`Zoom`**: 拡大/縮小率を設定します。`False`にすると`FitToPagesWide`と`FitToPagesTall`が適用されます。
– **`FitToPagesWide`**: 横方向のページ数に合わせて拡大/縮小します。
– **`FitToPagesTall`**: 縦方向のページ数に合わせて拡大/縮小します。
– **`LeftMargin`, `RightMargin`, `TopMargin`, `BottomMargin`**: 余白を設定します(単位はポイント)。
– **`CenterHorizontally`, `CenterVertically`**: ページを水平/垂直方向の中央に配置します。
– **`PrintHeadings`**: 行と列の見出しを印刷するかどうか。
– **`PrintGridlines`**: グリッド線を印刷するかどうか。
– **`PrintTitleRows`, `PrintTitleColumns`**: 印刷タイトル行/列を設定します。
– **`Header`, `Footer`, `LeftHeader`, `CenterHeader`, `RightHeader`, `LeftFooter`, `CenterFooter`, `RightFooter`**: ヘッダーとフッターのテキストを設定します。

これらのプロパティをPrintPreviewの前に設定することで、動的な印刷設定を実現できます。

Application.PrintCommunicationプロパティの活用

VBAで`PageSetup`プロパティを頻繁に変更する場合、Excelは変更のたびにプリンタードライバーと通信しようとします。これにより処理が遅くなることがあります。これを回避するために`Application.PrintCommunication`プロパティを使用します。

`Application.PrintCommunication = False`と設定することで、VBAが`PageSetup`プロパティを変更している間、Excelがプリンタードライバーとの通信を一時停止します。すべての設定が完了したら`Application.PrintCommunication = True`に戻すことで、プリンタードライバーとの通信を再開し、一度に設定を適用させることができます。これにより、特に多くの`PageSetup`プロパティを変更する場合に、処理速度が大幅に向上します。

複数のシートや特定の範囲の印刷プレビュー

– **複数シートのプレビュー**: `Sheets(Array(“Sheet1”, “Sheet3”)).PrintPreview`のように、シート名の配列を`Sheets`コレクションに渡すことで、複数のシートをまとめてプレビューできます。この場合、各シートの印刷設定は独立して適用されます。
– **特定の範囲のプレビュー**: `Worksheets(“Sheet1”).Range(“A1:D10”).PrintPreview`のように、`Range`オブジェクトに対して直接PrintPreviewメソッドを呼び出すことで、シート全体ではなく特定の範囲のみをプレビューできます。

これらの詳細な制御を組み合わせることで、ユーザーの要求に応じた非常に柔軟な印刷プレビュー機能を実現することが可能になります。

サンプルコード

以下に、PrintPreviewメソッドの様々な使用例を示します。

1. 基本的なシートの印刷プレビュー

Sub BasicPrintPreview()
‘アクティブなシートの印刷プレビューを表示します。
ActiveSheet.PrintPreview

‘特定のシートの印刷プレビューを表示します。
‘Worksheets(“Sheet1”).PrintPreview
End Sub

2. 特定の範囲の印刷プレビュー

Sub RangePrintPreview()
‘Sheet1のA1からD10の範囲のみを印刷プレビューします。
‘この場合、PageSetup.PrintAreaを設定するのと同じ効果があります。
Worksheets(“Sheet1”).Range(“A1:D10”).PrintPreview
End Sub

3. 複数のシートの印刷プレビュー

Sub MultipleSheetsPrintPreview()
‘Sheet1とSheet3を同時に印刷プレビューします。
‘ユーザーはプレビュー画面でシートを切り替えて確認できます。
Sheets(Array(“Sheet1”, “Sheet3”)).PrintPreview
End Sub

4. 印刷設定を適用したプレビュー(PageSetupとの連携)

この例では、用紙の向き、サイズ、余白、拡大縮小、ヘッダー/フッターを設定してからプレビューを表示します。

Sub CustomPageSetupAndPrintPreview()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(“データシート”) ‘対象シートを適宜変更してください

‘ PageSetupの変更中にプリンターとの通信を一時停止し、パフォーマンスを向上させます。
Application.PrintCommunication = False

With ws.PageSetup
.Orientation = xlLandscape ‘ 横向き
.PaperSize = xlPaperA4 ‘ A4サイズ
.Zoom = False ‘ 拡大/縮小率を固定せず、FitToPagesWide/Tallを有効にする
.FitToPagesWide = 1 ‘ 横1ページに収める
.FitToPagesTall = False ‘ 縦方向は自動調整
.LeftMargin = Application.InchesToPoints(0.5) ‘ 左余白 0.5インチ
.RightMargin = Application.InchesToPoints(0.5) ‘ 右余白 0.5インチ
.TopMargin = Application.InchesToPoints(0.75) ‘ 上余白 0.75インチ
.BottomMargin = Application.InchesToPoints(0.75) ‘ 下余白 0.75インチ
.CenterHorizontally = True ‘ ページを水平方向の中央に配置
.CenterVertically = False ‘ ページを垂直方向の中央には配置しない

.PrintArea = “A1:G100” ‘ 印刷範囲を指定 (例: A1からG100)

‘ ヘッダーとフッターの設定
.CenterHeader = “&””MS Pゴシック””&10&B&K0000FF印刷プレビューテスト” ‘中央ヘッダー (青色、太字、MS Pゴシック、サイズ10)
.RightFooter = “&P / &N” ‘ 右フッター (現在のページ番号 / 総ページ数)
End With

‘ プリンターとの通信を再開します。
Application.PrintCommunication = True

‘ 設定を適用した上で印刷プレビューを表示します。
ws.PrintPreview (True) ‘ ユーザーによる設定変更を許可

‘ 元のPageSetup設定に戻す場合は、この後に元の設定を記述します。
‘ 例:
‘ Application.PrintCommunication = False
‘ With ws.PageSetup
‘ .Orientation = xlPortrait
‘ .PrintArea = “” ‘印刷範囲をリセット
‘ ‘その他の設定を元に戻す
‘ End With
‘ Application.PrintCommunication = True

End Sub

5. 印刷プレビューをキャンセルした場合の処理(エラーハンドリング)

ユーザーが印刷プレビューウィンドウを閉じたり、キャンセルボタンを押したりした場合に、VBAの処理を適切に制御する例です。

Sub PrintPreviewWithCancellationHandling()
On Error GoTo ErrorHandler ‘ エラーが発生した場合、ErrorHandlerへジャンプ

‘ Sheet1の印刷プレビューを表示します。
Worksheets(“Sheet1”).PrintPreview

MsgBox “印刷プレビューが正常に表示されました。”, vbInformation
Exit Sub ‘ 処理を終了

ErrorHandler:
‘ ユーザーがプレビューをキャンセルした場合のエラー番号は通常40000です。
If Err.Number = 40000 Then ‘ PrintPreviewがキャンセルされた場合のエラー
MsgBox “印刷プレビューがキャンセルされました。”, vbExclamation
Else
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical
End If

‘ エラー処理後、エラーハンドラーを無効に戻す
On Error GoTo 0
End Sub

実務アドバイス

PrintPreviewメソッドを実務で効果的に活用するためのアドバイスをいくつかご紹介します。

1. 印刷設定のテンプレート化と再利用

頻繁に使用する印刷設定(特定のヘッダー/フッター、ロゴ、余白、用紙サイズなど)は、個別のプロシージャとしてカプセル化し、テンプレート化することをお勧めします。これにより、複数のレポートや帳票で同じ設定を簡単に適用でき、コードの重複を避け、保守性を高めることができます。
例えば、`SetStandardPageSetup(ws As Worksheet)`のような関数を作成し、必要なシートを引数として渡すことで、一貫した印刷設定を適用できます。

2. 動的な印刷範囲の設定

多くの業務帳票では、データ量に応じて印刷範囲が変動します。`PageSetup.PrintArea`プロパティをハードコーディングするのではなく、VBAで最終行や最終列を検出して動的に設定することが重要です。

With ws
Dim LastRow As Long
Dim LastColumn As Long
LastRow = .Cells.Find(What:=”*”, After:=.Cells(1, 1), LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
LastColumn = .Cells.Find(What:=”*”, After:=.Cells(1, 1), LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
.PageSetup.PrintArea = .Range(.Cells(1, 1), .Cells(LastRow, LastColumn)).Address
End With

これにより、データが増減しても常に適切な範囲がプレビュー・印刷されます。

3. ユーザー操作への考慮とエラーハンドリング

前述のサンプルコードにもあるように、PrintPreviewメソッドはユーザーがプレビューウィンドウを閉じる際にエラー(エラー番号40000)を発生させることがあります。これはキャンセル操作と見なされるため、`On Error GoTo`ステートメントを使用して適切に処理することが重要です。これにより、ユーザーが意図せずプログラムを中断させてしまうことを防ぎ、より堅牢なVBAアプリケーションを提供できます。

4. パフォーマンス最適化

– **`Application.ScreenUpdating = False`**: 印刷設定の変更やシートの切り替えなど、画面更新を伴う処理がVBAコード内で多く発生する場合、コードの冒頭で`Application.ScreenUpdating = False`を設定し、終了時に`True`に戻すことで、処理速度を大幅に向上させることができます。
– **`Application.PrintCommunication = False`**: PageSetupオブジェクトのプロパティを連続して変更する場合に、プリンタードライバーとの無駄な通信を抑制し、処理速度を向上させます。

5. PDF出力との連携

現代のビジネス環境では、紙媒体での印刷だけでなく、PDFファイルとしての出力も頻繁に行われます。VBAの`ExportAsFixedFormat`メソッドを使用することで、印刷プレビューで確認した内容をそのままPDFとして出力することが可能です。PrintPreviewで最終確認を行い、問題がなければPDFとして保存する、というフローをVBAで自動化すると非常に効率的です。

‘ PrintPreviewで確認後、PDFとして出力する例
‘ ActiveSheet.PrintPreview
‘ MsgBox “プレビューを確認してください。PDFとして出力しますか?”, vbQuestion + vbYesNo
‘ If vbYes = MsgBoxResult Then
‘ ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=”C:\Temp\MyReport.pdf”
‘ End If

6. 実際のプリンターでのテストの重要性

VBAで設定した印刷設定は、PCにインストールされているプリンタードライバーに依存する場合があります。特に、異なるメーカーやモデルのプリンターを使用する環境では、意図しない印刷

タイトルとURLをコピーしました