「毎月末に請求書を1件ずつ手打ちしてる。先月は30件で3時間かかった」
これ、うちの部署でも数年前まで普通にやってました。
担当者が変わるたびに書式がバラバラになって、誤入力でヒヤリとしたこともある。インボイス制度が始まってからは「登録番号ちゃんと入ってるか」の確認まで加わって、作業量が増える一方です。
この記事では、Excelで請求書を作成→PDF保存→メール送付まで自動化する方法を書きます。VBAのコードはコピペで動くよう完全版で掲載します。途中省略なし。
さらに、最近気になっている方が多い「インボイス制度への対応」と「電子帳簿保存法の保管要件」についても整理しました。
結論|VBAで処理する
Excelで請求書を自動化するなら、この順番です。
- インボイス制度・電帳法の必須項目を確認(やらないと後で全部作り直し)
- 顧客マスターをシートで管理(ここがすべての起点)
- 関数でデータ自動入力(VLOOKUP + TEXT関数)
- VBAで一括作成・PDF保存・メール送付(コピペで動く)
- 電帳法に則ったフォルダで保管(要件を満たす命名規則)
Excelで請求書を自動化する前にやること——インボイス制度・電帳法の確認
インボイス制度(適格請求書)の必須記載事項
2023年10月から始まったインボイス制度。「とりあえず登録番号は入れた」という方も多いですが、記載要件は6項目あります。
自動化前に、まずテンプレートにこの6項目が入っているかを確認してください。
| 必須項目 | 内容 | チェック |
|---|---|---|
| ① 適格請求書発行事業者の氏名・名称 | 自社名 | □ |
| ② 登録番号 | T+13桁の番号 | □ |
| ③ 取引年月日 | 請求対象期間 | □ |
| ④ 取引内容 | 軽減税率対象品目は「※」等で明示 | □ |
| ⑤ 税率ごとの合計額と消費税額 | 10%分・8%分を分けて記載 | □ |
| ⑥ 書類の交付を受ける事業者の名称 | 取引先名 | □ |
これをExcelテンプレートに組み込んでから、自動化の設定に入ります。
電子帳簿保存法(電帳法)の保管要件
2024年1月から完全義務化された改正電帳法。電子取引のデータは紙に印刷して保存できなくなりました。
最低限やること:
– PDFファイル名に「日付・金額・取引先名」を含める(例:20260325_50000_株式会社サンプル_請求書.pdf)
– 保存場所を固定する(後から検索できるフォルダ構造にする)
– 訂正・削除の記録を残せる運用にする
これを踏まえてVBAでPDF保存する際のファイル命名を設計します。
顧客マスターシートの設計——自動化の土台
自動化の起点は「顧客マスターシート」です。ここが整っていないと何もできません。
マスターシートの構成
Excelで新しいシートを作成し、シート名を「顧客マスター」にします。
| 列 | 項目名 | 例 |
|---|---|---|
| A | 顧客ID | C001 |
| 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保存・メール送付まで自動化する
準備:マクロの有効化
- Excelを開き「ファイル」→「オプション」→「セキュリティセンター」→「セキュリティセンターの設定」
- 「マクロの設定」→「すべてのマクロを有効にする」を選択
- 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
コードの使い方
- 上記コードをVBAエディタに貼り付け
保存フォルダの部分を自分のPCのパスに変更Alt + F8→ 「請求書一括作成PDF保存メール送付」を選択 → 「実行」- 顧客マスターの全顧客分が自動で処理されます
メール送付について: このコードは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による業務自動化まで実践してきた経験から、非エンジニアでも使える形で書いています。