日常業務でEXCELを利用して請求書などを作成する事があると思いますが、請求書の発行がシステム化されていれば、そのシステムで請求書を発行する事ができますが、システム化されていない場合は、EXCELで作成して発行するのが一番簡単だと思います。ですが、請求書の発行件数が、10件程度なら簡単に作成できますが、100件以上だと手動作成するには、大変たど思います。今回、説明するVBAプログラムは、一覧データから選択した請求書を発行(作成)するサンプルプログラムです。今回説明するサンプルプログラムは、3種類あります。サンプル①は、プリンターに直接出力する場合。サンプル②は、PDFファイルに出力する場合。サンプル③は、別のワークシートに出力する場合の3種類です。それでは、順番に説明いたします。
【事前準備】① シート「請求書」に下記の様な請求書の雛形を作成します。データを転記する場所は、「事前準備②」の通りに、名前ボックスに名前を登録します。
※帳票類を作成する際は、直接セル位置(A1など)を設定するより、名前ボックスでセル位置を設定する事で、セルの行・列を挿入削除しても、名前ボックスのセルを削除しない限り、プログラムには影響は、ありません。
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
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
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