請求書をテンプレートから一括作成して PDF で保存する

公開日:2026年10月4日 執筆:Takuya カテゴリ:帳票・メール連携

請求データの一覧から、請求書のテンプレートシートに1社ずつ値を差し込み、取引先ごとの PDF を一括で作るマクロです。ファイル名の付け方や確認の仕組みも解説します。

どんな場面で使うか

毎月、数十社分の請求書を同じ形式で作り、PDF にしてメールで送る作業です。一覧から1社ずつ転記して PDF 保存を繰り返すと、転記ミスや保存し忘れが起きやすく、月末の大きな負担になります。

請求書の見た目は Excel のテンプレートシートで作っておき、マクロは「値を差し込む」と「PDF に保存する」だけを担当させるのが、保守しやすい作り方です。レイアウトを変えたいときに、コードを触らずにシートだけ直せます。

準備するもの

次の2枚のシートを用意します。テンプレート側では、差し込むセルの位置を決めておきます。

  • 「請求一覧」シート:A列 取引先名、B列 請求金額、C列 支払期限、D列 担当者(1行目は見出し)
  • 「請求書」シート:B3 に取引先名、E10 に請求金額、E12 に支払期限、B20 に担当者を差し込むレイアウト

コード

一覧の各行についてテンプレートに値を入れ、取引先名と年月を付けた名前で PDF を保存します。ファイル名に使えない記号は取り除いています。

Function SafeName(ByVal s As String) As String
    Dim c As Variant
    For Each c In Array("\", "/", ":", "*", "?", """", "<", ">", "|")
        s = Replace(s, c, "")
    Next c
    SafeName = Trim(s)
End Function

Sub MakeInvoices()
    Dim listWs As Worksheet, tpl As Worksheet
    Dim lastRow As Long, i As Long, folder As String, path As String, n As Long

    Set listWs = ThisWorkbook.Worksheets("請求一覧")
    Set tpl = ThisWorkbook.Worksheets("請求書")
    folder = ThisWorkbook.Path & "\請求書_" & Format(Date, "yyyymm")
    If Dir(folder, vbDirectory) = "" Then MkDir folder

    lastRow = listWs.Cells(listWs.Rows.Count, "A").End(xlUp).Row
    If MsgBox(lastRow - 1 & " 件の請求書を作成します。よろしいですか?", vbOKCancel) = vbCancel Then Exit Sub

    For i = 2 To lastRow
        tpl.Range("B3").Value = listWs.Cells(i, "A").Value
        tpl.Range("E10").Value = listWs.Cells(i, "B").Value
        tpl.Range("E12").Value = listWs.Cells(i, "C").Value
        tpl.Range("B20").Value = listWs.Cells(i, "D").Value
        tpl.Calculate                                   ' 数式(消費税など)を再計算

        path = folder & "\請求書_" & SafeName(listWs.Cells(i, "A").Value) & "_" & Format(Date, "yyyymm") & ".pdf"
        tpl.ExportAsFixedFormat Type:=xlTypePDF, Filename:=path, Quality:=xlQualityStandard, _
            IgnorePrintAreas:=False, OpenAfterPublish:=False
        n = n + 1
    Next i
    MsgBox n & " 件の PDF を作成しました" & vbCrLf & folder
End Sub

コードのポイント

PDF の出力には ExportAsFixedFormat を使います。IgnorePrintAreas に False を指定すると、テンプレートシートで設定した印刷範囲がそのまま PDF になります。印刷範囲とページ設定(用紙サイズ・余白・1ページに収める設定)は、先にテンプレートシートで決めておいてください。

取引先名には「株式会社〇〇/東京支店」のように、ファイル名に使えない記号が含まれることがあります。SafeName 関数で取り除かないと、保存の時点でエラーになります。

ミスを防ぐ工夫

実行前に件数を表示して確認を求めているのは、一覧の範囲が想定と違う(前月のデータが残っている、など)ときに気づけるようにするためです。また、作成した PDF はフォルダにまとめて出力されるので、メールで送る前に数件を開いて、金額や宛名が正しく差し込まれているかを確認してください。

テンプレート内で、消費税や合計を数式で計算している場合は、差し込み後に Calculate で再計算しています。自動計算を止めて高速化している場合に、計算前の値で PDF にしてしまうのを防ぐためです。

※請求書の記載内容(インボイス制度の登録番号など)は、ご自身の業務の要件に合わせてテンプレートを作成してください。

ほかの記事