Excelで印刷するのと同じような感覚でPDF出力するサンプルコードを掲載します。
もともとExcelでは「名前を付けて保存」からPDF形式を選んで保存することでPDFファイルの出力ができます。
それでも、やはりボタンひとつで特定のシートを出力したり、ブックすべてのシートを一括で出力できる仕組みはとても便利です。
名前を付けて保存から出力するよりアクション数を減らせるだけでなく、どのフォルダへどういった名前で出力するかも指定しておけるので、複数ユーザーが使う場合でも運用を統一できます。
何より、短いコードをコピペするだけなので、実装するのも簡単です。
サンプルコードはいくつかのバリエーションを用意しましたので、目的に近いものがあればぜひ取り入れてみてください。
PDF出力するメソッド
コピペといっても、出力するシートや出力するフォルダ等、最低限の部分変更は必要なので、カスタマイズのポイントがわかるように基本的な構成等を記載しておきます。
構成(ExportAsFixedFormatメソッド)
よく使う基本的なパターンは次のような感じです。
Sub 基本的な構成() 対象シート等の指定.ExportAsFixedFormat Type:=xlTypePDF, Filename:="出力するPDFファイルのフルパス.pdf" End Sub
次に、省略可能なすべての引数を省略したのが次の型です。
Sub 最小構成()
対象シート等の指定.ExportAsFixedFormat Type:=xlTypePDF
End Sub
最小構成の場合、出力先を指定していないので、VBAを動かしているブックと同じフォルダに、「ブック名.pdf」というファイル名で出力されます。
実際にはこの2パターンだけ覚えておけば困ることはそうないでしょう。
一応、引数をすべて書くと次のようになります。
対象シート等の指定.ExportAsFixedFormat _ Type:=出力形式, _ Filename:=出力ファイルのフルパス, _ Quality:=品質設定, _ IncludeDocProperties:=文書のプロパティ情報, _ IgnorePrintAreas:=印刷範囲の利用, _ From:=開始ページ, _ To:=終了ページ, _ OpenAfterPublish:=出力後の表示, _ FixedFormatExtClassPtr:=FixedFormatExtクラスへのポインター
長いですね、正直あまり知らなくていいと思います。
これらの引数は次の項目で設定値などを一覧にしています。興味なければ飛ばしてください。
引数の概要
それぞれの引数については次の表に概要を挙げておきます。
引数 | 概要 | 指定値 |
---|---|---|
Type | 出力形式 | PDF:xlTypePDF XPS:xlTypeXPS |
Filename | 出力ファイル名 | フルパスで指定 ※既定値:ブックパス&ファイル名 |
Quality | 画質 | 標準:xlQualityStandard 最小:xlQualityMinimum ※既定値:標準 |
IncludeDocProperties | 文書プロパティ | 残す:True、残さない:False ※既定値:False |
IgnorePrintAreas | 印刷範囲 | 無視:True、有効:False ※既定値:False |
From | 開始ページ | ページ番号で指定 ※既定値:1 |
To | 終了ページ | ページ番号で指定 ※既定値:最終ページ |
OpenAfterPublish | 出力後の表示 | 表示:True、何もしない:False ※既定値:False |
FixedFormatExtClassPtr | FixedFormatExt クラスへのポインター | ? |
FixedFormatExtClassPtrについて
私はこの引数を使ったことがなく、この記事を書くにあたり調べたものの、あまり情報がありませんでした。
たいていのページでは次のように説明されています。どれもMicrosoftのページのコピーですね。
ブックを別の固定形式で保存できるようにする IMsoDocExporterインターフェイスの実装へのポインター
また、Microsoftのページでは次のような説明もあったので、恐らく外部ソフト等との連携のために存在する引数のようにも見えます。ただし、引数の値をどのように指定するかなどは結局わかりませんでした。
Officeの拡張(2007)固定形式のエクスポート機能
Microsoft Office Publisher2007などの2007Microsoft Officeリリースのアプリケーション用のCOMアドインを作成します。これは、Officeの固定形式のエクスポート機能を拡張して新しい形式をサポートします。説明されている手法には、C ++とCOMの知識が必要です。
サンプルコード
ExportAsFixedFormatメソッドの注意点として、ファイルを出力した際、出力先に同じ名前(&拡張子)のファイルがあると警告なしで上書きしてしまいます。
そのため、ここで紹介しているサンプルコードは、出力ファイル名(Filename)に、日時分までを付与するようにしています。(不要な場合は「Format(Now, “mmdd-hhmm”) & “_” &」という部分を削除してください。)
アクティブシートのみPDF出力
Sub PDF出力1()
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\" & Format(Now, "mmdd-hhmm") & "_" & ActiveSheet.Name & ".pdf"
End Sub
実行すると、アクティブシートを、実行ブックがあるフォルダにPDF出力します。
出力ファイル名は出力したシート名になります。
特に変更なしでも使えるコードですので、適当な標準モジュールに貼り付けて試してみてください。
運用では出力したいシートにボタンを用意して、そのボタンから実行することで表示中のシートをPDF出力できます。
アクティブシートのみPDF出力(実行確認付き)
Sub PDF出力2()
'実行確認
If MsgBox("PDF形式で出力します。よろしいですか?", vbQuestion + vbYesNo) = vbNo Then
MsgBox "中止しました。"
Exit Sub
End If
'出力処理
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\" & Format(Now, "mmdd-hhmm") & "_" & ActiveSheet.Name & ".pdf"
End Sub
先のコードに実行確認を付けただけです。
以下のコードにはすべて付けています。
対象シートを指定してPDF出力
Sub PDF出力3()
'対象シート名
Dim ShName As String
ShName = "Sheet1"
'実行確認
If MsgBox(ShName & "シートをPDF形式で出力します。よろしいですか?", vbQuestion + vbYesNo) = vbNo Then
MsgBox "中止しました。"
Exit Sub
End If
'出力処理
Sheets(ShName).ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\" & Format(Now, "mmdd-hhmm") & "_" & Sheets(ShName).Name & ".pdf"
End Sub
次の赤字部分を出力したいシートの名前にすることで、そのシートを出力できます。
ShName = “Sheet1“
全シートを1つにまとめてPDF出力
Sub PDF出力4()
'実行確認
If MsgBox("PDF形式で出力します。よろしいですか?", vbQuestion + vbYesNo) = vbNo Then
MsgBox "中止しました。"
Exit Sub
End If
'出力処理
ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\" & Format(Now, "mmdd-hhmm") & "_" & ThisWorkbook.Name & ".pdf"
End Sub
ブック内のすべてのシートを1つのPDFファイル内に連結して出力します。
出力したファイルの名前はブック名になります。
全シートをシートごとにPDF出力
Sub PDF出力5()
'実行確認
If MsgBox("PDF形式で出力します。よろしいですか?", vbQuestion + vbYesNo) = vbNo Then
MsgBox "中止しました。"
Exit Sub
End If
'出力処理
Dim WS As Worksheet
For Each WS In Worksheets
WS.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\" & Format(Now, "mmdd-hhmm") & "_" & WS.Name & ".pdf"
Next
End Sub
ブック内の全シートをシート別にファイルを分けて出力します。
出力したファイルの名前は各シート名になります。
指定したシート範囲をシートごとにPDF出力
Sub PDF出力6()
'対象シート
Dim SttSh As Long
Dim EndSh As Long
SttSh = 1 '開始シート№(インデックス№)
EndSh = 3 '終了シート№(インデックス№)
'シート数確認
Dim ShCnt As Long
ShCnt = Sheets.Count
'整合性判定
If SttSh > ShCnt Or EndSh > ShCnt Then
MsgBox "出力範囲がシート数を超えています。", vbExclamation
Exit Sub
ElseIf SttSh > EndSh Then
MsgBox "開始シート№は終了シート№より小さくなるように指定してください。", vbExclamation
Exit Sub
End If
'実行確認
If MsgBox("シート№" & SttSh & "~" & EndSh & "までをPDF形式で出力します。" & vbCrLf & _
"よろしいですか?", vbQuestion + vbYesNo) = vbNo Then
MsgBox "中止しました。"
Exit Sub
End If
'出力処理
Dim i As Long
For i = SttSh To EndSh
Sheets(i).ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\" & Format(Now, "mmdd-hhmm") & "_" & Sheets(i).Name & ".pdf"
Next
End Sub
任意のシートの範囲(1枚目~3枚目など)を出力します。
次の数値を変更することで、出力範囲を変更できます。
SttSh = 1 ‘開始シート№(インデックス№)
EndSh = 3 ‘終了シート№(インデックス№)
整合性判定の部分では、上記で指定した数値が正しいか判断しています。具体的には、①シート総数を超える値が指定されていないか、②開始№が終了№より大きくなっていないか、です。
指定した非連続シートをシート別にPDF出力
Sub PDF出力7()
'対象シートの指定
Dim Arr As Variant
Arr = Array(1, 3) 'シートのIndex番号を指定
'エラー発生時のスキップ
On Error GoTo Err
'実行確認
If MsgBox("PDF形式で出力します。よろしいですか?", vbQuestion + vbYesNo) = vbNo Then
MsgBox "中止しました。"
Exit Sub
End If
'出力処理
Dim WS As Worksheet
For Each WS In Sheets(Arr)
WS.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\" & Format(Now, "mmdd-hhmm") & "_" & WS.Name & ".pdf"
Next
Exit Sub
Err: 'エラー発生時のスキップ先
MsgBox "指定が正しくないため中断します。", vbExclamation
End Sub
このコードでは任意の非連続シート(1枚目と3枚目)を出力します。
対象シートは次のようにシートのインデックス№(左から何番目のシートか)をカンマで区切って指定しているので、出力シートを変更するときはこの数値を変更してください。
Arr = Array(1, 3)
もちろん、インデックス№ではなくシート名で指定することも可能です。
その場合は次のように指定しましょう。シート名は””で囲うのがお約束です。
Arr = Array(“シート1”, “シート3”)
なお、このサンプルコードでは整合性判定を行う代わりに、エラーが発生した場合にErr:まで処理をスキップして強制終了させるようにしています。(存在しないシート№が指定された場合などのエラー回避)
まとめ
掲載したサンプルコードはすべてVBAを実行しているブックのある場所(ThisWorkbook.Path)に出力するようにしています。
出力先フォルダを変える場合はThisWorkbook.Pathを“C:\フォルダ”のように変更すればいいだけです。
また、引数について、サンプルコードでは主にFilenameしか紹介していませんが、次の引数は意外と使う可能性があると思います。必要性を感じた方は再度構成をチェックしてみてください。
- Quality 品質設定
- From 開始ページ
- To 終了ページ
- OpenAfterPublish 出力後の表示
以上、PDF出力する方法でした。
コメント