【Excelマクロ】PDFファイルを一括で自動保存

ExcelからPDF保存、苦労していませんか?

Excelで作成した内容をPDF化することは実務上よくあります。

例えば、今回は請求書の作成について、一例を挙げますが、請求書であれば、複数社に請求書を送付するので、すべてPDFにします。

出力する時には、

  • 「〇〇株式会社_202404分」みたいにファイル名を毎回入力している
  • 人によって命名ルールがバラバラ
  • 保存ミスや上書きミスが起きる

このような問題が生じることがありますが、マクロで一気に解決できます。

請求書のPDF化を考える

今回行いたい内容

  • Excel上に請求データが一覧で並んでいる
  • 各取引先ごとに請求書をPDF出力する
  • 「取引先名_日付」の形式でファイル名をつけて保存したい
  • 指定フォルダに、ルールに従った名前でPDFを一括保存する

シート構成の例

Excelの”請求一覧”シートに次のような情報が並んでいると仮定します。

A列B列C列
取引先名請求金額請求日
株式会社A120,0002024/04/01
株式会社B80,0002024/04/01
株式会社C96,0002024/04/01

ステップ1:1社ずつPDF出力する準備

まずは「請求書」フォーマットが印刷される専用のシート(例:”請求書”シート)を用意しておきましょう。 このシートはマクロによって、行ごとのデータを入力してからPDF化されます。

ステップ2:VBAコード(PDF保存用)

次に、VBAコードを使って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

コードの説明

今回2つのシートの行き来をするため、Set構文を使って、シートの指定をはじめにしておきます。

シートの指定については、今回のように「シートをSetで指定する方法」もしくは、「シートを選択する方法」が取れるので、データを移行する量なども考えて、どのように処理するか考えてみましょう。

請求一覧と、請求書のシートが作成されていると想定しているので、請求書のシートに、請求書一覧からデータを反映させます。

作成時に意識することとしては、PDF化を行うので、最終的にどのような名前をつけるのかを考え、名前になる分を変数に入れるなどしておくとスムーズです。

PDFで保存するためには、パスで設定する必要があることと、PDFのファイル名については、「.pdf」まで指定する必要があります。指定した上で、For構文が動くことにより、顧客名のファイルが順番にできていくというVBAコードになっています。

VBAコードの内容
  • Worksheets("請求一覧"):データが一覧で並ぶ元シート
  • Worksheets("請求書"):印刷用の書式シート(各PDFの元)
  • ExportAsFixedFormat:PDFで保存する関数
  • Format(..., "yyyymm"):年月だけ抽出してファイル名に使用

応用編:保存先フォルダを選べるようにする

savePath = Application.GetSaveAsFilename(InitialFileName:=fileName, _
           FileFilter:="PDFファイル (*.pdf), *.pdf")

このようにすれば、保存場所やファイル名を手動で調整できるようになります。

よくある質問(Q&A)

Q1. フォルダにすでにファイルがあったら?

同じ名前があれば上書きされるので、ファイル名に日付や時刻を含めると安心です。

Q2. 名前に使えない文字(/や\など)があるとどうなる?

ファイル名に使えない文字を事前に Replace 関数で除去しておきましょう。

clientName = Replace(clientName, "/", "_")

まとめ

今回は請求書で説明をしましたが、同じシートを別名保存する場合には、今回のような方法がとれます。様々な場面で今回のようなことはおこりえるので、アレンジしてみましょう。

改めて今回行った内容ですが、

  • 毎回ファイル名をつける手間を省ける
  • 命名ルールを統一できる
  • 出力ミス・上書きミスを防げる

請求書だけでなく、見積書・納品書・出勤簿などにも応用可能です。

コメント