PDFファイルに出力する
ExcelのブックやシートをPDFで出力するには、ExportAsFixedFormatメソッドを使います。
このメソッドは、ブックやシートなどのオブジェクトで実行できます。
ExportAsFixedFormatメソッドの構文
オブジェクト.ExportAsFixedFormat(
Type,
FileName,
Quality,
includedocproperties,
ignoreprintareas,
From,
To,
openafterpublish,
FixedFormatExtClassPtr)
オブジェクトには、ブックやシートを指定することが出来ます。
パラメータ詳細
引数のパラメータは以下のようになっています。
Type以外は省略可能です。
Type
xlTypePDF または xlTypeXPS のいずれかを指定できます。PDFを出力したい場合はxlTypePDFです。
FileName
フルパスを指定します。省略した場合は、(筆者の環境では)ドキュメントフォルダに出力されました。
Quality
品質の設定をします。以下の2つを指定できます。
xlQualityStandard | 最小限の品質 |
xlQualityMinimum | 標準品質 |
includedocproperties
ドキュメントプロパティを含める場合はTrueを、省略する場合はFalseを指定します。
ignoreprintareas
印刷範囲設定です。Trueでは印刷範囲が無視され、Falseでは印刷範囲が適用されます。
From , To
From | 開始ページの設定です。省略した場合は先頭ページから出力されます。 |
To | 終了ページの設定です。省略した場合は最後のページまで出力されます。 |
openafterpublish
出力のビューアを開くかの設定です。
Trueで出力後にビューアが開きファイルが表示されます。
Falseまたは省略するとビューアは開きません。
FixedFormatExtClassPtr
FixedFormatExtクラスへのポインタです。
(使い方はイマイチよくわかりませんが、省略することが多いようです。)
最低限の設定を試してみる
’ブック編
Sub PDF1()
ThisWorkbook.ExportAsFixedFormat (xlTypePDF)
End Sub
現在のブックをPDFするプログラムです。
結果はブックの全てのシートが1つのPDFファイルとして、ドキュメントフォルダに出力されました。ファイル名はExcelファイルのファイル名.PDFとなります。
’シート編
Sub PDF2()
ActiveSheet.ExportAsFixedFormat (xlTypePDF)
End Sub
今度はシートを指定して出力させました。
結果は、1シート分出力され、保存フォルダとファイル名は一緒です。
’Range編
Sub PDF3()
ActiveSheet.Range("A8:G40").ExportAsFixedFormat (xlTypePDF)
End Sub
Rangeを指定して出力する方法です。覚えておくと便利かもしれません。
1つのシートを2つ以上のPDFファイルに分けるような事が出来るようになるでしょう。
標準的な使い方
通常はファイル名を指定したり、印刷範囲を活かしたい欲求があると思います。
以下の例では、いくつかパラメータをしてしています。
Sub PDF4()
Dim myFileName As String
myFileName = "請求書.pdf"
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\" & myFileName, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False
End Sub
Type:=xlTypePDF でPDF出力をしてい。
Filenameに対しては、ThisWorkbook.Pathで現在のExcelファイルと同じフォルダを指定して、ファイル名は別の変数であらかじめ指定しています。
Qualityで印刷品質を標準品質に指定。
IncludeDocPropertiesでドキュメントプロパティをセット。
IgnorePrintAreasで印刷設定を反映させています。
PDF出力する際のページ構成を設定する
単にPDF出力するといっても、実は色々なバリエーションが存在します。
先の例では、ブックやシート単位で1つのPDF出力でした。
ここでは2つのシートを1つのPDFファイルにしたり、特定のシートを個別にPDF出力する方法を見ていきます。
特定のシートを個別にPDF出力
先の例でシート単位での印刷は可能ですので、WorksheetsをForEachで回してお好みのシートのみExportAsFixedFormat メソッドを行えばOKです。
Sub PDF5()
Dim myFileName As String
Dim ws
For Each ws In worksheets
If InStr(ws.Name, "月") > 0 Then
myFileName = ws.Name & "請求書.pdf"
ws.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\" & myFileName, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False
End If
Next ws
End Sub
このプログラムでは、シート名に”月”が付いているシートをPDF出力の対象にしています。
If InStr(ws.Name, “月”) > 0 Then の部分ですが、InStr関数を使ってシート名に”月”という文字が含まれていれば1以上の値が返るのでTrueとなり、If文の内部が実行されます。
あとは、出力ファイル名に”請求書.pdf”を付け足して、5月なら”5月請求書.PDF”となります。
複数のシートを1つのPDFファイルに統合する
イメージとしては、1シート目が1ページ、2シート目が2ページなどとなるように1つのPFDファイルする方法になります。
これはマクロの記録を使って、方法を検討してみましょう。
操作は、マクロの記録を開始して、10月、11月のシートタブを複数選択して、印刷を実行してマクロの記録を終了させています。
印刷出力をPDFファイルにして確かめたところ、思った通りの結果となりましたので、マクロの記録で出力されたコードを参考にしてみましょう。
Sub Macro1()
'
' Macro1 Macro
'
'
Sheets(Array("10月", "11月")).Select
Sheets("10月").Activate
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
IgnorePrintAreas:=False
End Sub
これが、マクロの記録で出力されたコードになります。
注目すべきは、
Sheets(Array(“10月”, “11月”)).Select
の部分ですね。Arrayで一括りにすれば良いようです。
これを自分で書いたプログラムに適用してみます。
Sub PDF6()
Dim myFileName As String
Dim s, str As String
Dim ws As Worksheet
Set ws = ActiveSheet '現在アクティブなシートを保存
For Each s In Array("10月", "11月")
str = str & s & "_"
Next s
myFileName = str & "請求書.pdf"
Sheets(Array("10月", "11月")).Select
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\" & myFileName, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False
ws.Select '処理前にアクティブだったシートに戻す
End Sub
メインの処理は、
Sheets(Array(“10月”, “11月”)).Select で選択した後、
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _ でアクティブシートを指定しているところですね。
一応冒頭で、Set ws = ActiveSheet としてそれまで選択されていたシートを保持しておき、最後に、ws.Select で元に戻しています。これはプログラマーのエチケットですね。
それと、ファイル名も頑張って、選択したシート名が適用されるように頑張ってみました。
For Each s In Array(“10月”, “11月”) からの部分です。
1つのシートを複数のPDFファイルに分ける
これに関しては、先のRange指定の部分を使えば簡単にできますので、省略します。
ActiveSheet.Range(“A8:G40”).ExportAsFixedFormat (xlTypePDF)
などとして特定の範囲をRangeで指定して、複数回PDFファイルに出力すればOKでしょう。