請求書をテンプレートから一括作成して PDF で保存する
請求データの一覧から、請求書のテンプレートシートに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 にしてしまうのを防ぐためです。
※請求書の記載内容(インボイス制度の登録番号など)は、ご自身の業務の要件に合わせてテンプレートを作成してください。