VBAでPDFを一括保存する方法|ExportAsFixedFormat・Format・Replaceの使い方

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が初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール