EXCEL VBA 請求書の作成・一覧表からの請求書発行・作成「印刷・PDF・ワークシート別・差し込み印刷」(テクニック)
EXCEL VBA 請求書の作成・一覧表からの請求書発行・作成「印刷・PDF・ワークシート別・差し込み印刷」(テクニック)
●はじめに
日常業務でEXCELを利用して請求書などを作成する事があると思いますが、請求書の発行がシステム化されていれば、そのシステムで請求書を発行する事ができますが、システム化されていない場合は、EXCELで作成して発行するのが一番簡単だと思います。ですが、請求書の発行件数が、10件程度なら簡単に作成できますが、100件以上だと手動作成するには、大変たど思います。今回、説明するVBAプログラムは、一覧データから選択した請求書を発行(作成)するサンプルプログラムです。今回説明するサンプルプログラムは、3種類あります。サンプル①は、プリンターに直接出力する場合。サンプル②は、PDFファイルに出力する場合。サンプル③は、別のワークシートに出力する場合の3種類です。それでは、順番に説明いたします。
【事前準備】① シート「請求書」に下記の様な請求書の雛形を作成します。データを転記する場所は、「事前準備②」の通りに、名前ボックスに名前を登録します。
【事前準備】② シート「請求書」に、下記の通りに名前ボックスに設定します。設定は、下記と同じ名前で登録して下さい。
※上記の事前準備を行う事で、下記のプログラムが実行する事ができます。名前ボックスを設定していれば、セル位置が違っていてもプログラムは、正常動作します。
※帳票類を作成する際は、直接セル位置(A1など)を設定するより、名前ボックスでセル位置を設定する事で、セルの行・列を挿入削除しても、名前ボックスのセルを削除しない限り、プログラムには影響は、ありません。
EXCEL VBA データ一覧から請求書を発行します。(プリンター出力)
●プログラム説明 (サンプル①)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
Sub 請求書発行_プリンター出力() '印刷「紙に出力」 Dim ws01, ws02 As Worksheet Dim L, I, Con, lRow, mRow, xAge As Long Dim RC As Integer Set ws01 = Worksheets("請求一覧") Set ws02 = Worksheets("請求書") lRow = ws01.Cells(Rows.Count, "B").End(xlUp).Row '社員コードの最終行を取得 For I = 2 To lRow '請求書を印刷する枚数をカウントします。 If ws01.Cells(I, "O") <> "済" Then Con = Con + 1 '請求書発行「済み」以外をカウントします。 End If Next I RC = MsgBox("請求書を発行します。 " & Con & "枚分印刷しますか?", vbYesNo + vbQuestion, "確認") If RC = vbNo Then MsgBox "処理を中断します" Exit Sub 'プログラムを終了します。 End If For I = 2 To lRow 'シート「請求一覧」の最終行まで印刷を行います。 If ws01.Cells(I, "O") <> "済" Then '印刷済み以外の請求書を印刷します。 '------------------------------------------------------ 'ワークシート(請求一覧)⇒ ワークシート(請求書)へデータ転記する。 ws02.Range("請求NO") = ws01.Cells(I, "A") ws02.Range("請求先") = ws01.Cells(I, "B") ws02.Range("件名") = ws01.Cells(I, "C") ws02.Range("請求担当") = ws01.Cells(I, "D") ws02.Range("項目①") = ws01.Cells(I, "E") ws02.Range("数量①") = ws01.Cells(I, "F") ws02.Range("単価①") = ws01.Cells(I, "G") ws02.Range("項目②") = ws01.Cells(I, "H") ws02.Range("数量②") = ws01.Cells(I, "I") ws02.Range("単価②") = ws01.Cells(I, "J") ws02.Range("項目③") = ws01.Cells(I, "K") ws02.Range("数量③") = ws01.Cells(I, "L") ws02.Range("単価③") = ws01.Cells(I, "M") ws02.Range("備考") = ws01.Cells(I, "N") '--------------------------------------------------------- ws02.PrintOut From:=1, To:=1 '請求書を印刷(1ページ) ws01.Cells(I, "O") = "済" '印刷後、「印刷済み」=「済」にする End If Next I End Sub |
●実行結果 ※プログラム実行後、シート「請求一覧」のデータからシート「請求書」へデータが転記されてプリンターに印刷されました。(プリンター印刷は、イメージで表してします。)
EXCEL VBA データ一覧から請求書を発行します。(PDFファイル出力)
●プログラム説明 (サンプル②)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
Sub 請求書発行_PDFファイル出力() 'PDFファイルに出力 Dim ws01, ws02 As Worksheet Dim L, I, Con, lRow, mRow, xAge As Long Dim RC As Integer Dim myFile As String Set ws01 = Worksheets("請求一覧") Set ws02 = Worksheets("請求書") lRow = ws01.Cells(Rows.Count, "B").End(xlUp).Row '社員コードの最終行を取得 For I = 2 To lRow '請求書を印刷する枚数をカウントします。 If ws01.Cells(I, "O") <> "済" Then Con = Con + 1 '請求書発行「済み」以外をカウントします。 End If Next I RC = MsgBox("請求書を発行します。 " & Con & "枚分印刷しますか?", vbYesNo + vbQuestion, "確認") If RC = vbNo Then MsgBox "処理を中断します" Exit Sub 'プログラムを終了します。 End If myFile = ThisWorkbook.Path & "\請求書_" 'PDFの保存先とフォイル名を指定します。 For I = 2 To lRow 'シート「請求一覧」の最終行まで印刷を行います。 If ws01.Cells(I, "O") <> "済" Then '印刷済み以外の請求書を印刷します。 '------------------------------------------------------ 'ワークシート(請求一覧)⇒ ワークシート(請求書)へデータ転記する。 ws02.Range("請求NO") = ws01.Cells(I, "A") ws02.Range("請求先") = ws01.Cells(I, "B") ws02.Range("件名") = ws01.Cells(I, "C") ws02.Range("請求担当") = ws01.Cells(I, "D") ws02.Range("項目①") = ws01.Cells(I, "E") ws02.Range("数量①") = ws01.Cells(I, "F") ws02.Range("単価①") = ws01.Cells(I, "G") ws02.Range("項目②") = ws01.Cells(I, "H") ws02.Range("数量②") = ws01.Cells(I, "I") ws02.Range("単価②") = ws01.Cells(I, "J") ws02.Range("項目③") = ws01.Cells(I, "K") ws02.Range("数量③") = ws01.Cells(I, "L") ws02.Range("単価③") = ws01.Cells(I, "M") ws02.Range("備考") = ws01.Cells(I, "N") '------------------------------------------------------ ws02.ExportAsFixedFormat Type:=xlTypePDF, Filename:=myFile & ws02.Range("請求先") & ".pdf" '請求書をPDFへ出力 ws01.Cells(I, "O") = "済" '印刷後、「印刷済み」=「済」にする End If Next I End Sub |
●実行結果 ※プログラム実行後、シート「請求一覧」のデータからシート「請求書」へデータが転記されてPDFファイルが作成されました。
(PDFファイルは、イメージで表してします。)
(PDFファイルは、イメージで表してします。)
EXCEL VBA データ一覧から請求書を発行します。(別のワークシートに作成)
●プログラム説明 (サンプル③)
下記のサンプルプログラムは、データ一覧から請求書を発行するサンプルプログラムです。請求書の発行は、別のワークシートに作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
Sub 請求書発行_ワークシート() 'ワークシートに作成 Dim ws01, ws02, wsAll As Worksheet Dim L, I, Con, lRow, mRow, xAge As Long Dim RC As Integer Set ws01 = Worksheets("請求一覧") Set ws02 = Worksheets("請求書") lRow = ws01.Cells(Rows.Count, "B").End(xlUp).Row '社員コードの最終行を取得 For I = 2 To lRow '請求書を印刷する枚数をカウントします。 If ws01.Cells(I, "O") <> "済" Then Con = Con + 1 '請求書発行「済み」以外をカウントします。 End If Next I RC = MsgBox("請求書を発行します。 " & Con & "枚分印刷しますか?", vbYesNo + vbQuestion, "確認") If RC = vbNo Then MsgBox "処理を中断します" Exit Sub 'プログラムを終了します。 End If Application.DisplayAlerts = False ' ※シート削除する際に発生する警告メッセージを非表示 For Each wsAll In ThisWorkbook.Worksheets 'ワークシート全てをループします。 If wsAll.Name Like "請求書発行_*" Then '以前作成した請求書発行したシートを削除 wsAll.Delete '上記に該当するワークシートを削除します。 End If Next wsAll Application.DisplayAlerts = True ' 警告メッセージを表示 For I = 2 To lRow 'lrow 'シート「請求一覧」の最終行まで印刷を行います。 If ws01.Cells(I, "O") <> "済" Then '印刷済み以外の請求書を印刷します。 '------------------------------------------------------ 'ワークシート(請求一覧)⇒ ワークシート(請求書)へデータ転記する。 ws02.Range("請求NO") = ws01.Cells(I, "A") ws02.Range("請求先") = ws01.Cells(I, "B") ws02.Range("件名") = ws01.Cells(I, "C") ws02.Range("請求担当") = ws01.Cells(I, "D") ws02.Range("項目①") = ws01.Cells(I, "E") ws02.Range("数量①") = ws01.Cells(I, "F") ws02.Range("単価①") = ws01.Cells(I, "G") ws02.Range("項目②") = ws01.Cells(I, "H") ws02.Range("数量②") = ws01.Cells(I, "I") ws02.Range("単価②") = ws01.Cells(I, "J") ws02.Range("項目③") = ws01.Cells(I, "K") ws02.Range("数量③") = ws01.Cells(I, "L") ws02.Range("単価③") = ws01.Cells(I, "M") ws02.Range("備考") = ws01.Cells(I, "N") '------------------------------------------------------ ws02.Copy After:=Worksheets(Worksheets.Count) 'シート「請求書」をコピーしてシートの末尾に作成します。 ActiveSheet.Name = "請求書発行_" & ws02.Range("請求先") 'コピーしたシート名に名前「請求書発行_」+会社名 ws01.Cells(I, "O") = "済" '印刷後、「印刷済み」=「済」にする End If Next I End Sub |
●実行結果 ※プログラム実行後、シート「請求一覧」のデータ一覧からシート「請求書」へデータが転記されてシート毎に請求書が作成されました。
(別のシート毎に、請求書が作成されています)
(別のシート毎に、請求書が作成されています)
最後まで、ご覧いただきまして誠に有難うございました。
また、VBAに関するテクニックや便利な手法などをこのサイトに掲載していきますので、定期的に参照していただけると幸いです。
また、VBAに関するテクニックや便利な手法などをこのサイトに掲載していきますので、定期的に参照していただけると幸いです。