VBA(マクロ)で請求書の一括処理

名簿の一覧から請求書の一括生成するためのVBAサンプルを公開。

名簿一覧が明記されたタブ、請求書一覧(名簿一覧)にあるレコードの数だけ、請求書テンプレートを基にタブが生成されます。

サンプルをダウンロード

VBAの内容

Sub Sample3()
 Dim n As String
 Dim c As String
 Dim d As Date
 Dim i
 For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
  n = Cells(i, 4).Value
  c = Cells(i, 2).Value
  Dim sheetName As String
  sheetName = n + " " + c
  Worksheets("請求書テンプレート").Copy After:=Worksheets("請求書テンプレート")
  ActiveSheet.Name = sheetName
  Sheets(sheetName).Cells(3, 8).Value = Sheets("請求顧客一覧").Cells(i, 1).Value
  Sheets(sheetName).Cells(4, 8).Value = Sheets("請求顧客一覧").Cells(i, 2).Value
  Sheets(sheetName).Cells(6, 2).Value = Sheets("請求顧客一覧").Cells(i, 4).Value
  Sheets(sheetName).Cells(5, 2).Value = Sheets("請求顧客一覧").Cells(i, 3).Value
  Sheets(sheetName).Cells(16, 2).Value = Sheets("請求顧客一覧").Cells(i, 15).Value
  Sheets(sheetName).Cells(16, 5).Value = Sheets("請求顧客一覧").Cells(i, 16).Value
  Sheets(sheetName).Cells(16, 6).Value = Sheets("請求顧客一覧").Cells(i, 17).Value
  Sheets(sheetName).Cells(16, 7).Value = Sheets("請求顧客一覧").Cells(i, 18).Value
  Sheets(sheetName).Cells(17, 2).Value = Sheets("請求顧客一覧").Cells(i, 19).Value
  Sheets(sheetName).Cells(17, 5).Value = Sheets("請求顧客一覧").Cells(i, 20).Value
  Sheets(sheetName).Cells(17, 6).Value = Sheets("請求顧客一覧").Cells(i, 21).Value
  Sheets(sheetName).Cells(17, 7).Value = Sheets("請求顧客一覧").Cells(i, 22).Value
  Sheets(sheetName).Cells(18, 2).Value = Sheets("請求顧客一覧").Cells(i, 23).Value
  Sheets(sheetName).Cells(18, 5).Value = Sheets("請求顧客一覧").Cells(i, 24).Value
  Sheets(sheetName).Cells(18, 6).Value = Sheets("請求顧客一覧").Cells(i, 25).Value
  Sheets(sheetName).Cells(18, 7).Value = Sheets("請求顧客一覧").Cells(i, 26).Value
 Next
End Sub

変数nとcを文字列として変数定義し、変数dを日付として定義

Dim n As String ➡ Stringは文字列
Dim c As String ➡ Stringは文字列
Dim d As Date ➡ Dateは日付

変数iはインデックス、For文によりインデックスを2行目の2として代入しNextまでの間を繰り返し処理、最終行までを繰り返します。

Dim i
 For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
 Next

※繰り返し処理実行内容は以下で説明

名前をnに格納、i行4列の値を取得し、cは請求番号i行2列の値を取得。

そして今回の場合でいうと、複製したシート名を変数に格納するため、sheetNameをシート名の値として定義づけ

n = Cells(i, 4).Value
c = Cells(i, 2).Value
Dim sheetName As String

sheetNameには、n名前と半角スペース、c請求番号をシート名として代入。

請求書テンプレートを複製し、テンプレートの後のタブに追加、そのシート名が代入されたsheetNameとする。

sheetName = n + " " + c
Worksheets("請求書テンプレート").Copy After:=Worksheets("請求書テンプレート")
ActiveSheet.Name = sheetName

複製されたシートに、一覧からの値を入力する。

基本構図はSheets(“移動先シート名”).Cells(移動先の場所).Value = Sheets(“移動元シート名”).Cells(移動元の値の場所).Value、以下の例文を参照

Sheets(sheetName).Cells(3, 8).Value = Sheets("請求顧客一覧").Cells(i, 1).Value 'この場合はサンプルファイルでいうと請求日の値をコピペする形となる
Sheets(sheetName).Cells(4, 8).Value = Sheets("請求顧客一覧").Cells(i, 2).Value 'この場合はサンプルファイルでいうと請求番号の値をコピペする形となる
Sheets(sheetName).Cells(6, 2).Value = Sheets("請求顧客一覧").Cells(i, 4).Value 'この場合はサンプルファイルでいうと名前の値をコピペする形となる

このように一覧からの値を請求書フォーマットに反映させているだけだが、面倒くさいので請求明細は品目を1~3品目までの計算にしてある。

最後の21品目まで反映させるのであれば、

Sheets(sheetName).Cells(18, 7).Value = Sheets(“請求顧客一覧”).Cells(i, 26).Value

以降のコピペ文を追加していくと良いでしょう。

コメントを残す