【インボイス制度対応】Excelで請求書を自動作成・PDF保存・メール送付まで自動化する方法——VBAコードのコピペで今日から使える

「毎月末に請求書を1件ずつ手打ちしてる。先月は30件で3時間かかった」

これ、うちの部署でも数年前まで普通にやってました。

担当者が変わるたびに書式がバラバラになって、誤入力でヒヤリとしたこともある。インボイス制度が始まってからは「登録番号ちゃんと入ってるか」の確認まで加わって、作業量が増える一方です。

この記事では、Excelで請求書を作成→PDF保存→メール送付まで自動化する方法を書きます。VBAのコードはコピペで動くよう完全版で掲載します。途中省略なし。

さらに、最近気になっている方が多い「インボイス制度への対応」と「電子帳簿保存法の保管要件」についても整理しました。

結論|VBAで処理する

Excelで請求書を自動化するなら、この順番です。

  1. インボイス制度・電帳法の必須項目を確認(やらないと後で全部作り直し)
  2. 顧客マスターをシートで管理(ここがすべての起点)
  3. 関数でデータ自動入力(VLOOKUP + TEXT関数)
  4. VBAで一括作成・PDF保存・メール送付(コピペで動く)
  5. 電帳法に則ったフォルダで保管(要件を満たす命名規則)

Excelで請求書を自動化する前にやること——インボイス制度・電帳法の確認

インボイス制度(適格請求書)の必須記載事項

2023年10月から始まったインボイス制度。「とりあえず登録番号は入れた」という方も多いですが、記載要件は6項目あります。

自動化前に、まずテンプレートにこの6項目が入っているかを確認してください。

必須項目内容チェック
① 適格請求書発行事業者の氏名・名称自社名
② 登録番号T+13桁の番号
③ 取引年月日請求対象期間
④ 取引内容軽減税率対象品目は「※」等で明示
⑤ 税率ごとの合計額と消費税額10%分・8%分を分けて記載
⑥ 書類の交付を受ける事業者の名称取引先名

これをExcelテンプレートに組み込んでから、自動化の設定に入ります。

電子帳簿保存法(電帳法)の保管要件

2024年1月から完全義務化された改正電帳法。電子取引のデータは紙に印刷して保存できなくなりました。

最低限やること:
– PDFファイル名に「日付・金額・取引先名」を含める(例:20260325_50000_株式会社サンプル_請求書.pdf
– 保存場所を固定する(後から検索できるフォルダ構造にする)
– 訂正・削除の記録を残せる運用にする

これを踏まえてVBAでPDF保存する際のファイル命名を設計します。


顧客マスターシートの設計——自動化の土台

自動化の起点は「顧客マスターシート」です。ここが整っていないと何もできません。

マスターシートの構成

Excelで新しいシートを作成し、シート名を「顧客マスター」にします。

項目名
A顧客IDC001
B会社名株式会社サンプル
C担当者名山田 太郎
Dメールアドレスyamada@sample.co.jp
E請求金額(税抜)50000
F取引内容総務コンサルティング費
G支払期日翌月末

このシートが「すべての自動化の起点」になります。


関数だけでできる請求書の自動入力

VLOOKUP + TEXT関数での自動入力

請求書テンプレートシートに以下の関数を入れると、顧客IDを入力するだけで自動入力されます。

会社名の自動入力(セルB5に入力):

=IFERROR(VLOOKUP(A5, 顧客マスター!A:G, 2, FALSE), "")

担当者名(セルB6):

=IFERROR(VLOOKUP(A5, 顧客マスター!A:G, 3, FALSE), "")

取引内容(セルB10):

=IFERROR(VLOOKUP(A5, 顧客マスター!A:G, 6, FALSE), "")

税抜金額(セルD10):

=IFERROR(VLOOKUP(A5, 顧客マスター!A:G, 5, FALSE), "")

消費税(10%)(セルD11):

=D10*0.1

合計金額(セルD12):

=D10+D11

発行日(セルD3):

=TEXT(TODAY(), "yyyy年m月d日")

これで顧客IDをA5に入力するだけで、会社名・担当者・金額・取引内容が自動入力されます。


VBAで一括作成・PDF保存・メール送付まで自動化する

準備:マクロの有効化

  1. Excelを開き「ファイル」→「オプション」→「セキュリティセンター」→「セキュリティセンターの設定」
  2. 「マクロの設定」→「すべてのマクロを有効にする」を選択
  3. OKで保存

VBAコード(完全版・コピペOK)

Alt + F11 でVBAエディタを開き、「挿入」→「標準モジュール」で以下のコードをそのまま貼り付けてください。(ちょっと長いコードですが)

Sub 請求書一括作成PDF保存メール送付()

    Dim ws請求書 As Worksheet
    Dim wsマスター As Worksheet
    Dim 最終行 As Long
    Dim i As Long
    Dim 顧客ID As String
    Dim 会社名 As String
    Dim メール As String
    Dim 金額 As Long
    Dim 発行日文字列 As String
    Dim PDFパス As String
    Dim 保存フォルダ As String

    ' シート取得
    Set ws請求書 = ThisWorkbook.Sheets("請求書テンプレート")
    Set wsマスター = ThisWorkbook.Sheets("顧客マスター")

    ' 保存フォルダの設定(実際のパスに変更してください)
    保存フォルダ = "C:\Users\あなたのユーザー名\Documents\請求書\2026年3月\"

    ' フォルダが存在しない場合は作成
    If Dir(保存フォルダ, vbDirectory) = "" Then
        MkDir 保存フォルダ
    End If

    ' 発行日
    発行日文字列 = Format(Now(), "YYYYMMDD")

    ' マスターシートの最終行を取得(2行目から)
    最終行 = wsマスター.Cells(Rows.Count, 1).End(xlUp).Row

    For i = 2 To 最終行

        ' マスターから情報取得
        顧客ID = wsマスター.Cells(i, 1).Value
        会社名 = wsマスター.Cells(i, 2).Value
        メール = wsマスター.Cells(i, 4).Value
        金額 = wsマスター.Cells(i, 5).Value

        ' 顧客IDが空なら終了
        If 顧客ID = "" Then Exit For

        ' 請求書テンプレートに顧客IDをセット(VLOOKUPで自動入力される)
        ws請求書.Range("A5").Value = 顧客ID

        ' 再計算を確実に実行
        Application.Calculate

        ' ファイル名の生成(電帳法対応:日付_金額_会社名)
        Dim ファイル名 As String
        ファイル名 = 発行日文字列 & "_" & 金額 & "_" & 会社名 & "_請求書.pdf"
        PDFパス = 保存フォルダ & ファイル名

        ' PDF保存
        ws請求書.ExportAsFixedFormat _
            Type:=xlTypePDF, _
            Filename:=PDFパス, _
            Quality:=xlQualityStandard, _
            IncludeDocProperties:=True, _
            IgnorePrintAreas:=False, _
            OpenAfterPublish:=False

        ' メール送付(Outlookが必要)
        Call メール送付(メール, 会社名, 金額, PDFパス)

        ' 進捗表示
        Application.StatusBar = i - 1 & "件完了(全" & 最終行 - 1 & "件)"

    Next i

    ' ステータスバーをリセット
    Application.StatusBar = False

    MsgBox 最終行 - 1 & "件の請求書を作成・PDF保存・メール送付しました。", vbInformation

End Sub

Sub メール送付(送付先メール As String, 会社名 As String, 金額 As Long, PDFパス As String)

    Dim olApp As Object
    Dim olMail As Object

    On Error GoTo エラー処理

    Set olApp = CreateObject("Outlook.Application")
    Set olMail = olApp.CreateItem(0) ' メールアイテム

    With olMail
        .To = 送付先メール
        .Subject = "【請求書】" & Format(Now(), "YYYY年M月") & "分 ご請求書の送付"
        .Body = 会社名 & " 御中" & vbCrLf & _
                vbCrLf & _
                "いつもお世話になっております。" & vbCrLf & _
                "添付のとおり、" & Format(Now(), "YYYY年M月") & "分の請求書をお送りいたします。" & vbCrLf & _
                vbCrLf & _
                "ご請求金額:" & Format(金額 * 1.1, "#,##0") & "円(税込)" & vbCrLf & _
                vbCrLf & _
                "ご確認のほど、よろしくお願いいたします。" & vbCrLf & _
                vbCrLf & _
                "(自社名・担当者名・連絡先をここに入力)"
        .Attachments.Add PDFパス
        .Send ' 自動送信。確認してから送る場合は .Display に変更
    End With

    Set olMail = Nothing
    Set olApp = Nothing
    Exit Sub

エラー処理:
    MsgBox "メール送付エラー(" & 会社名 & "):" & Err.Description

End Sub

コードの使い方

  1. 上記コードをVBAエディタに貼り付け
  2. 保存フォルダ の部分を自分のPCのパスに変更
  3. Alt + F8 → 「請求書一括作成PDF保存メール送付」を選択 → 「実行」
  4. 顧客マスターの全顧客分が自動で処理されます

メール送付について: このコードはOutlookがインストールされている環境向けです。Gmailを使う場合は、PythonのSMTPライブラリ経由の方法が便利です(後述)。


電子帳簿保存法に則ったフォルダ設計

VBAコードで生成したPDFファイルを、電帳法に則って保管するためのフォルダ構造です。

請求書/
  └── 2026年/
        ├── 2026年1月/
        │     ├── 20260131_50000_株式会社A_請求書.pdf
        │     └── 20260131_80000_株式会社B_請求書.pdf
        ├── 2026年2月/
        └── 2026年3月/

電帳法対応チェックリスト:
– □ ファイル名に「日付・金額・取引先名」が含まれている
– □ 保存場所が固定されている(毎月同じ場所に保存)
– □ バックアップを取っている(外部ストレージまたはクラウド)
– □ 削除・改ざんができない運用になっている


よくある質問

Q. VBAを使ったことがないが、本当に動きますか?

はい。上のコードはコピペで動作確認済みです。VBAエディタへの貼り付けは Alt+F11 で開いて「挿入」→「標準モジュール」、あとはコードを貼るだけです。保存フォルダのパスだけ自分のPCに合わせて変更してください。

Q. Outlookを使っていません。Gmailで送りたいです。

Outlookがない環境でのメール送付は、Pythonのsmtplibライブラリを使うのが現実的です。VBAでPDFを作成した後、Pythonで一括送付する方法はこちらの記事で詳しく解説しています。

Q. マクロが動きません。「マクロが無効になっています」と表示されます。

「ファイル」→「オプション」→「セキュリティセンター」→「マクロの設定」→「すべてのマクロを有効にする」に変更してください。会社のPCでセキュリティポリシーが設定されている場合は、IT部門に相談が必要なケースがあります。

Q. 消費税の端数処理はどうすればいいですか?

インボイス制度では「税率ごとに1回の端数処理」というルールがあります。切り捨て・切り上げ・四捨五入のいずれでもよいですが、自社で統一してください。VBAコードでは CLng(金額 * 0.1) で四捨五入になります。

Q. 100件以上の顧客がいます。Excelで対応できますか?

月100件を超えてくると、VBAの実行時間が長くなり、ヒューマンエラーのリスクも上がります。その段階では、Pythonで自動化する方法か、クラウドの請求書サービスへの移行を検討する時期です。目安は「月50件以下ならExcel、50〜100件でVBAフル活用、100件超でPythonまたはSaaS」です。


Excelの限界——月100件超えたら次のステップへ

正直に書きます。Excelのマクロは「小〜中規模の請求書作業」には十分です。でも限界もあります。

Excelで対応できる範囲:
– 月50件以下の請求書作成・PDF化・Outlook経由の送付
– 顧客情報の管理(数百件程度まで)

Excelが厳しくなってくるケース:
– 月100件超えると処理時間が体感できるほど遅くなる
– 複数人が同じExcelを編集しようとすると競合が起きる
– 請求書の修正履歴を管理したい

次のステップ:Python自動化
VBAでPDF保存まで自動化できたら、次は「PDF添付メールのGmail一括送付」をPythonで自動化すると、さらに時間を削減できます。月5〜10時間の削減を経験している方が多いです。

Pythonでメール自動送信する方法(Gmail・添付ファイル対応)


まとめ

  • インボイス制度対応: テンプレートに6項目が含まれているか最初に確認
  • 電帳法対応: ファイル名に「日付・金額・取引先名」を入れてフォルダ管理
  • 関数自動化: VLOOKUP + TEXT関数で顧客IDから自動入力
  • VBA一括処理: コピペで動くコードで、作成→PDF保存→Outlook送付まで一括
  • 次のステップ: 月50件超えたらPythonでGmail送付まで自動化

手入力の請求書作業から解放された経験から言うと、最初の「顧客マスターシートの整備」に一番時間をかけることをおすすめします。ここが整えば、VBAの自動化は1日で終わります。


関連記事

請求書の自動化ができたら、次は「勤怠チェック」「メール自動送信」など総務業務の自動化を広げていく段階です。

Pythonでメール自動送信(Gmail・添付ファイル対応)
勤怠チェックを自動化する方法
総務DX、何から始める?
Python・DX経験を転職でアピールしたい方はこちら


この記事は、総務部での実務経験をもとに執筆しています。Excelマクロから始めてPythonによる業務自動化まで実践してきた経験から、非エンジニアでも使える形で書いています。