excel-invoice-how-to-make-macro

エクセル マクロ

【エクセルマクロ】一瞬で請求書を出力する作り方

この記事では、エクセルマクロを使った請求書の作り方について解説しています。

完成イメージと、どのような流れで作っていくのかを大まかにですが説明していますのでご参考に頂ければと思います。

エクセルマクロについては下記に概要をまとめた記事がありますので、こちらもご参考下さい。

【参考記事】エクセルでマクロの作り方は?具体的に解説!

下記の通り、エクセルマクロ全体をまとめた記事もあります!

【まとめ記事】エクセルマクロのすべて!マクロとは?から作り方まで

完成イメージ

請求書といっても色々あると思いますが、今回は下記のようなフォームの請求書をイメージします。

会社名や金額を入力したものは、下記のようになります。

大元のデータは下記のようなリストになっています。

設計

今回は個人的に作るものなので、要件定義など難しいことは考えずどのようなものを作りたいか?をシンプルに考えます。

「請求No.や項目などが書かれたリストから1クリックで請求書を出力する」が今回実現したいことです。

このようなことを実現したいと考えた場合、下記のような手順になると考えられます。

この手順を言語化することがプログラミングにおいては最も大切です。

  1. ボタンを押す
  2. フォームがコピーされ、得意先名称のシートが作成される
  3. 各項目がフォームの指定箇所に転記される
  4. 請求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

今回、細かい説明はせず結果だけをお伝えしていますのでイメージをつかんで頂ければと思います。

テスト

コーディングができたら動作確認、つまりテストを行います。

実際には「ある程度コーディングしてテスト、修正してテスト」という形で繰り返しますが、完成形のテストをする場合のみとしています。
また、本格的なシステムだとチェックする項目もしっかりと決めてテストすることになりますが、個人的なものなので動作確認レベルとしています。

まずは、作成したマクロを登録したボタンをクリックします。

得意先名でシートが分かれ、請求書が作成されていることが確認できます。

まとめ

  • この記事を書いた人

いしはらゆうと

パソコンが使えず全く仕事ができなかったことから猛勉強し、 各部署から頼りにされるレベルになりついにはSEに。
マクロを活用し、2人がかりで1日の仕事を1人×30分に短縮。 自身の経験から、「見るだけ勉強法」をノウハウ化し数十名以上にオンライン講座を開講。
現在は「見るだけエクセル塾」としてITの苦手な方でもスキマ時間に学ぶことのできるオンラインスクールを運営中。
元SE
国家資格:応用情報技術者

-エクセル, マクロ
-,