シートをPDFとして保存する
2021-04-02 00:00:00
※下の方法ではなくExportAsFixedFormatメソッドを利用したほうが簡単かもしれません。その方法についても今度まとめたいと思います。
エクセルのシートをPDFとして保存したいという場面もたまにあるではないかと思います。エクセルではプリンタの設定で「Microsoft Print to PDF」を使うことによりPDFとして印刷画面を出力することができますので、マクロでこれを実行すればPDFとして保存できます。
まずポート名を含めたプリンタの名前を取得するため、印刷画面でプリンタを選択した状態で、ApplicationオブジェクトのActivePrinterプロパティを確認します。
イミディエイトウィンドウで確認するのが簡単だと思います。
表示されたプリンター名をコードで設定して、WorksheetやWorkbookのPrintOutメソッドを使えばPDFとして出力することができます。
Application.ActivePrinter = "Microsoft Print to PDF on Ne01:" '1つのシートをPDFとして保存 ActiveSheet.PrintOut , , , , , True, , "c:\output\sheet.pdf" ActiveSheet.PrintOut PrintToFile:=True, PrToFileName:="c:\output\sheet.pdf" 'ブック全体をPDFとして保存 ThisWorkbook.PrintOut , , , , , True, , "c:\output\book.pdf" ThisWorkbook.PrintOut PrintToFile:=True, PrToFileName:="c:\output\book.pdf"
PCの環境が変わるとプリンターのポート部分が変わってしまうことがありますので、下のようなプロシージャを使ってユーザがプリンターを変更できるようにすると安全かもしれません。
Function ChangeToPdfPrinter() As Boolean ChangeToPdfPrinter = False On Error Resume Next Application.ActivePrinter = "Microsoft Print to PDF on Ne01:" If Err.Number > 0 Then 'プリンター設定ダイアログを開く If Not Application.Dialogs(xlDialogPrinterSetup).Show Then Exit Function 'キャンセルの場合終了 End If 'PDFライターが選択されたか確認 If InStr(Application.ActivePrinter, "PDF") = 0 Then Exit Function End If End If ChangeToPdfPrinter = True End Function
これを使ってシートを印刷するプロシージャを作ってみます。
Sub SaveSheetAsPdf(sheetName As String, fileName As String) If Not ChangeToPdfPrinter Then Exit Sub Sheets(sheetName).PrintOut , , , , , True, , fileName End Sub
下のコードでSheet1をPDFとして保存できます。
SaveSheetAsPdf "Sheet1", "c:\output\sheet1.pdf"
複数のシートは下のようにすると一つのPDFとして保存できます。もしかしたらもっといい方法があるかもしれません。
Sub SaveSheetsAsPdf(sheetNames As Variant, fileName As String) Dim numOfShts As Long Dim sheetName As Variant Dim i As Long If Not IsArray(sheetNames) Then Exit Sub If Not ChangeToPdfPrinter Then Exit Sub Application.DisplayAlerts = False With Workbooks.Add '印刷用にブックを用意する numOfShts = .Sheets.Count '最初からあるシートの数 For Each sheetName In sheetNames '印刷用にブックにシートをコピー ThisWorkbook.Sheets(sheetName).Copy , .Sheets(.Sheets.Count) Next For i = 1 To numOfShts '最初からあるシートを削除 .Sheets(1).Delete Next .PrintOut , , , , , True, , fileName .Close False '印刷用ブックは保存せずに閉じる End With End Sub
下のコードで複数シートのPDF化ができます。
SaveSheetsAsPdf Array(""Sheet1"", ""Sheet2""), ""c:\output\sheets.pdf""