この記事では、エクセルマクロを使った請求書の作り方について解説しています。
完成イメージと、どのような流れで作っていくのかを大まかにですが説明していますのでご参考に頂ければと思います。
エクセルマクロについては下記に概要をまとめた記事がありますので、こちらもご参考下さい。
下記の通り、エクセルマクロ全体をまとめた記事もあります!
【まとめ記事】エクセルマクロのすべて!マクロとは?から作り方まで
完成イメージ
請求書といっても色々あると思いますが、今回は下記のようなフォームの請求書をイメージします。
会社名や金額を入力したものは、下記のようになります。
大元のデータは下記のようなリストになっています。
設計
今回は個人的に作るものなので、要件定義など難しいことは考えずどのようなものを作りたいか?をシンプルに考えます。
「請求No.や項目などが書かれたリストから1クリックで請求書を出力する」が今回実現したいことです。
このようなことを実現したいと考えた場合、下記のような手順になると考えられます。
この手順を言語化することがプログラミングにおいては最も大切です。
- ボタンを押す
- フォームがコピーされ、得意先名称のシートが作成される
- 各項目がフォームの指定箇所に転記される
- 請求No.ごとに繰り返される
といった感じです。
あとは、それぞれの日本語をプログラミング言語に置き換えていくだけです。
フォーム作成
コーディングに入る前に、請求書の元フォームを作成しておきます。
今回は下記のようなフォームを作成しました。
請求No.ごとにこのフォームを生成し、項目を転記していくことになります。
コーディング
それではコーディングを始めていきます。
「フォームがコピーされ、得意先名称のシートが作成される」という機能をVBAで記述すると下記のようになります。
Worksheets("form").Copy Before:=Worksheets("form")
ActiveSheet.Name = "みらい株式会社"
変数という入れ物を使って、DBシートから値を取得するようにしたいので下記のような記述に変更します。
tokuisaki = Sheets("DB").Cells(2, 5)
Worksheets("form").Copy Before:=Worksheets("form")
ActiveSheet.Name = tokuisaki
次に、「各項目がフォームの指定箇所に転記される」という部分です。こちらについては下記のように記述しました。
Sheets(tokuisaki).Cells(16, 3).Value = Sheets("DB").Cells(2, 2).Value
Sheets(tokuisaki).Cells(16, 12).Value = Sheets("DB").Cells(2, 3).Value
Sheets(tokuisaki).Cells(16, 13).Value = Sheets("DB").Cells(2, 4).Value
転記作業について、「請求No.ごとに繰り返される」必要があるので変数・ループ処理等を入れて下記のようにコーディングしました。
Sub seikyusyo()
Dim seikyuNo As String
Dim dbStartRow As Long
Dim seikyuStartRow1 As Long
Dim seikyuStartRow2 As Long
Dim tokuisaki As String
Dim i As Long
dbStartRow = 2
seikyuStartRow1 = 4
seikyuStartRow2 = 16
'請求No.が同じ限り繰り返す
For i = dbStartRow To Sheets("DB").Cells(Rows.Count, 1).End(xlUp).Row
If Sheets("DB").Cells(i, 1).Value = seikyuNo Then
Sheets(tokuisaki).Cells(seikyuStartRow2, 3).Value = Sheets("DB").Cells(i, 2).Value
Sheets(tokuisaki).Cells(seikyuStartRow2, 12).Value = Sheets("DB").Cells(i, 3).Value
Sheets(tokuisaki).Cells(seikyuStartRow2, 13).Value = Sheets("DB").Cells(i, 4).Value
seikyuStartRow2 = seikyuStartRow2 + 1
Else
'seikyuStartRow2を初期化する
seikyuStartRow2 = 16
'formをコピーしてシート名を得意先名にする
tokuisaki = Sheets("DB").Cells(i, 5)
Worksheets("form").Copy Before:=Worksheets("form")
ActiveSheet.Name = tokuisaki
'得意先名をB4セルに転記
Sheets(tokuisaki).Cells(seikyuStartRow1, 2).Value = Sheets("DB").Cells(i, 5).Value
'請求No.をO4セルに転記
Sheets(tokuisaki).Cells(seikyuStartRow1, 15).Value = Sheets("DB").Cells(i, 1).Value
'項目転記
Sheets(tokuisaki).Cells(seikyuStartRow2, 3).Value = Sheets("DB").Cells(i, 2).Value
Sheets(tokuisaki).Cells(seikyuStartRow2, 12).Value = Sheets("DB").Cells(i, 3).Value
Sheets(tokuisaki).Cells(seikyuStartRow2, 13).Value = Sheets("DB").Cells(i, 4).Value
seikyuStartRow2 = seikyuStartRow2 + 1
End If
'請求No.を更新する
seikyuNo = Sheets("DB").Cells(i, 1).Value
Next
End Sub
今回、細かい説明はせず結果だけをお伝えしていますのでイメージをつかんで頂ければと思います。
テスト
コーディングができたら動作確認、つまりテストを行います。
実際には「ある程度コーディングしてテスト、修正してテスト」という形で繰り返しますが、完成形のテストをする場合のみとしています。
また、本格的なシステムだとチェックする項目もしっかりと決めてテストすることになりますが、個人的なものなので動作確認レベルとしています。
まずは、作成したマクロを登録したボタンをクリックします。
得意先名でシートが分かれ、請求書が作成されていることが確認できます。