本ブログでは以前の記事でエクセルVBAでエクセルのシートや、グラフなどを印刷するマクロの作り方を紹介をしました。
そこで紹介したとおり、エクセルVBAで印刷をするマクロでは”PrintOutメソッド“を使うことで、ブックやシート・グラフなどを指定する。または、まとめて印刷することができました。
(以前の記事をご覧になっていない人はこちらからご覧いただくことができます。)
今回は以前の記事で紹介した印刷するマクロを応用して、売上の履歴があった取引先に対して請求書を発行するマクロを作ってみたいと思います。
職場や作業で毎月起こりうる作業なので、ここで作成したマクロをつかって作業の負担をへらしていきましょう。
差し込み印刷マクロを作るために準備したもの
エクセルVBAをつかって、差し込み印刷をするマクロをつくる上でいくつかのエクセルシートを準備しました。
どこの職場や会社にでもあるようなものばかりなので、あなたの環境に置きかえて考えると、本記事で紹介するマクロの便利さが伝わりやすくなると思います。

3つのエクセルシートを準備したよ。詳しくは以下の画像をみてね。
差し込み印刷マクロを作るために準備したファイル(ワークブック)
1つのファイル(ブック)に3つのシートが作成されている状態です。
画像の右下あたりにそれぞれのシート名が表示されいますが、このサンプルファイルではそれぞれのシートを”顧客リスト“と”販売記録”と”請求書“といった名前にしています。

それぞれのシートは以下のとおりです。
差し込み印刷マクロを作るために準備したワークシート:顧客リスト

差し込み印刷マクロを作るために準備したワークシート:販売記録

差し込み印刷マクロを作るために準備したワークシート:請求書の様式

オンラインスクールで現役エンジニアのサポートがあるテックアカデミーがおすすめ。
スキマ時間に学べて仕事も保証。必ず副業、始められます。まずは無料でプログラミング体験
差し込み印刷マクロを作るためのながれ
エクセルVBAで差し込み印刷をするマクロとして以下の処理が必要になります。
- 販売記録シートから、取引先と商品名/サービス名、単価・数量・金額を取得する
- 取引先の数の分だけ請求書をコピーして、取引先名を宛先として入力する
- 顧客リストシートから取引先の住所、1で取得したデータから請求明細を入力する
- それぞれの取引先に向けた請求書を印刷する


ざっくりと言えばこんな感じで作れるよ。
今回作成するマクロは、上記の動作フロー図どおりの順番で動いていますが、すべての動作のはじまりである標準モジュールから紹介していきます。
差し込み印刷マクロを作るためのサンプルコード
標準モジュールには、以下3つのプロシージャ書きこみます。
VBAサンプルコード
Option Explicit
Sub 請求書を削除する()
'画面更新を停止
Application.ScreenUpdating = False
'削除確認通知を停止
Application.DisplayAlerts = False
Dim ws As Worksheet'ワークシートを代入するオブジェクト変数の宣言
Dim myarr() As String'請求明細情報を代入する配列の宣言
Dim myarr2() As String'会社名を代入する配列の宣言
Dim msg As String'メッセージ代入用の配列を宣言
'すべてのシートを繰り返し判定して初期状態で存在するシート以外は削除する
For Each ws In Worksheets
If ws.Name <> "顧客リスト" And ws.Name <> "販売記録" And ws.Name <> "請求書" Then
ws.Delete
End If
Next ws
'画面更新を再開
Application.ScreenUpdating = True
'削除確認通知を停止
Application.DisplayAlerts = True
'販売記録シートモジュールのプロシージャを呼び出し戻り値を受け取る
myarr2 = Sheet2.辞書を作成し各社請求額を集計する()'会社名だけの配列
myarr = Sheet2.配列で各社の売上記録を整理する()'請求明細情報の配列
Call 請求書を作成する(myarr, myarr2)'配列を引数としてモジュールを呼び出す
msg = MsgBox("請求書の作成が完了しました。" & vbCrLf & _
"引続き印刷を実行しますか?", vbYesNo, "印刷前確認")
If msg = vbYes Then
Call PrintOutメソッドによる印刷'[はい]なら印刷を実行するプロシージャを呼び出す
Else
MsgBox "印刷処理はキャンセルされました。マクロを終了します。", vbOKOnly
Exit Sub'[いいえ]なら処理を終了
End If
End Sub
'*****************************
Sub 請求書を作成する(myarr, myarr2)
'画面更新を停止
Application.ScreenUpdating = False
Dim i As Long, j As Long, k As Long'カウンタ変数を宣言
Dim ro As Long'顧客リストシートの最終行を代入する変数を宣言
Dim Ls As Worksheet'顧客リストシートを参照するオブジェクト変数を宣言
Dim Sr As Range'顧客リストシートのセル範囲を参照するオブジェクト変数を宣言
For i = 0 To UBound(myarr2)'販売記録にある会社名数分だけ繰り返す
'***請求情報がある取引先分のシートをコピー***
ThisWorkbook.Sheets("請求書").Copy _
After:=ThisWorkbook.Worksheets(Worksheets.Count)
ActiveSheet.Name = myarr2(i) 'シート名を取引先の会社名にする
ThisWorkbook.Worksheets(myarr2(i)).Cells(3, 1) = myarr2(i) '請求書の宛先に取引先の社名を入力
Set Ls = ThisWorkbook.Worksheets("顧客リスト")'顧客リストシートを代入する
ro = Ls.Cells(Rows.Count, 3).End(xlUp).Row
Set Sr = Ls.Range(Ls.Cells(2, 3), Ls.Cells(ro, 7))
'VLookup関数で顧客リストから郵便番号と住所を抽出
ActiveSheet.Cells(4, 1) = "〒" & _
WorksheetFunction.VLookup(myarr2(i), Sr, 2, False) '郵便番号
ActiveSheet.Cells(5, 1) = _
WorksheetFunction.VLookup(myarr2(i), Sr, 3, False) & _
WorksheetFunction.VLookup(myarr2(i), Sr, 4, False) '住所
If Month(Date) <> 12 Then '12月以外は翌月末日を期限にする
ActiveSheet.Cells(7, 8) = DateSerial(Year(Date), Month(Date) + 1, 0) '請求日は当月末を記入する
ActiveSheet.Cells(8, 8) = DateSerial(Year(Date), Month(Date) + 2, 0) '支払い期限は翌月末を記入する
Else '12月の場合は年にも1を足すための分岐
ActiveSheet.Cells(7, 8) = DateSerial(Year(Date), Month(Date) + 1, 0) '請求日は当月末を記入する
ActiveSheet.Cells(8, 8) = DateSerial(Year(Date) + 1, Month(Date) + 2, 0) '支払い期限は翌月末を記入する
End If
'***品目と請求内訳を入力するマクロ***
k = 11
For j = 0 To UBound(myarr)
If ActiveSheet.Name = myarr(j, 0) Then
ActiveSheet.Cells(k, 1) = myarr(j, 1) '品目を入力
ActiveSheet.Cells(k, 6) = myarr(j, 2) '単価を入力
ActiveSheet.Cells(k, 7) = myarr(j, 3) '数量を入力
ActiveSheet.Cells(k, 8) = myarr(j, 4) '金額を入力
k = k + 1
If k >= 21 Then '取引件数の判定
MsgBox "当月の取引件数が10件以上になる場合は個別に印刷してください。" & vbCrLf & _
"つぎの取引先に処理が移ります。", vbOKOnly
Exit For 'つぎのシートに処理を移行する。
End If
End If
Next j
Next i
'画面更新を再開
Application.ScreenUpdating = True
End Sub
'*****************************
Sub PrintOutメソッドによる印刷()
Dim ws As Worksheet
For Each ws In Worksheets
If ws.Name <> "顧客リスト" And ws.Name <> "販売記録" And ws.Name <> "請求書" Then
'「Microsoft Print to PDF」をプリンターとして指定する
ws.PrintOut preview:=True, ActivePrinter:="Microsoft Print to PDF"
End If
Next ws
End Sub

ここでは3つのSubプロシージャを作ったよ。
まずは標準モジュールで実行したい処理を書きこみました。
ただし、標準モジュールのプロシージャが正常に処理を実行するために必要な材料(配列データ)を作らなければならないので、それらは販売記録シートモジュールに書いています。
販売記録シートモジュールのコードは、標準モジュールのコード解説のあとで解説します。
標準モジュールに書いたVBAコードの解説
Sub 請求書を削除するプロシージャについて
このプロシージャでは、すでにシートが作成してあることを見越して、必要最低限の“顧客リスト”、“売上記録”、“請求書”シート以外のシートを削除する処理を実行します。
これは実際の会社での作業を想定すると前月の作業でシートが残っている状態があるためです。
つづいて、販売記録シートモジュールのFunctionプロシージャを呼び出します。
Functionプロシージャとは何かと言えば、指定した何らかの処理をまとめて部品化したものであり、結果を返してくれるものと考えれば大丈夫です。
(※Functionプロシージャについては、ほかの記事で詳しく解説していますのでそちらをご覧ください。)
1つめに呼び出すプロシージャは『辞書を作成し各社請求額を集計する』ですが、このプロシージャで処理した結果として戻り値を配列の myarr2 に受け取ります。
次に呼び出すプロシージャは『配列で各社の売上記録を整理する』です。
このFunctionプロシージャで処理をした結果の戻り値を配列 myarrに受け取ります。
さらに、Callステートメントをつかって標準モジュールの『請求書を作成するプロシージャ』を呼び出します。
配列変数のmyarr , myarr2を引数として呼び出すプロシージャに渡すところがポイントです。
プロシージャの部品化について
1つのモジュールにすべての処理をまとめられますが、コードが長文になったり問題が発生したときに書きかえたときにほかのコードにあたえるリスクなど、特定の処理ごとに部品としてまとめることは、あとのことを考えた方法だと言えます。

処理ごとに部品化することのメリットは大きいよ。
Sub 請求書を作成するプロシージャ
サンプルコードの48行目以降に書いてあるプロシージャでいよいよ請求書を作成していきます。
VBAのコードが長いのでポイントを取り出しながら解説していきます。
✍ 販売記録シートに入力された会社の数に応じて処理を繰り返すように回数を指定する
まずは、販売記録シートに取引があった会社の数だけシートを作成する必要があるため、For文をつかってくり返し回数を指定していきます。
具体的には、以下のコードで事前に取得しておいた配列myarr2からくり返す回数を取得していきます。
57行目
For i = 0 To UBound(myarr2)
取得する方法は、配列の上限インデックスが取得できる『UBound関数』を使います。
例えば myarr2の上限インデックスが5であった場合、変数iが、0から5までの6回処理を繰り返す処理です。
くり返し処理については、以下の記事で詳しく解説していますので参考にしてください。

事前に作った配列のインデックスをつかって繰り返す回数を指定したよ。
つづいて処理の内容を作っていきます。
✍ 請求書様式のシートを末尾に追加して、シート名と請求書の宛先に取引先の会社名を入力する
61行目と62行目
ThisWorkbook.Sheets(“請求書”).Copy _
After:=ThisWorkbook.Worksheets(Worksheets.Count)
最初に”請求書”シートをコピーして、末尾に追加しています。
シートの追加を実行すると、追加したシートがアクティブになり、”ActiveSheet“で指定できます。
シート名を取引先の会社名に変更したいので、配列 myarr2 に代入された会社名から取得し、追加した請求書様式のシート名を取引先の会社名に変更していきます。
また、合わせて宛先を入力しているセル(A3)に入力します。

請求書のシート名と、宛先に会社名を入力する処理だよ。
✍ 請求書の宛先に入力された会社名の郵便番号と住所をVLookup関数で取得する
顧客リストシートから、VLookup関数を使って郵便番号と住所を取得したいので、引数をそれぞれの変数に代入し、準備していきます。

VLookup関数をつかって欲しい値を取り出してみるよ。
67行目
Set Ls = ThisWorkbook.Worksheets(“顧客リスト”)
顧客リストシートをシートオブジェクト変数Lsに代入します。
この処理は、請求書に取引先の会社の郵便番号や住所を取得するための事前準備です。
サンプルマクロでは“VLookup関数”をつかって必要な値を取得してみたいと思います。
69行目
Set Sr = Ls.Range(Ls.Cells(2, 3), Ls.Cells(ro, 7))
VLookup関数の引数である検索範囲を取得したいので、変数Lsに代入した顧客リストシートからセル範囲(C列3行目のセルから、G列最終行セル)を変数Sr代入します。
VLookup関数を使うためには引数に”検索値”、”検索範囲“、”列数“、”検索の型“が必要です。
変数Srに検索範囲が代入できたところで、VLookup関数をつかうために必要な引数がそろいました。
さっそくVLookup関数をつかって郵便番号と住所を取り出していきます。
VLookup関数については、以下の記事で解説をしています。詳しい内容について知りたい人はご覧ください。
73行目
WorksheetFunction.VLookup(myarr2(i), Sr, 2, False)
取引先の会社名を検索値として、変数Srのセル範囲から郵便番号を取り出します。
取り出した値を追加した請求書のA4セルに入力します。
75行目から77行目
WorksheetFunction.VLookup(myarr2(i), Sr, 3, False) & _
WorksheetFunction.VLookup(myarr2(i), Sr, 4, False) ‘住所
取引先の会社名を検索値として、変数Srのセル範囲から住所1と住所2を取り出します。
取り出した値を追加した請求書のA5セルに入力します。

請求書の宛先である取引先の郵便番号と住所はこれでOKだね。
✍ 請求書の請求日と支払期限を入力する
請求書には、請求日や支払期限を入力することがありますので、こちらもVBAで入力していきます。
このマクロでは、請求日は当月の末日とし、支払期限は翌月の末日で入力をしていきます。
月末の日付と翌月末の日付を取得するには、DateSerial関数を使います。
DateSerial関数
サンプルコードで利用しているDateSerial関数についての説明となります。
すでにご存知の人は読み飛ばしてください。
DateSerial関数は引数として指定した年、月、日から日付を返します。
DateSerial(year, month, day)
引数の項目 | 必須/省略可能 | 説明 |
---|---|---|
year | 必須 | 100 以上 9999 以下の数値、または数式で指定することができます。 |
month | 任意の数式で指定することができます。 | |
day | 任意の数式で指定することができます。 |
DateSerial関数のVBAサンプルコード
Option Explicit
Sub DateSerial関数()
Debug.Print DateSerial(2000, 10, 20) '2000年10月20日
End Sub
DateSerial関数をつかったマクロの実行結果

DateSerial関数は数値を日付に変換してくれるんだね。
サンプルコードでは、先ほど紹介したDateSerial関数の引数として、Year関数とMonth関数を使います。
これらの関数は日付のシリアル値からそれぞれ年と月の情報を取り出すものですが、関数の名前から機能が連想できそうなほどシンプルな関数なのでここでの説明は割愛します。
さらにそれぞれの関数の引数にDate関数を指定することで、現在の日付から年と月を取得できます。
(※Date関数は現在の日付を返します。)
また、年をまたいだときのことを想定して、現在の日付が12月である場合のみ支払期限を翌年にする処理に分岐するようにしておきます。

請求書の請求日と支払期限が入力できたね。
ここまでの処理で、請求書シートの状態は以下の画像のとおりです。


請求書上部の入力はこれで完了だね。
引き続き、請求書の品目と請求明細の入力処理を見ていきます。
✍ 請求書の品目と請求内訳を入力する
それぞれの取引先の販売記録を取得して請求書に入力していきます。
この処理では、事前に取得した販売記録のデータである配列 myarr から必要な値を取り出していきます。

いよいよ請求明細を入力していくよ。
すでに別のプロシージャでも紹介していますが、myarr には販売記録から取り出した以下の配列データが代入されています。
前項では取引先の会社名を検索値として、VLookup関数で顧客リストシートから必要な値を取得する方法にしましたが、こちらでは配列をつかった方法で取り出しています。

具体的な方法として、配列 myarr の一番左の列(取引先名)の値が、追加したシートのシートの名前と一致するか判定します。
一致した場合は、請求書の明細として品目やサービス名、単価、数量、金額を請求書に入力する処理を実行します。
これによって、シート名(取引会社名)に一致する取引記録が請求書に入力されていきます。
注意する点として、複数の変数を操作する点です。
サンプルコードの処理で使用している変数は j 、 k の2種類をつかっていますが、それぞれ変数の役割を確認しておきます。
変数の名称 | 変数の役割 |
---|---|
j | 配列 myarr の行数が代入されます。 配列 myarr のなかでくり返し(ループ)処理に必要な値であり、配列のインデックスが0から最大値になるまで指定した処理をくり返します。 |
k | 請求書の行数を指定する役割をしています。 請求書の様式にあわせて、ここでは11(行目)から開始します。 |
90行目
If ActiveSheet.Name = myarr(j, 0) Then
● 変数 j の役割
変数 j は、配列 myarr のインデックスです。
上記のIf文によるシートの名前と myarr に代入されている会社名が一致するか判定します。
アクティブになっているシートの名前が配列に登録されている会社名と照らし合わせて、異なる場合は次のインデックスに登録された会社名と照らし合わせる役割をしています。
配列に登録されたすべての会社名との判定が必要なため、If文の判定結果にかかわらず次のインデックスになります。
● 変数 k の役割
請求書シートに入力する行数が代入された変数です。
品目、単価、数量、金額を入力する最初の行数は11となるため、88行目で初期値として代入しています。
変数 k は、入力処理が実行されたときだけ行数を加算します。
なぜなら、条件に一致しないときまで請求書の行数を加算してしまうと、空白行が発生してしまうためです。
97行目
If k >= 21 Then
変数 k はさらに、もう1つの判定式に利用しています。それは入力する行がすべてうまってしまっているかの判定式です。
サンプルの請求書の様式では、明細を入力するために10行分の余白がありますが、取引明細が10件以上となった場合、入力するための行が不足してしまいます。
そのため、変数 k が21以上となったときには、別のシートに明細を入力する旨のメッセージを表示する仕様にしています。

明細の入力が10件まで対応可能ってことだね。
ここまでの処理で、取引記録シートにある取引先ごとの請求書の作成と請求明細の入力が完了しました。
最後に印刷をするマクロを作成していきましょう。

ここまでで請求書が完成したね。つぎは印刷する処理だね。
Sub PrintOutメソッドによる印刷プロシージャ
これまでの処理で請求書の作成が完了しているため、ひきつづき請求書を印刷するプロシージャを作成していきます。
ここでは、以前にも紹介したPrintOutメソッドを使っていきます。
Iws.PrintOut preview:=True, ActivePrinter:=”Microsoft Print to PDF”
上記のコードを使うことでワークシートの印刷を実行しますが、不要なシートまで印刷をしてしまわないように118行目のIf文を利用して、”顧客リスト“、”販売記録“、”請求書“という名前のワークシートは印刷しないように判定しています。
PrintOutメソッドをつかったマクロで印刷を自動化する方法については、以前の記事で紹介しています。
くわしくは以下のリンクよりご覧ください。
![]() |
![]() |
販売記録シートモジュールに書いたVBAコードの解説
販売記録のシートモジュールに2つのプロシージャを書きこみます。
VBAサンプルコード
Option Explicit
Public Function 辞書を作成し各社請求額を集計する()
Dim mydic As Dictionary '辞書を宣言
Set mydic = New Dictionary
Dim myarr2() As String '動的配列を宣言
Dim i As Long, Price As Long 'カウンタ変数と各取引先ごとの売上を代入する変数を宣言
Dim CN As String '取引先の会社名を代入する変数を宣言
With Me
'重複しないリストを作成し、取引先ごとの売上を集計する
For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
CN = .Cells(i, 2).Text: Price = .Cells(i, 6).Text
If Not mydic.exists(CN) Then'取引先名が辞書オブジェクトに既に登録されていないかを判定
mydic.Add .Cells(i, 2).Text, .Cells(i, 6).Value
Else
mydic(CN) = mydic(CN) + Price
End If
Next i
'辞書オブジェクトに含まれているデータの組み数分の配列を再定義
ReDim myarr2(mydic.Count - 1)
'辞書オブジェクトに含まれている会社名を配列に代入する
For i = 0 To mydic.Count - 1
myarr2(i) = mydic.Keys(i)
'各取引先の売上合計をイミディエイトウィンドウに出力する(マクロ作成者確認用)
Debug.Print mydic.Keys(i), mydic.items(i)
Next i
End With
'配列を戻り値として指定する
辞書を作成し各社請求額を集計する = myarr2
'辞書オブジェクトを削除する
Set mydic = Nothing
End Function
'*****************************
Public Function 配列で各社の売上記録を整理する()
Dim myarr() As String '配列を宣言
Dim i As Long 'カウンタ変数を宣言
Dim Tno As Long '配列の要素数を定義するための変数を宣言
With Me
'配列の大きさを行数から調べる(サンプルでは18行)
Tno = .Cells(Rows.Count, 3).End(xlUp).Row - 2
'二次元配列を再定義する(サンプルでは18行の5列)
ReDim myarr(Tno, 4) As String
'二次元配列に販売記録シートの値を代入する
For i = 2 To .Cells(Rows.Count, 3).End(xlUp).Row
myarr(i - 2, 0) = .Cells(i, 2).Text '取引先を代入
myarr(i - 2, 1) = .Cells(i, 3).Text '商品名/サービス名を代入
myarr(i - 2, 2) = .Cells(i, 4).Value '単価を代入
myarr(i - 2, 3) = .Cells(i, 5).Value '数量を代入
myarr(i - 2, 4) = .Cells(i, 6).Value '金額を代入
Next i
End With
'配列を戻り値として指定する
配列で各社の売上記録を整理する = myarr
End Function

シートモジュールには2つのFunctionプロシージャを作ったよ。
Public Function 辞書を作成し各社請求額を集計するプロシージャ
05行目と06行目
mydicという名前で辞書(Dictionary)オブジェクトを宣言しています。
このプロシージャでは、当月に取引があった会社の数を取得したいので、辞書(Dictionary)オブジェクトを使っています。辞書(Dictionary)オブジェクトは重複しないリストを作成するために便利なオブジェクトです。
また、取引のあった会社の数を取得する理由は、請求書シートをいくつコピーするかが分からないからです。
14行目から21行目
作成した辞書(Dictionary)オブジェクトのキーに取引先の会社名を登録、アイテムに金額を登録する処理をしています。
辞書(Dictionary)オブジェクトは、キーが重複するとエラーになります。
また、重複を回避する上で便利なexistsメソッドを持っていますので、配列などよりも簡単に重複のないリスト作成ができます。
このプロシージャでは、辞書(Dictionary)オブジェクトのメリットを利用して、販売記録シートに登録されたデータを上から順にみていき、取引先の会社名ごとにアイテム(金額)を足していく処理をしています。
27行目から31行目
辞書(Dictionary)オブジェクトにデータを代入したあとは、配列である myarr2 に辞書(Dictionary)のキーをすべて代入します。販売記録シートに入力されていて、重複のない会社名のリストが作成できました。
なお、このサンプルマクロでは、配列 myarr2 には、11社の取引先が登録されることになります。
つまり、このサンプルでは作成しなければならない請求書シートは11枚必要であることがわかります。

ここでは請求書が何枚いるかを取得しているよ。
辞書(Dictionary)オブジェクトの特徴や基本的な使い方については以下のリンクよりご覧ください。
Public Function 配列で各社の売上記録を整理するプロシージャ
このFunctionプロシージャでは、コピーした請求書シートに明細を書き込む処理をします。
販売記録シートに入力された値を配列の myarr に代入していきます。
myarr に代入する値は、販売記録シートの取引先名、商品名/サービス名、単価、数量、金額に代入し、販売記録シートのような二次元配列にしています。
詳しくは次のイメージ画像をご覧になってください。

請求書に書き込むためのデータを配列に代入しているよ。
Functionプロシージャの詳しい解説については以下のリンクよりご覧ください。
販売記録シートモジュールに書いたVBAで作成した配列データついて
販売記録シートモジュールに書いたコードで、二次元配列データをつくるイメージを画像で紹介します。
販売記録シートモジュールは、標準モジュールの[ Sub 請求書を作成する(myarr, myarr2) ]で処理を実行するために必要な材料(配列データ)を作っています。



これらの配列データを使って請求書を作っているんだね。
差し込み印刷を自動化するマクロをつくる方法まとめ
この記事で解説したマクロは、以下のプロシージャを部品化し、それぞれの処理を実行し連携させています。
❶ 標準モジュール:Sub 請求書を削除する
すでに作成されていた請求書を一度削除するマクロを実行しています。
前の月の処理で残っていた請求書シートを削除することで不要なシートの印刷をしないようにします。
❷ 販売記録シートモジュール:Public Function 辞書を作成し各社請求額を集計する
請求書が何枚必要なのかという数量を取得するために、辞書 mydic を利用して販売記録シートの取引先名だけの配列 myarr2 を作成しています。
❸ 販売記録シートモジュール:Public Function 配列で各社の売上記録を整理する
請求書の明細情報が欲しいので、販売記録シートの配列 myarr にデータを代入しています。
myarr には、取引先名、商品名/サービス名、単価、数量、金額が入ります。
❹ 標準モジュール:Sub 請求書を作成する
❷、❸の販売記録シートモジュールで取得した配列データ myarr 、 myarr2 から必要なデータを取り出して請求書を作成しています。
❺ 標準モジュール:Sub PrintOutメソッドによる印刷
作成した請求書をPrintOutメソッドをつかって印刷します。

販売記録にある情報をもとに請求書を作成・印刷できるマクロができたね。
こちらの記事では、請求書の作成と印刷までを自動化するマクロをエクセルVBAでつくる方法について解説しました。
VBAコードは長文となって難しいように感じるかもしれませんが、小さなかたまりの単位の処理にわけて考えるとそれぞれの処理はとても簡単な内容になっています。
今回紹介したマクロで処理していることが、毎月人の手で作業していることだと考えると作業の負担を軽くすることや、作業時間を短縮できそうと感じていただけるのでしたら、マクロを作ることに挑戦してみてはいかがでしょうか。
コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。
コメント