日常業務で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