Excelで作成した請求書を取引先ごとにPDF化する作業、毎回ファイル名を手入力していませんか?命名ルールのバラつきや保存ミスもよく起きる場面です。これをVBAで自動化すれば、ボタン一つでルール通りのファイル名で一括PDF保存できます。
この記事では、請求一覧シートのデータを1件ずつ請求書シートに転記してPDF出力するマクロを解説します。
ExcelシートをPDFに一括保存するには?
今回は次の2シート構成を使います。
- 「請求一覧」シート:取引先名・請求金額・請求日が一覧で並んでいる
- 「請求書」シート:印刷用のフォーマット(このシートをPDF化する)
マクロを実行すると、請求一覧を1行ずつ処理して、請求書シートにデータを転記→PDF保存を繰り返します。
Sub invoice_PDF()
Dim wsList As Worksheet
Dim wsForm As Worksheet
Dim i As Long
Dim lastRow As Long
Dim clientName As String
Dim billingDate As String
Dim fileName As String
Dim savePath As String
Set wsList = Worksheets("請求一覧")
Set wsForm = Worksheets("請求書")
lastRow = wsList.Cells(wsList.Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
clientName = wsList.Cells(i, 1).Value
billingDate = Format(wsList.Cells(i, 3).Value, "yyyymm")
' 請求書シートにデータを転記
wsForm.Range("B2").Value = clientName
wsForm.Range("B3").Value = wsList.Cells(i, 2).Value
wsForm.Range("B4").Value = wsList.Cells(i, 3).Value
' ファイル名と保存先を設定
fileName = clientName & "_" & billingDate & ".pdf"
savePath = ThisWorkbook.Path & "¥" & fileName
' PDFとして保存
wsForm.ExportAsFixedFormat Type:=xlTypePDF, Filename:=savePath
Next i
MsgBox "PDF出力が完了しました!"
End Sub
コードのポイントを理解するには?
ExportAsFixedFormat Type:=xlTypePDF, Filename:=savePath
シートをPDF形式で保存する命令です。Filename にはフルパス(フォルダパス+ファイル名)を指定します。.pdf の拡張子まで含める必要があります。
Format(日付, "yyyymm")
日付から年月だけを抽出して文字列に変換します。2024/04/01 なら "202404" になります。
ThisWorkbook.Path & "¥" & fileName
マクロが入っているブックと同じフォルダに保存されます。保存先を固定したくない場合はパスを別の変数で指定します。
ファイル名に使えない文字を除去するには?
取引先名に / や \ などのファイル名禁止文字が含まれるとエラーになります。Replace 関数で事前に置換しておきましょう。
clientName = Replace(clientName, "/", "_")
clientName = Replace(clientName, "\", "_")
保存先フォルダを毎回選択するには?
保存先を固定せず、実行のたびに選べるようにする応用例です。
savePath = Application.GetSaveAsFilename( _
InitialFileName:=fileName, _
FileFilter:="PDFファイル (*.pdf), *.pdf")
まとめ
ExportAsFixedFormat Type:=xlTypePDFでシートをPDFとして保存できるFormat(日付, "yyyymm")で年月をファイル名に活用できるThisWorkbook.Pathでブックと同じフォルダに保存先を設定できる- ファイル名禁止文字は
Replaceで事前に除去しておく - 請求書だけでなく見積書・納品書・出勤簿など同じシートを別名保存する場面に広く応用できる
よくある質問
同じファイル名がすでに存在する場合はどうなりますか?
上書きされます。ファイル名に日付や連番を追加しておくと上書きを防げます。例:clientName & "_" & billingDate & "_" & i & ".pdf"
複数シートをまとめて1つのPDFにできますか?
できます。Sheets(Array("シート1", "シート2")).Select で複数シートを選択してから ExportAsFixedFormat を実行すると、1つのPDFに結合できます。
PDF出力の印刷範囲はどう設定しますか?
シートの印刷範囲(ページ設定)がそのまま反映されます。事前にシートの「ページレイアウト」→「印刷範囲の設定」で範囲を指定しておくか、コード内で wsForm.PageSetup.PrintArea = "A1:F20" のように設定できます。
保存先フォルダが存在しない場合はエラーになりますか?
なります。Dir(フォルダパス, vbDirectory) = "" でフォルダの存在確認を行い、なければ MkDir で作成してから保存する処理を追加すると安全です。
ExportAsFixedFormatとPrintOutの違いは何ですか?
ExportAsFixedFormat はファイルとして保存します。PrintOut は実際にプリンターへ印刷します。PDF保存には必ず ExportAsFixedFormat を使います。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



