実践プロジェクト:請求書の自動作成

投稿日:2026-01-07

音声

※ AI音声で読み上げます

目次

  1. プロジェクトの要件定義(何を作るか)
  2. テンプレートシートの準備
  3. データシートから請求書への転記ロジック
  4. 複数の請求書を一括作成する
  5. PDFで保存して完成
  6. 注意(ここだけ)
  7. 要約

プロジェクトの要件定義(何を作るか)

請求データ(顧客名・請求日・金額など)がDataシートに行単位で並び、Templateシートの決まったセルへ転記してPDFで保存するマクロを作ります。

主要件は次のとおりです。

  • Data行からTemplateセルへのマッピングを定義し、空行や不完全なデータはスキップします。
  • 複数行をループ処理してPDF化し、出力先はブックと同じ場所のサブフォルダにします。
  • ファイル命名規則(例:顧客名_yyyymmdd.pdf)を決め、xlsmでの配布を前提にします。

テンプレートシートの準備

Templateシートに見た目(ロゴ、住所、明細枠)を作り、可変箇所は固定セルか名前付き範囲(例:顧客名、請求日、合計)にしておくと楽です。

印刷範囲(PrintArea)を設定しておくと、出力のズレを抑えやすいです。

テンプレートは直接上書きせず、コピーして使う運用を推奨します。

配布時はマクロ有効化手順を添えておきます。

データシートから請求書への転記ロジック

Dataシートは列ごとに項目が固定(A=顧客名、B=請求日、C=金額等)で、2行目以降に明細が並ぶ想定です。基本はForループで各行をTemplateの対応セルへ代入します。短い実例は次のとおりです。

Sub MinimalInvoice()
    Dim wsD As Worksheet, wsT As Worksheet
    Set wsD = ThisWorkbook.Worksheets("Data")
    Set wsT = ThisWorkbook.Worksheets("Template")
    wsT.Range("B2").Value = wsD.Range("A2").Value ' 顧客名
    wsT.Range("B3").Value = wsD.Range("B2").Value ' 請求日
    wsT.Range("B4").Value = wsD.Range("C2").Value ' 金額
    MsgBox "転記完了"
End Sub

Rangeは固定参照に向いており、Cellsはループ処理に向いています。.Valueと.Value2の違いは、日付や大きな数値を扱う場面で考慮します。

複数の請求書を一括作成する

Dataの最終行を取得してForループで回し、テンプレートに値を入れてPDF出力します。テンプレートを壊したくなければコピーして作業用シートを使い、出力後に削除します。代表的な一括処理例(簡略)です。

Sub CreateInvoicesPDF()
    Dim wsD As Worksheet, wsT As Worksheet, lastRow As Long, i As Long
    Dim outFolder As String, fileName As String
    Set wsD = ThisWorkbook.Worksheets("Data")
    Set wsT = ThisWorkbook.Worksheets("Template")
    lastRow = wsD.Cells(wsD.Rows.Count, "A").End(xlUp).Row
    outFolder = ThisWorkbook.Path & "\Invoices"
    If Dir(outFolder, vbDirectory) = "" Then MkDir outFolder
    For i = 2 To lastRow
        If Trim(wsD.Cells(i, "A").Value) <> "" Then
            wsT.Range("B2").Value = wsD.Cells(i, "A").Value
            wsT.Range("B3").Value = wsD.Cells(i, "B").Value
            wsT.Range("B4").Value = wsD.Cells(i, "C").Value
            fileName = outFolder & "\" & Replace(wsT.Range("B2").Value, "/", "_") & "_" & Format(wsT.Range("B3").Value, "yyyymmdd") & ".pdf"
            wsT.ExportAsFixedFormat Type:=xlTypePDF, Filename:=fileName, IgnorePrintAreas:=False
        End If
    Next i
    MsgBox "PDF出力完了"
End Sub

処理速度向上のため、Application.ScreenUpdating = Falseやエラー処理、ファイル名の禁則文字除去を入れてください。

PDFで保存して完成

ExportAsFixedFormatでPDF化し、ThisWorkbook.Path基準のサブフォルダに保存すると管理しやすいです。

同名ファイルの扱い(上書き/連番付与)や品質、印刷範囲(IgnorePrintAreas)などは引数で制御できます。

連続出力後はxlsmで保存しておくと再実行が容易です。

大量配布用のZIP化は外部ツールやPowerShellの併用が現実的です。

注意(ここだけ)

  • 最小マクロ:が無効化されていると動作しないため、.xlsmで保存してマクロを有効にすることが要チェックです。また、シート名・セル参照が一致しないとエラーになるため、スペルと大文字小文字を確認することがポイントです。

要約

  1. Dataシートの行をTemplateシートのセルへ転記し、PDF化するマクロを作る流れです。
  2. Templateシートは名前付き範囲と印刷範囲を設定し、原本はコピーして運用する方針です。
  3. 転記はForループで行を回し、RangeとCellsを使い分けて実装する形です。
  4. ExportAsFixedFormatでPDFをThisWorkbook.Path配下に保存し、必要に応じてフォルダの自動作成も行う想定です。
  5. 配布は.xlsmで行い、シート名・パス・ファイル名の整合性とマクロの有効化を事前に要チェックして運用します。