【VBA】請求書・見積書をボタン1クリックで一括作成するマクロの作り方

毎月末になると、取引先ごとに請求書や見積書を1枚1枚手作業で作っていませんか?
「顧客情報一覧表を見ながら、取引先名・住所・工事件名・金額を手でコピペして……」その作業を10件、20件と繰り返していると、あっという間に1〜2時間が溶けてしまいます。
このような手間のかかるルーティーン作業はVBAで自動化しちゃいましょう。
VBAを使えば、顧客情報一覧表に入力されたデータを読み取り、請求書・見積書をボタン1クリックで一括作成可能です。
私はVBAを独学で身に付け現在は年間50件以上のマクロ開発を受注していて、「顧客情報一覧表から請求書・見積書を自動で作りたい」というご依頼をいただくことがあります。
この記事では、請求書・見積書一括作成マクロの作り方をプログラミング初心者の方でも理解できるよう、実際のVBAコードとともに丁寧に解説していきます。
読み終えたころには「これ、自分の仕事にそのまま使えそう!」と感じてもらえるはずです。
手作業の書類作成が引き起こす3つの問題
手作業で請求書・見積書を作り続けていると、知らないうちに大きなロスが積み重なっていきます。
VBAによる自動化を検討するにあたって、まず手作業が引き起こす問題を整理しておきましょう。
問題①:転記ミスが発生しやすく、信頼を損なうリスクがある
顧客情報一覧表から金額・住所・工事件名などを手でコピペしていると、どうしてもミスが起きます。
「取引先Aの金額を取引先Bの請求書に入力してしまった」「住所が1文字間違っていた」というトラブルは、手作業では避けられません。
書類の誤りは取引先との信頼関係に直結します。
私がマクロ開発を受注した案件でも、「毎月末に請求書の転記ミスが発生して、作り直しに時間を取られている」というご相談を複数いただきました。
VBAで自動化すれば、データの転記は機械が行うためヒューマンエラーをほぼゼロにすることが可能です。
問題②:件数が増えるほど作業時間が線形に増える
手作業の書類作成は、件数が2倍になれば作業時間もほぼ2倍になります。
取引先が10件のうちは何とかなっても、50件・100件と増えていくと月末の書類作成だけで丸1日以上かかるようになってしまいます。
ビジネスが成長するほど業務が圧迫される、という悪循環に陥ってしまいます。
VBAで一括作成の仕組みを作っておけば、件数が100件になっても処理時間はほぼ変わりません。
問題③:フォーマットの統一ができず、書類のクオリティにばらつきが出る
手作業で書類を作ると、担当者や作業のタイミングによってフォーマットが微妙にズレることがあります。
フォントが違う、列幅が変わっている、日付の書式が統一されていない……。
そのような細かいズレが積み重なると、取引先から「この会社、大丈夫かな?」と思われてしまうことがあります。
VBAで作成すれば、何件作っても必ず同じフォーマットで統一された書類を出力することができます。
請求書・見積書一括作成マクロの全体構成
このマクロを作る前に、全体の処理の流れを把握しておきましょう。
処理の流れを理解してからコードを書くと、どこで何をしているのかが明確になり、後でカスタマイズしやすくなります。
マクロの処理フローを理解する
今回作成するマクロの処理は、大きく4つのステップで構成されています。
ステップ1:顧客情報一覧表からデータを取得する
「顧客情報」シートに登録されている取引先名・住所・工事件名・金額・工期などのデータを1行ずつ読み込みます。
ステップ2:テンプレートシートを複製する
あらかじめ作成しておいた「請求書テンプレート」シートをコピーして、新しいシートを作成します。
ステップ3:取得したデータをテンプレートに転記する
コピーしたテンプレートの各セルに、顧客情報のデータを書き込みます。
ステップ4:PDF形式で保存する(オプション)
完成した書類を取引先名のファイル名でPDF保存します。
この4つのステップを繰り返し処理(For Nextループ)で回すことで、顧客情報一覧表の全行分の書類を一気に作成できます。
エクセルファイルの準備|テンプレートと顧客情報シートを作る
コードを書く前に、エクセルファイルの構成を整えておく必要があります。
ここをきちんと準備しておくと、後のコーディングがスムーズに進みます。
顧客情報シートの作り方
「顧客情報」という名前のシートを作成し、以下のような一覧表を作ります。
顧客情報シートのイメージがこちら

A列から順に「取引先名・住所・工事件名・金額・工期・書類種別」を入力します。
1行目はヘッダー行なので、データは2行目から入力してください。
F列の「書類種別」には「請求書」または「見積書」を入力しておき、マクロ側でどちらのテンプレートを使うかを判定させます。
請求書テンプレートシートの作り方
「請求書テンプレート」という名前のシートに、実際の請求書のレイアウトを作成します。
イメージがこちら

マクロから値を書き込む主なセルの例は以下のとおりです。
B5セル:住所
D3セル:発行日(マクロ実行日を自動入力)
B8セル:工事件名
D10セル:金額(税抜)
D11セル:消費税額
D12セル:合計金額
B14セル:工期
「見積書テンプレート」も同様に作成しておきましょう。
レイアウトは請求書と同じでも構いません。
請求書・見積書を一括作成するVBAコード
いよいよVBAコードの解説に入ります。
コードは長くなりますが、1つひとつのブロックが「どの処理をしているか」を意識しながら読むと理解しやすくなります。
一括作成マクロの基本コード
以下が、顧客情報一覧表から請求書・見積書を一括作成するVBAの基本コードです。
Sub 書類一括作成()
Dim ws顧客 As Worksheet
Dim ws請求テンプレ As Worksheet
Dim ws見積テンプレ As Worksheet
Dim ws新シート As Worksheet
' 各シートを変数にセット
Set ws顧客 = ThisWorkbook.Worksheets("顧客情報")
Set ws請求テンプレ = ThisWorkbook.Worksheets("請求書テンプレート")
Set ws見積テンプレ = ThisWorkbook.Worksheets("見積書テンプレート")
' 顧客情報の最終行を取得
Dim lastRow As Long
lastRow = ws顧客.Cells(ws顧客.Rows.Count, 1).End(xlUp).Row
' 2行目(データ1件目)から最終行まで繰り返し処理
Dim i As Long
For i = 2 To lastRow
' 顧客情報を変数に取得
Dim 取引先名 As String
Dim 住所 As String
Dim 工事件名 As String
Dim 金額 As Long
Dim 工期 As String
Dim 書類種別 As String
取引先名 = ws顧客.Cells(i, 1).Value
住所 = ws顧客.Cells(i, 2).Value
工事件名 = ws顧客.Cells(i, 3).Value
金額 = ws顧客.Cells(i, 4).Value
工期 = ws顧客.Cells(i, 5).Value
書類種別 = ws顧客.Cells(i, 6).Value
' 書類種別によって使用するテンプレートを切り替える
If 書類種別 = "請求書" Then
ws請求テンプレ.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
ElseIf 書類種別 = "見積書" Then
ws見積テンプレ.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
Else
MsgBox i & "行目の書類種別が不正です。「請求書」または「見積書」を入力してください。"
GoTo NextLoop
End If
' 複製されたシートを変数にセット
Set ws新シート = ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
' シート名を「書類種別_取引先名」に変更
ws新シート.Name = 書類種別 & "_" & 取引先名
' テンプレートに顧客情報を転記
ws新シート.Range("B3").Value = 取引先名 & " 御中"
ws新シート.Range("B5").Value = 住所
ws新シート.Range("D3").Value = Format(Now(), "yyyy年mm月dd日")
ws新シート.Range("B8").Value = 工事件名
ws新シート.Range("D10").Value = 金額
ws新シート.Range("D11").Value = 金額 * 0.1 ' 消費税(10%)
ws新シート.Range("D12").Value = 金額 + 金額 * 0.1 ' 合計金額
ws新シート.Range("B14").Value = 工期
NextLoop:
Next i
MsgBox "書類の一括作成が完了しました!", vbInformation
End Sub
それぞれのブロックが何をしているのか、順を追って解説します。
シートの変数セット
Set ws顧客 = ThisWorkbook.Worksheets(“顧客情報") の行で、処理に使う3つのシートを変数に格納しています。
シート名は実際のファイルに合わせて変更してください。
最終行の自動取得
lastRow = ws顧客.Cells(ws顧客.Rows.Count, 1).End(xlUp).Row で、A列のデータが入っている最終行番号を自動で取得します。
顧客情報が増えてもコードを変更せずに使い続けられる、汎用性の高い書き方です。
For Nextループで繰り返し処理
For i = 2 To lastRow で、2行目から最終行まで1行ずつ処理を繰り返します。
毎ループごとに取引先名・住所・工事件名・金額・工期・書類種別を変数に格納し、それぞれの書類作成に使います。
テンプレートのコピー
ws請求テンプレ.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count) で、テンプレートシートをエクセルファイルの末尾にコピーします。
書類種別が「請求書」か「見積書」かを If 文で判定し、使用するテンプレートを切り替えています。
データの転記
ws新シート.Range(“B3″).Value = 取引先名 & " 御中" のように、コピーしたシートの各セルに顧客情報を書き込みます。
金額については税抜・消費税・合計金額をそれぞれ計算して転記しています。
消費税の計算式について補足すると、金額 * 0.1 で10%の消費税額を、金額 + 金額 * 0.1 で合計金額(税込)を算出しています。
税率が変わった場合は 0.1 の部分を変更するだけで対応可能です。
作成した書類をPDFで自動保存するVBA
書類を作成したあと、PDF形式で自動保存する処理を追加すると、より実用的なマクロになります。
メールで送付する際にPDFが必要な場合は、以下のコードをループの末尾に追加してください。
PDFで自動保存するコード
' 作成した書類をPDFで保存(デスクトップに保存する例)
Dim 保存パス As String
保存パス = Environ("USERPROFILE") & "\Desktop\" & 書類種別 & "_" & 取引先名 & ".pdf"
ws新シート.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=保存パス, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=False
コードの処理フローを解説します。
Environ(“USERPROFILE") & “\Desktop\" で保存先をデスクトップに指定しています。
Environ(“USERPROFILE") は実行しているパソコンのユーザーフォルダのパスを自動取得するコードで、パソコンが変わっても動作するよう汎用的に書いています。
保存するファイル名は 書類種別 & “_" & 取引先名 & “.pdf" としているため、「請求書_株式会社○○.pdf」「見積書_有限会社△△.pdf」というように自動でわかりやすい名前が付きます。
ExportAsFixedFormat はシートをPDFに変換して保存するVBAのメソッドです。
OpenAfterPublish:=False にしておくと、保存後にPDFが自動で開かれないため、件数が多い場合でも画面が乱れずに処理が進みます。
実務で使えるVBAのカスタマイズ3選
基本のコードが動くようになったら、自分の業務に合わせてカスタマイズしてみましょう。
私が実際にマクロ開発依頼を受けた際に追加した処理を3つ紹介します。
カスタマイズ①:処理済みフラグを自動でつける
顧客情報一覧表のG列に「処理済み」と自動入力する処理を加えると、どの行まで書類を作成したかが一目でわかるようになります。
データ転記の直後に以下の1行を追加するだけで実装できます。
' G列に処理済みフラグをセット
ws顧客.Cells(i, 7).Value = "処理済み"
この1行を追加するだけで、2回目の実行時に「すでに作成済みの行をスキップする」という条件分岐も組み合わせやすくなります。
カスタマイズ②:既存シートを削除してから実行する
同じマクロを繰り返し実行すると、前回作成したシートが残ったままになってしまいます。
以下のコードをループ処理の前に追加しておくと、前回の実行で作成したシートを事前に削除してからクリーンな状態で書類を作り直すことが可能。
' テンプレート以外の既存シートを削除する
Application.DisplayAlerts = False ' 削除確認ダイアログを非表示に
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
Select Case ws.Name
Case "顧客情報", "請求書テンプレート", "見積書テンプレート"
' 対象外のシートは削除しない
Case Else
ws.Delete
End Select
Next ws
Application.DisplayAlerts = True ' ダイアログ表示を元に戻す
Application.DisplayAlerts = False でエクセルのアラートを一時的にオフにしています。
これを入れておかないと、シートを削除するたびに「本当に削除しますか?」という確認ダイアログが表示されてしまいます。
処理が終わったら必ず Application.DisplayAlerts = True でアラートを元に戻してください。
カスタマイズ③:ボタンにマクロを登録して1クリックで実行できるようにする
シートに「書類作成」ボタンを配置してマクロを登録しておくと、VBEを開かなくてもボタンを押すだけで処理を実行できます。
手順は以下の通りです。
- エクセルの「開発」タブ → 「挿入」→「ボタン(フォームコントロール)」を選択
- シート上にボタンをドラッグして配置する
- 「マクロの登録」ダイアログで「書類一括作成」を選択してOKをクリック
- ボタンのテキストを「書類一括作成」に変更する
これでボタンを押すだけで処理が走るようになります。
毎月の業務で使うなら、このひと手間が毎回の作業を格段に楽にしてくれます。
VBAで請求書・見積書を作るときの注意点
実装の際に注意しておくべきポイントをまとめました。
実際に私がマクロ開発を受注したときに注意した点なので参考にしてみてください。
注意点①:シート名に使えない文字がある
エクセルのシート名には、「\」「/」「?」「*」「[」「]」「:」などの記号を使用できません。
今回のコードでは ws新シート.Name = 書類種別 & “_" & 取引先名 としてシート名を設定していますが、取引先名にこれらの記号が含まれているとエラーが発生します。
顧客情報を入力する際はこれらの記号を使わないよう、運用ルールを決めておくと安心です。
または、コード側で特定の文字を置換する処理を追加することで対応することもできます。
注意点②:同名のシートが存在するとエラーになる
同じ名前のシートがすでに存在する状態でシートを複製しようとすると、「シート名が重複しています」というエラーが発生します。
前述のカスタマイズ②で紹介した「既存シートを削除してから実行する」コードを組み込んでおくか、シート名に作成日時を加えることで重複を回避してください。
注意点③:金額の型エラーに注意する
顧客情報一覧表の金額列に、数字ではなく文字列が入力されていた場合、計算処理でエラーが発生します。
変数を Dim 金額 As Long と宣言しているため、文字列が入ると型の不一致エラーになる。
IsNumeric() 関数で数値かどうかを判定してからループ処理に入ると、エラーの原因を事前に検出してメッセージで知らせることができます。
VBAスキルを身に付けて収益化する方法
今回紹介したマクロは、私が実際に案件として受注した書類作成マクロをベースにしています。
「顧客情報一覧表から請求書・見積書を自動作成したい」というニーズは、中小企業・個人事業主問わず非常に多く、VBAスキルをビジネスに活かしやすい分野のひとつです。
私はプログラミング未経験の状態から独学でVBAを習得し、現在は年間50件以上のマクロ開発を受注できるようになりました。
その過程で実際に行った学習手順は
「インターネットや初心者向け参考書でコードを確認する→1行ずつ実行して動作を確認する→実際の業務の課題を自動化するマクロを作る→デバックを繰り返す→使えるマクロが完成したらVBAを復習する」
という流れです。
この流れを繰り返し行っていれば、あるとき「頭の中で思いついた処理をなんでもVBAで表現できる!」という感覚が訪れます。
この状態になれば、身に付けたVBAスキルでマクロ開発案件を受注し収益化することができるでしょう。
プログラミング未経験だった私がVBAスキルを収益化するまでに実際に行った手順については、「【体験談あり】VBAスキルで副収入を得る方法|未経験から案件獲得まで」という記事で詳しく紹介しています。
「身に付けたVBAスキルで稼ぎたい!」という方は、ぜひ読んでみてください。
まとめ ~ 請求書・見積書の作成はVBAで自動化が正解 ~
毎月末に何十枚もの請求書・見積書を手作業で作り続けるのは、時間と集中力の大きなムダです。
VBAを使えば、顧客情報一覧表のデータを読み込んでテンプレートに転記し、複数の書類をボタン1クリックで一括作成することができます。
今回紹介したコードの要点をまとめると、
「For Nextループで顧客情報を1行ずつ処理する」「If文で書類種別に応じたテンプレートを選択する」「テンプレートをコピーして顧客情報を転記する」「ExportAsFixedFormatでPDFとして保存する」という4つの処理の組み合わせがこのマクロの核心部分
です。
まずは基本のコードをそのまま動かしてみて、自分の業務のシート構成に合わせて少しずつカスタマイズしていってください。
もし「自分の業務に合わせた複雑なチェック処理を実装したい」「既存のマクロを改良したい」といったご要望がありましたら、マメBlogのエクセルマクロ開発依頼にご相談ください。
業務内容に合わせたオーダーメイドマクロを設定させていただきます。
最後まで読んでいただきありがとうございました。
エクセルVBAを使って面倒なルーティーン作業を自動化しちゃいましょう。






