みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルVBAでPDF出力や印刷をする際のテクニックについて引き続きお伝えしていきます。
前回はこちらの記事。
エクセルVBAで印刷時のヘッダー・フッターの設定をする方法についてお伝えしてきました。
さて、今回は少し視点を変えまして、エクセルVBAで全てのシートをまとめてプレビューまたはPDF出力をする方法についてお伝えします。
今までは一つのシートしか対象にしていませんでしたからね…全部まとめてやっちゃいますよ。
どうぞよろしくお願いします!
アクティブシートを印刷プレビューするVBAプログラム
アクティブシートのみを対象に印刷プレビューをするVBAプログラムはこちらです。
Sub outputPDF()
Dim fileName As String '保存先フォルダパス&ファイル名
fileName = ThisWorkbook.Path & "\201604請求書_株式会社ホゲホゲ御中.pdf"
With ActiveSheet.PageSetup
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
.CenterHorizontally = True
.TopMargin = Application.CentimetersToPoints(1)
.BottomMargin = Application.CentimetersToPoints(1)
End With
ActiveSheet.PrintPreview
'Activesheet.ExportAsFixedFormat Type:=xlTypePDF, fileName:=fileName '選択したシートをPDF出力
End Sub
アクティブシートについて、PageSetupオブジェクトを使って出力設定を行いプレビューをするというプログラムですね(PDF出力はコメントアウトになっています)。
詳細についてはこちらの記事をご覧ください。
当然ながら、例えばこちらのようにシートが複数ある場合でも
実行すると当然ながらアクティブシートしかプレビューされません。
全てのシートを全部まとめてPDFにしたいのです。以降でその方法について解説をしていきます。
全てのシートをまとめてプレビューまたはPDF出力
皆さんが普通にエクセルで作業をされていて、全てのシートをまとめて印刷またはPDF出力するときはどうしていますか?
まずシート全てを選択してアクティブにしますよね?
VBAで動作させるときも同様で、印刷またはPDF出力をしたいシートを全て選択すればOKなのです。
では、それも踏まえてVBAプログラムを組んでみましょう。こちらです。
Sub outputPDF()
Dim fileName As String '保存先フォルダパス&ファイル名
fileName = ThisWorkbook.Path & "\201604請求書_株式会社ホゲホゲ御中.pdf"
Dim ws As Worksheet
For Each ws In Worksheets
With ws.PageSetup
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
.CenterHorizontally = True
.TopMargin = Application.CentimetersToPoints(1)
.BottomMargin = Application.CentimetersToPoints(1)
End With
Next ws
Worksheets.Select
ActiveWorkbook.PrintPreview
'ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, fileName:=fileName '選択したシートをPDF出力
End Sub
以下ポイントを解説していきますね。
全てのワークシートについて繰り返す
7行目~20行目のFor Each~Next文ですが
For Each 変数 In Worksheets
‘処理
Next 変数
とすることで、ブックに存在するすべてのワークシートについて繰り返し処理ができます。
WorksheetsはWorksheetsコレクションといいまして、作業中のワークブックにあるすべてのWorksheetオブジェクトの集まりを表しています。
ですから、その中の全てのワークシートについて処理をすることができるというわけですね。
これで同一の出力設定を施すということを実現しています。
全てのワークシートを選択してアクティブにする
同様にWorksheetsコレクションを使うことで、全てのシートをアクティブにすることができます。
22行目の
Worksheets.Select
の部分です。
選択したシートをプレビューまたはPDF出力する
複数のシートをプレビューまたはPDF出力する場合は、対象となるシートを全て選択した上でワークブックに対してPrintPreviewまたはExportAsFixedFormatメソッドを実行します。
Workbookに対して、というのがポイントです。
つまり対象のシートが選択されている状態であれば、PDF出力する場合は
Workbookオブジェクト.PrintPreview
PDF出力する場合は
Workbookオブジェクト.ExportAsFixedFormat Type:=xlTypePDF, fileName:=ファイル名
とします。
上記プログラムでいうと23,24行目ですね。
実行結果
このプログラムを実行すると
とプレビュー表示されます。画像だとわかりづらいですが、「請求書②」のシートも2ページ目としてきっちりプレビューされています。
また、このプログラムが実行された後のワークブックの状態として
このように全てのシートが選択されている状態になっていますね。
まとめ
以上、エクセルVBAで全てのシートをまとめてプレビューまたはPDF出力をする方法についてお伝えしました。
まず、作業中のワークブックの全てのシートを表すWorksheetsコレクションですね。
これに対してFor~Each文による繰り返しをすることや、Selectメソッドを実行することをお伝えしました。
また最終的にプレビューをするまたはPDF出力する際には、全てのシートを選択した状態でワークブックに対してメソッドを実行することがポイントでした。
次回は、全てのワークシートではなくて、一部のワークシートを対象にした場合はどうするか、についてお伝えできればと思います。
どうぞお楽しみに!