[Excel]VBA シートをPDFファイルで出力する

最近、電子文書のやりとりはアプリケーションファイルそのものではなく、PDFファイルで行う機会が増えてきました。VBAExportAsFixedFormatメソッドを使用してPDFファイルを出力する方法を紹介します。

目次

ExportAsFixedFormatメソッド

ExportAsFixedFormatメソッドが含まれるクラス

オブジェクトブラウザで確認するとChartRangeWorkbookWorksheetオブジェクトのメンバーである事がわかります。サンプルはWorksheetsコレクション(Worksheetオブジェクト)を使用しています。

ExportAsFixedFormatメソッドで出力できるファイル

PDFファイル以外にもXPSファイル(MicrosoftPDFのようなもの)が出力できます。私は今までXPSファイル形式を要求された事はありませんが、XPSの普及率ってどうなんでしょうか?

ExportAsFixedFormatメソッドのパラメーター

メソッドにパラメーターを指定するだけでPDF出力ができます。

ExportAsFixedFormat (TypeFileNameQualityIncludeDocPropertiesIgnorePrintAreasFromToOpenAfterPublishFixedFormatExtClassPtr )

パラメーターはType以外省略可能です。

Type

TypexlTypePDFPDF形式)、xlTypeXPSXPS形式):省略不可

FileName

FileName…保存ファイル名を指定します。パス指定可能です。パスを指定しない場合、カレントディレクトリ(現在作業中のフォルダ)に保存されます。省略すると、ファイル名でPDF出力はされますが、ファイルは保存されません。

Quality

Quality…出力品質を指定します。xlQualityMinimum(最小限の品質:容量軽)、xlQualityStandard(標準品質)です。省略するとxlQualityStandard(標準品質)です。

IncludeDocProperties

ファイルのプロパティ(作成者、等)を保存するかどうかをTrueFalseで指定します。省略するとFalse(保存しない)です。

IgnorePrintAreas

印刷範囲を無視するかどうかをTrueFalseで指定します。省略するとFalse(無視しない)です。

FromTo

それぞれ出力の開始と終了ページを指定できます。省略するとそれぞれ先頭、最終ページになります。

OpenAfterPublish

出力後にビューアーで出力結果を表示するかどうかをTrueFalseで指定します。省略するとFalse(ビューアーが立ち上がらない)です。

FixedFormatExtClassPtr

FixedFormatExtクラスへのポインターです。(docs.microsoft.com)」だそうですが、ググってもサンプルは見つかりませんでした。そもそもVBAのポインタに関する情報がほとんどヒットしないので、別の言語に触らないかぎり理解できなくても問題ないのかなと(私見)。

サンプルコード

サンプルはシートの印刷範囲をPDF出力し、Documentsフォルダに保存するコードです。保存フォルダのパスは環境に合わせて変更して下さい。

1つのシートを指定してPDFファイルを出力

Public Sub PDF出力シート指定(ByVal シート名 As Worksheet, ByVal PDFフルパス As String)

    シート名.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=PDFフルパス, _
        Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, _
    'From:=, _                            '必要ならアンコメント、不要なら削除
        'To:=, _                              '必要ならアンコメント、不要なら削除
        IgnorePrintAreas:=False, _
        OpenAfterPublish:=True
End Sub

Public Sub Test()
    Call PDF出力シート指定(Worksheets("Sheet1"), "C:\Users\YOU\Documents\Book1.pdf")
End Sub

私はいつも、引数を渡すSubプロシージャをコピペで使いまわしています。

パラメーターは都度調べるのが面倒なので省略できるものも敢えて記述しています。FromToは必要ならアンコメント、不要なら削除して下さい。

全シートを1つのPDFファイルへ出力

Public Sub PDF出力全シート(ByVal エクセルファイル名 As Workbook, ByVal PDFフルパス As String)

    エクセルファイル名.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=PDFフルパス, _
        Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, _
        IgnorePrintAreas:=False, _
        OpenAfterPublish:=True
End Sub

Public Sub Test2()
    Call PDF出力全シート(Workbooks("Book1.xlsm"), "C:\Users\YOU\Documents\Book1.pdf")
End Sub

冒頭にも書きましたが、ExportAsFixedFormatメソッドはWorkbookオブジェクトにも含まれています。全シートを出力するのであればWorkbooksコレクションを使用して下さい。

但し、この方法だと1つのPDFファイルに複数ページで出力されます。

全シートをシート毎にPDFファイル出力

シートごとにPDFファイルを分けたいのであれば、処理もシートごとにする必要があります。

Public Sub PDF出力シート毎()
    Dim ws As Worksheet
    
    For Each ws In Worksheets
        ws.ExportAsFixedFormat _
            Type:=xlTypePDF, _
            Filename:="C:\Users\YOU\Documents\" & ws.Name & ".pdf", _
            Quality:=xlQualityStandard, _
            IncludeDocProperties:=True, _
            IgnorePrintAreas:=False, _
            OpenAfterPublish:=True
    Next ws
End Sub

指定したシートのみPDFファイルへ出力

指定した複数のシートを出力するのであれば、指定するシートを配列に格納し、For Eachステートメントで格納されたシートを出力します。

Public Sub PDF出力シート指定()
    Dim ws As Variant
    Dim シート名 As Variant
    
    シート名 = Array("Sheet1", "Sheet2")
    
    For Each ws In シート名    'In Worksheets("Sheet3").Range("セル範囲").Value でセルにシート名を入力しても可
        Worksheets(ws).ExportAsFixedFormat _
            Type:=xlTypePDF, _
            Filename:="C:\Users\YOU\Documents\" & ws & ".pdf", _
            Quality:=xlQualityStandard, _
            IncludeDocProperties:=True, _
            IgnorePrintAreas:=False, _
            OpenAfterPublish:=True
    Next ws
End Sub

サンプルはArray関数を使って、コードの中で出力するシートを指定しています。指定するシートが頻繁に変わるのであれば、セルにシート名を入力し、そのセルを配列として参照するようなコードでいかがでしょうか(サンプルコメントアウト部参照)。

パラメーターが多いので一見、面倒そうなコードですが実はそうでもありません。エクセルファイルをPDF出力する必要がある方は、是非コピペしてみて下さい。

それでは、最後までご高覧いただきありがとうございました。

目次
閉じる