Excel VBAでPDF出力する方法をお探しですね。
広告
Excel VBAでPDFを自動出力する方法【シート・範囲指定も解説】
請求書や見積書、報告書などを毎回手作業でPDF保存していませんか?Excel VBAを使えば、ボタン一つでPDF出力を自動化できます。
特定のシートだけ、あるいは表の一部分だけをPDF化したい場合でも、基本は「ExportAsFixedFormat」というメソッドを使うだけです。
この記事では、Excel VBAでシートや範囲をPDFとして保存する方法を、初心者でもすぐに使えるコード付きで解説します。
1. Excel VBAでPDF出力する基本
Excel VBAでPDFを作るには、`ExportAsFixedFormat`というメソッドを使います。
これは、Excelのシートやセル範囲をPDFやXPSといった形式で保存するための機能です。
「名前を付けて保存」をVBAで自動実行するイメージですね。
毎月同じ形式の請求書をPDF化したり、報告書だけを関係者に共有したりする場面で、とても便利です。
基本的な使い方はシンプルで、対象のシートや範囲に対して`ExportAsFixedFormat Type:=xlTypePDF`を実行するだけ。
ただし、実際の業務では保存先やファイル名をしっかり指定しておくのがおすすめです。
指定しないと、どこに保存されたか分からなくなったり、同じ名前のファイルを上書きしてしまったりするので注意しましょう。
ファイル名に日付や時刻を入れておくと、上書きを防げて安心です。
“`vba
Sub ActiveSheetToPDF()
Dim savePath As String
‘ ブックが保存されているか確認
If ThisWorkbook.Path = “” Then
MsgBox “先にExcelブックを保存してください。
“, vbExclamation
Exit Sub
End If
‘ 保存先のパスを作成(日時とシート名を含める)
savePath = ThisWorkbook.Path & “\” & _
Format(Now, “yyyymmdd_hhmmss”) & “_” & _
ActiveSheet.Name & “.pdf”
‘ PDF出力
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=savePath, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=False, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
End Sub
“`
このコードを実行すると、今開いているシートが、Excelファイルと同じフォルダーにPDFとして保存されます。
`OpenAfterPublish:=True`にしているので、保存後に自動でPDFが開いて内容を確認できます。
いちいち開かなくていい場合は`False`に変えてください。
`ThisWorkbook.Path`は、マクロが入っているExcelファイルの保存場所を表します。
まだ一度も保存していないブックだと空っぽになるので、最初にチェックを入れておくとエラーを防げます。
2. 特定のシートだけをPDF出力する
特定のシートだけをPDFにしたいときは、`Worksheets(“シート名”)`のように対象を明示して`ExportAsFixedFormat`を実行します。
さっきのコードは「今開いているシート」を対象にしていましたが、ユーザーが別のシートを開いた状態でマクロを実行すると、意図しないシートがPDF化されてしまいます。
業務用のマクロでは、出力対象をシート名で固定しておくほうが安全です。
たとえば「請求書」シートだけをPDFにしたいなら、こんな感じです。
“`vba
Sub SpecificSheetToPDF()
Dim ws As Worksheet
Dim savePath As String
‘ ブックが保存されているか確認
If ThisWorkbook.Path = “” Then
MsgBox “先にExcelブックを保存してください。
“, vbExclamation
Exit Sub
End If
‘ 対象シートを指定
Set ws = ThisWorkbook.Worksheets(“請求書”)
‘ 保存先のパスを作成
savePath = ThisWorkbook.Path & “\” & _
Format(Date, “yyyymmdd”) & “_” & _
ws.Name & “.pdf”
‘ PDF出力
ws.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=savePath, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=False, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=False
MsgBox “PDFを保存しました。
” & vbCrLf & savePath, vbInformation
End Sub
“`
このコードでは「請求書」シートをPDFとして保存します。
`IgnorePrintAreas:=False`は、シートに設定されている印刷範囲を使う設定です。
あらかじめExcelで印刷範囲を設定しておけば、その範囲だけがPDF化されます。
逆に、印刷範囲を無視してシート全体を出力したい場合は`True`にします。
ただし、シート全体をPDFにすると不要な空白ページが入ることがあるので、実務では印刷範囲をきちんと設定してから出力するのがおすすめです。
複数シートを1つのPDFにまとめる
複数のシートを1つのPDFファイルにまとめたい場合は、対象シートを選択してから出力します。
たとえば「表紙」「明細」「集計」の3シートを1つのPDFにしたいときは、こんな感じです。
“`vba
Sub MultipleSheetsToOnePDF()
Dim savePath As String
Dim activeSheetName As String
‘ ブックが保存されているか確認
If ThisWorkbook.Path = “” Then
MsgBox “先にExcelブックを保存してください。
“, vbExclamation
Exit Sub
End If
‘ 現在のシートを記憶しておく
activeSheetName = ActiveSheet.Name
‘ 保存先のパスを作成
savePath = ThisWorkbook.Path & “\” & _
Format(Now, “yyyymmdd_hhmmss”) & “_報告書一式.pdf”
‘ 複数シートを選択
ThisWorkbook.Worksheets(Array(“表紙”, “明細”, “集計”)).Select
‘ PDF出力
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=savePath, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=False, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
‘ 元のシートに戻す
ThisWorkbook.Worksheets(activeSheetName).Select
End Sub
“`
この方法だと、指定したシートが1つのPDFに連結されます。
ページの順番は基本的にシート見出しの並び順になるので、出力順を管理したい場合はシートの並びも確認しておきましょう。
マクロ実行後に選択状態が変わると作業しづらいので、実行前のシートを記憶しておいて、最後に戻す処理を入れると親切です。
複数シートをそれぞれ別々のPDFにする
逆に、複数シートをそれぞれ別のPDFファイルにしたい場合は、`For Each`でシートを順番に処理します。
全店舗分の帳票を個別PDFとして保存したいときなどに便利です。
“`vba
Sub MultipleSheetsToSeparatePDFs()
Dim ws As Worksheet
Dim savePath As String
If ThisWorkbook.Path = “” Then
MsgBox “先にExcelブックを保存してください。
“, vbExclamation
Exit Sub
End If
‘ 各シートをループ処理
For Each ws In ThisWorkbook.Worksheets
savePath = ThisWorkbook.Path & “\” & _
Format(Date, “yyyymmdd”) & “_” & _
ws.Name & “.pdf”
ws.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=savePath, _
Quality:=xlQualityStandard, _
OpenAfterPublish:=False
Next ws
MsgBox “すべてのシートをPDF出力しました。
“, vbInformation
End Sub
“`
3. 特定のセル範囲だけをPDF保存する
シート全体ではなく、一部の範囲だけをPDFにしたい場合もありますよね。
方法は主に2つあります。
1つ目は、`PageSetup.PrintArea`で印刷範囲を設定してからシートをPDF出力する方法。
2つ目は、`Range(“A1:F30”)`のようなセル範囲に対して直接`ExportAsFixedFormat`を実行する方法です。
どちらも使えますが、実務では印刷設定と合わせて管理しやすい`PrintArea`を使う方法がおすすめです。
印刷範囲、余白、拡大縮小、用紙の向きなどをまとめて調整できるので、PDFの見た目を安定させやすくなります。
“`vba
Sub RangeToPDF_ByPrintArea()
Dim ws As Worksheet
Dim savePath As String
If ThisWorkbook.Path = “” Then
MsgBox “先にExcelブックを保存してください。
“, vbExclamation
Exit Sub
End If
Set ws = ThisWorkbook.Worksheets(“報告書”)
savePath = ThisWorkbook.Path & “\” & _
Format(Now, “yyyymmdd_hhmmss”) & “_報告書範囲.pdf”
‘ 印刷範囲とページ設定を指定
With ws.PageSetup
.PrintArea = “$A$1:$H$40” ‘ 印刷範囲
.Orientation = xlPortrait ‘ 縦向き
.Zoom = False ‘ 拡大縮小率を自動調整
.FitToPagesWide = 1 ‘ 横幅を1ページに収める
.FitToPagesTall = False ‘ 縦は自動
End With
‘ PDF出力
ws.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=savePath, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=False, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
End Sub
“`
このコードでは、「報告書」シートのA1からH40までを印刷範囲に設定して、その部分だけをPDF化しています。
`.Zoom = False`にして`.FitToPagesWide = 1`を指定すると、横幅を1ページに収める設定になります。
列数が多い表だと、PDF化したときに右端が別ページに分かれてしまうことがありますが、この設定で防げます。
ただし、横幅を無理に1ページに収めると文字が小さくなりすぎる場合があるので、用紙の向きや列幅も調整しておくといいですね。
セル範囲を直接PDF化する方法
セル範囲を直接PDF化する場合は、こんな感じで書けます。
“`vba
Sub RangeToPDF_Direct()
Dim ws As Worksheet
Dim savePath As String
If ThisWorkbook.Path = “” Then
MsgBox “先にExcelブックを保存してください。
“, vbExclamation
Exit Sub
End If
Set ws = ThisWorkbook.Worksheets(“報告書”)
savePath = ThisWorkbook.Path & “\” & _
Format(Now, “yyyymmdd_hhmmss”) & “_指定範囲.pdf”
‘ セル範囲を直接PDF出力
ws.Range(“A1:H40”).ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=savePath, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=False, _
OpenAfterPublish:=True
End Sub
“`
シートの印刷範囲を変更したくないときや、一時的に一部分だけ出力したいときに便利です。
ただし、ページ設定との関係で思ったような見た目にならない場合もあるので、請求書や社外提出資料のようにレイアウトが重要なPDFでは、前述の`PrintArea`方式のほうが安定します。
範囲指定で注意したいのは、対象範囲にデータがない場合や、印刷対象が空っぽに近い場合、PDFを開いたときに空白ページのような結果になることがある点です。
PDF出力がうまくいかないときは、まず対象シート名、セル範囲、印刷範囲、改ページ位置を確認してみてください。
4. PDF保存でよく使う設定と失敗しないコツ
`ExportAsFixedFormat`にはいろんな設定項目がありますが、最初から全部覚える必要はありません。
実務でよく使うのは以下の5つです。
– **Type**: PDF形式を指定(`xlTypePDF`)
– **Filename**: 保存先とファイル名
– **Quality**: 品質(`xlQualityStandard`が標準)
– **IgnorePrintAreas**: 印刷範囲を使うかどうか
– **OpenAfterPublish**: 出力後にPDFを開くかどうか
特に`Filename`は必ず指定しましょう。
保存先が曖昧だと、PDFがどこに作られたか分からなくなって、利用者が混乱してしまいます。
“`vba
Sub PDFExport_WithOptions()
Dim ws As Worksheet
Dim folderPath As String
Dim savePath As String
Set ws = ThisWorkbook.Worksheets(“請求書”)
If ThisWorkbook.Path = “” Then
MsgBox “先にExcelブックを保存してください。
“, vbExclamation
Exit Sub
End If
‘ PDF出力用のフォルダーを作成
folderPath = ThisWorkbook.Path & “\PDF出力”
If Dir(folderPath, vbDirectory) = “” Then
MkDir folderPath
End If
‘ 保存先のパスを作成
savePath = folderPath & “\” & _
Format(Now, “yyyymmdd_hhmmss”) & “_” & _
ws.Name & “.pdf”
‘ 確認メッセージ
If MsgBox(“PDFを出力します。
よろしいですか?”, _
vbQuestion + vbYesNo) = vbNo Then
Exit Sub
End If
‘ PDF出力(1ページ目のみ)
ws.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=savePath, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=False, _
IgnorePrintAreas:=False, _
From:=1, _
To:=1, _
OpenAfterPublish:=True
End Sub
“`
このサンプルでは、Excelファイルと同じ場所に「PDF出力」フォルダーを作って、その中へPDFを保存します。
フォルダーがなければ`MkDir`で作成するので、保存先がなくてエラーになる心配がありません。
また、`From:=1, To:=1`を指定しているので、PDFの1ページ目だけを出力します。
複数ページある帳票のうち特定ページだけを再出力したい場合に便利です。
全ページ出力したいなら、`From`と`To`を省略すればOKです。
品質設定について
品質を指定する`Quality`には、標準品質の`xlQualityStandard`と、ファイルサイズを抑える`xlQualityMinimum`があります。
社外に提出する帳票や印刷前提の資料では標準品質を使うのが無難です。
社内確認用でファイルサイズを軽くしたい場合は、最小品質を検討してもいいでしょう。
ドキュメントプロパティについて
`IncludeDocProperties`は、PDFに作成者などの情報を含めるかどうかを指定します。
インターネット公開や社外共有を想定するPDFでは、個人名や社内情報を不用意に含めないために`False`にしておくと安心です。
失敗しないためのポイント
最後に、PDF出力マクロを安定して使うためのポイントをまとめます。
– **保存名を明確にする**: 日時を含めれば上書きリスクを減らせます
– **保存先を固定する**: どこに保存されたか分かりやすくしましょう
– **印刷範囲を整える**: あらかじめExcelで印刷範囲を設定しておくと、見やすいPDFになります
– **上書きの扱いを決める**: 常に最新版として置き換えたいなら固定名、履歴を残したいなら日時入りの名前にします
どちらが正しいというより、業務フローに合わせて設計することが大切です。
まとめ
Excel VBAでシートや範囲をPDFとして出力・保存する方法を押さえておけば、帳票作成、メール添付、共有フォルダーへの保存といった一連の作業を自動化できます。
慣れてきたら、PDF作成後にOutlookでメール送信する処理や、ファイル名に取引先名・請求月を入れる処理へ発展させると、さらに実務で使いやすい仕組みになります。
ぜひ、今日から試してみてください!
広告
