※本ブログのページには広告主との提携による広告や宣伝、プロモーションが含まれます。当ブログを経由しての商品の購入や、サービス申し込みが発生すると、それらの提携企業からの成果報酬を受けとる場合があります。

エクセルVBA|差し込み印刷マクロをつかって請求書を連続で印刷する

 本ブログでは以前の記事でエクセルVBAでエクセルのシートや、グラフなどを印刷するマクロの作り方を紹介をしました。

そこで紹介したとおり、エクセルVBAで印刷をするマクロでは”PrintOutメソッド“を使うことで、ブックやシート・グラフなどを指定する。または、まとめて印刷することができました。
(以前の記事をご覧になっていない人はこちらからご覧いただくことができます。)

 今回は以前の記事で紹介した印刷するマクロを応用して、売上の履歴があった取引先に対して請求書を発行するマクロを作ってみたいと思います。

職場や作業で毎月起こりうる作業なので、ここで作成したマクロをつかって作業の負担をへらしていきましょう。

PR

PCでスキルアップをしたい・Excelをしっかり学んで社内の評価を高めたい人は必見!
実務をプロから学べる「ユースフル」は講座の動画は永年見放題。安心のQ&A機能で分からないを解決。

差し込み印刷マクロを作るために準備したもの

 エクセルVBAをつかって、差し込み印刷をするマクロをつくる上でいくつかのエクセルシートを準備しました。

 どこの職場や会社にでもあるようなものばかりなので、あなたの環境に置きかえて考えると、本記事で紹介するマクロの便利さが伝わりやすくなると思います。

差し込み印刷マクロを作るために準備したシート

3つのエクセルシートを準備したよ。詳しくは以下の画像をみてね。

差し込み印刷マクロを作るために準備したファイル(ワークブック)

 1つのファイル(ブック)に3つのシートが作成されている状態です。

 画像の右下あたりにそれぞれのシート名が表示されいますが、このサンプルファイルではそれぞれのシートを”顧客リスト“と”販売記録”と”請求書“といった名前にしています。

マクロを書きこむためのワークブックの画像

それぞれのシートは以下のとおりです。

差し込み印刷マクロを作るために準備したワークシート:顧客リスト

顧客リストのエクセルシート(掲載されている情報は架空のものです。)
マクロで使用する顧客リストシートの画像

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

2023年の6月に売上が発生した取引リスト(掲載されている情報は架空のものです。)
マクロで使用する販売記録シートの画像

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

社内で使われている請求書を想定した様式です。
マクロで使用する請求書シートの画像

PR

独学でプログラミングをはじめてみたけど、このままの学習方法に不安を感じているのなら、
オンラインスクールで現役エンジニアのサポートがあるテックアカデミーがおすすめ。
スキマ時間に学べて仕事も保証。必ず副業、始められます。まずは無料でプログラミング体験

差し込み印刷マクロを作るためのながれ

 エクセルVBAで差し込み印刷をするマクロとして以下の処理が必要になります。

  1. 販売記録シートから、取引先商品名/サービス名単価数量金額を取得する
  2. 取引先の数の分だけ請求書をコピーして、取引先名を宛先として入力する
  3. 顧客リストシートから取引先の住所、1で取得したデータから請求明細を入力する
  4. それぞれの取引先に向けた請求書を印刷する
差し込み印刷をするマクロの動作フローをイメージした画像

ざっくりと言えばこんな感じで作れるよ。

 今回作成するマクロは、上記の動作フロー図どおりの順番で動いていますが、すべての動作のはじまりである標準モジュールから紹介していきます。

差し込み印刷マクロを作るためのサンプルコード

標準モジュールには、以下3つのプロシージャ書きこみます。

  
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コードの解説

 このプロシージャでは、すでにシートが作成してあることを見越して、必要最低限の“顧客リスト”“売上記録”“請求書”シート以外のシートを削除する処理を実行します。

 これは実際の会社での作業を想定すると前月の作業でシートが残っている状態があるためです。

 つづいて、販売記録シートモジュールFunctionプロシージャを呼び出します。

Functionプロシージャとは何かと言えば、指定した何らかの処理をまとめて部品化したものであり、結果を返してくれるものと考えれば大丈夫です。

(※Functionプロシージャについては、ほかの記事で詳しく解説していますのでそちらをご覧ください。)

 1つめに呼び出すプロシージャは『辞書を作成し各社請求額を集計する』ですが、このプロシージャで処理した結果として戻り値を配列の myarr2 に受け取ります。

 次に呼び出すプロシージャは『配列で各社の売上記録を整理する』です。
このFunctionプロシージャで処理をした結果の戻り値を配列 myarrに受け取ります。

さらに、Callステートメントをつかって標準モジュールの請求書を作成するプロシージャを呼び出します。
配列変数のmyarr , myarr2引数として呼び出すプロシージャに渡すところがポイントです。

プロシージャの部品化について

 1つのモジュールにすべての処理をまとめられますが、コードが長文になったり問題が発生したときに書きかえたときにほかのコードにあたえるリスクなど、特定の処理ごとに部品としてまとめることは、あとのことを考えた方法だと言えます。

処理ごとに部品化することのメリットは大きいよ。

 サンプルコードの48行目以降に書いてあるプロシージャでいよいよ請求書を作成していきます。
VBAのコードが長いのでポイントを取り出しながら解説していきます。

 まずは、販売記録シートに取引があった会社の数だけシートを作成する必要があるため、For文をつかってくり返し回数を指定していきます。
 具体的には、以下のコードで事前に取得しておいた配列myarr2からくり返す回数を取得していきます。

57行目

取得する方法は、配列の上限インデックスが取得できる『UBound関数』を使います。
例えば myarr2の上限インデックスが5であった場合、変数iが、0から5までの6回処理を繰り返す処理です。

くり返し処理については、以下の記事で詳しく解説していますので参考にしてください。

事前に作った配列のインデックスをつかって繰り返す回数を指定したよ。

つづいて処理の内容を作っていきます。

61行目と62行目

 最初に”請求書”シートをコピーして、末尾に追加しています。

シートの追加を実行すると、追加したシートがアクティブになり、”ActiveSheet“で指定できます。

シート名を取引先の会社名に変更したいので、配列 myarr2 に代入された会社名から取得し、追加した請求書様式のシート名を取引先の会社名に変更していきます。

また、合わせて宛先を入力しているセル(A3)に入力します。

請求書のシート名と、宛先に会社名を入力する処理だよ。

顧客リストシートから、VLookup関数を使って郵便番号と住所を取得したいので、引数をそれぞれの変数に代入し、準備していきます。

VLookup関数をつかって欲しい値を取り出してみるよ。

67行目

 顧客リストシートをシートオブジェクト変数Lsに代入します。

この処理は、請求書に取引先の会社の郵便番号や住所を取得するための事前準備です。

サンプルマクロでは“VLookup関数”をつかって必要な値を取得してみたいと思います。

69行目

 VLookup関数の引数である検索範囲を取得したいので、変数Lsに代入した顧客リストシートからセル範囲(C列3行目のセルから、G列最終行セル)を変数Sr代入します。

 VLookup関数を使うためには引数に”検索値”、”検索範囲“、”列数“、”検索の型“が必要です。

変数Srに検索範囲が代入できたところで、VLookup関数をつかうために必要な引数がそろいました。

 さっそくVLookup関数をつかって郵便番号と住所を取り出していきます。

VLookup関数については、以下の記事で解説をしています。詳しい内容について知りたい人はご覧ください。

73行目

 取引先の会社名を検索値として、変数Srのセル範囲から郵便番号を取り出します。

取り出した値を追加した請求書のA4セルに入力します。

75行目から77行目

 取引先の会社名を検索値として、変数Srのセル範囲から住所1住所2を取り出します。

取り出した値を追加した請求書のA5セルに入力します。

請求書の宛先である取引先の郵便番号と住所はこれでOKだね。

 請求書には、請求日や支払期限を入力することがありますので、こちらもVBAで入力していきます。

このマクロでは、請求日は当月の末日とし、支払期限は翌月の末日で入力をしていきます。

 月末の日付と翌月末の日付を取得するには、DateSerial関数を使います。


DateSerial関数

 サンプルコードで利用しているDateSerial関数についての説明となります。
すでにご存知の人は読み飛ばしてください。

DateSerial関数は引数として指定したから日付を返します。

DateSerial関数の構文

DateSerial(year, month, day)

DateSerial関数の引数
引数の項目 必須/省略可能 説明
year 必須 100 以上 9999 以下の数値、または数式で指定することができます。
month 任意の数式で指定することができます。
day 任意の数式で指定することができます。
DateSerial関数のサンプルコードデバッグプリントの実行結果
  
Option Explicit

Sub DateSerial関数()

    Debug.Print DateSerial(2000, 10, 20) '2000年10月20日

End Sub
2000/10/20

DateSerial関数は数値を日付に変換してくれるんだね。


 サンプルコードでは、先ほど紹介したDateSerial関数の引数として、Year関数Month関数を使います。

これらの関数は日付のシリアル値からそれぞれ年と月の情報を取り出すものですが、関数の名前から機能が連想できそうなほどシンプルな関数なのでここでの説明は割愛します。

さらにそれぞれの関数の引数にDate関数を指定することで、現在の日付からを取得できます。

(※Date関数現在の日付を返します。)

また、年をまたいだときのことを想定して、現在の日付が12月である場合のみ支払期限を翌年にする処理に分岐するようにしておきます。

請求書の請求日と支払期限が入力できたね。

ここまでの処理で、請求書シートの状態は以下の画像のとおりです。

マクロで使用する請求書シートで宛先と請求日と支払期限の入力後の画像
線でかこんだ部分が入力されるようになります。

請求書上部の入力はこれで完了だね。

引き続き、請求書の品目と請求明細の入力処理を見ていきます。

 それぞれの取引先の販売記録を取得して請求書に入力していきます。

この処理では、事前に取得した販売記録のデータである配列 myarr から必要な値を取り出していきます。

いよいよ請求明細を入力していくよ。

 すでに別のプロシージャでも紹介していますが、myarr には販売記録から取り出した以下の配列データが代入されています。

 前項では取引先の会社名を検索値として、VLookup関数で顧客リストシートから必要な値を取得する方法にしましたが、こちらでは配列をつかった方法で取り出しています。

配列 myarr に代入されているデータ
配列myarrに代入したデータの画像

 具体的な方法として、配列 myarr の一番左の列(取引先名)の値が、追加したシートのシートの名前と一致するか判定します。

一致した場合は、請求書の明細として品目サービス名、単価数量金額請求書に入力する処理を実行します。

これによって、シート名(取引会社名)に一致する取引記録が請求書に入力されていきます。

 注意する点として、複数の変数を操作する点です。

サンプルコードの処理で使用している変数は j k の2種類をつかっていますが、それぞれ変数の役割を確認しておきます。

変数の名称 変数の役割
j 配列 myarr 行数が代入されます。
配列 myarr のなかでくり返し(ループ)処理に必要な値であり、配列のインデックスが0から最大値になるまで指定した処理をくり返します。
k 請求書の行数を指定する役割をしています。
請求書の様式にあわせて、ここでは11(行目)から開始します。

90行目

● 変数 j の役割

 変数 j は、配列 myarr のインデックスです。
上記のIf文によるシートの名前と myarr に代入されている会社名が一致するか判定します。

アクティブになっているシートの名前が配列に登録されている会社名と照らし合わせて、異なる場合は次のインデックスに登録された会社名と照らし合わせる役割をしています。

 配列に登録されたすべての会社名との判定が必要なため、If文の判定結果にかかわらず次のインデックスになります。

● 変数 k の役割

 請求書シートに入力する行数が代入された変数です。
品目、単価、数量、金額を入力する最初の行数は11となるため、88行目で初期値として代入しています。

変数 k は、入力処理が実行されたときだけ行数を加算します。
なぜなら、条件に一致しないときまで請求書の行数を加算してしまうと、空白行が発生してしまうためです。

97行目

変数 k はさらに、もう1つの判定式に利用しています。それは入力する行がすべてうまってしまっているかの判定式です。
サンプルの請求書の様式では、明細を入力するために10行分の余白がありますが、取引明細が10件以上となった場合、入力するための行が不足してしまいます。

そのため、変数 k が21以上となったときには、別のシートに明細を入力する旨のメッセージを表示する仕様にしています。

明細の入力が10件まで対応可能ってことだね。

独学だと中々スキルが身についた実感が湧かない。学習環境を見直してみませんか?

エクセルで繰り返しや転記作業で苦しい思いをした経験はありませんか?
今まで苦労してきたその作業を簡単なプログラムをおぼえるだけで解決できる可能性があります。
なるべくお金や時間をかけずにエクセルマクロVBAを習得したい人にはこちらの「1日速習講座」がおすすめです。

 ここまでの処理で、取引記録シートにある取引先ごとの請求書の作成と請求明細の入力が完了しました。

最後に印刷をするマクロを作成していきましょう。

ここまでで請求書が完成したね。つぎは印刷する処理だね。

 これまでの処理で請求書の作成が完了しているため、ひきつづき請求書を印刷するプロシージャを作成していきます。

ここでは、以前にも紹介したPrintOutメソッドを使っていきます。

 上記のコードを使うことでワークシートの印刷を実行しますが、不要なシートまで印刷をしてしまわないように118行目のIf文を利用して、”顧客リスト“、”販売記録“、”請求書“という名前のワークシートは印刷しないように判定しています。

PrintOutメソッドをつかったマクロで印刷を自動化する方法については、以前の記事で紹介しています。
 くわしくは以下のリンクよりご覧ください。

販売記録シートモジュールに書いたVBAコードの解説

 販売記録のシートモジュールに2つのプロシージャを書きこみます。

  
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プロシージャを作ったよ。

05行目と06行目

 mydicという名前で辞書(Dictionary)オブジェクトを宣言しています。

 このプロシージャでは、当月に取引があった会社の数を取得したいので、辞書(Dictionary)オブジェクトを使っています。辞書(Dictionary)オブジェクトは重複しないリストを作成するために便利なオブジェクトです。

また、取引のあった会社の数を取得する理由は、請求書シートをいくつコピーするかが分からないからです。

14行目から21行目

 作成した辞書(Dictionary)オブジェクトのキー取引先の会社名を登録、アイテム金額を登録する処理をしています。

辞書(Dictionary)オブジェクトは、キーが重複するとエラーになります。

また、重複を回避する上で便利なexistsメソッドを持っていますので、配列などよりも簡単に重複のないリスト作成ができます。

 このプロシージャでは、辞書(Dictionary)オブジェクトのメリットを利用して、販売記録シートに登録されたデータを上から順にみていき、取引先の会社名ごとにアイテム(金額)を足していく処理をしています。

27行目から31行目

 辞書(Dictionary)オブジェクトにデータを代入したあとは、配列である myarr2 に辞書(Dictionary)のキーをすべて代入します。販売記録シートに入力されていて、重複のない会社名のリストが作成できました。

なお、このサンプルマクロでは、配列 myarr2 には、11社の取引先が登録されることになります。

 つまり、このサンプルでは作成しなければならない請求書シートは11枚必要であることがわかります。

ここでは請求書が何枚いるかを取得しているよ。

辞書(Dictionary)オブジェクトの特徴や基本的な使い方については以下のリンクよりご覧ください。

 このFunctionプロシージャでは、コピーした請求書シートに明細を書き込む処理をします。

 販売記録シートに入力された値を配列の myarr に代入していきます。
myarr に代入する値は、販売記録シートの取引先名商品名/サービス名単価数量金額に代入し、販売記録シートのような二次元配列にしています。

 詳しくは次のイメージ画像をご覧になってください。

請求書に書き込むためのデータを配列に代入しているよ。

Functionプロシージャの詳しい解説については以下のリンクよりご覧ください。

販売記録シートモジュールに書いたVBAで作成した配列データついて

 販売記録シートモジュールに書いたコードで、二次元配列データをつくるイメージを画像で紹介します。

販売記録シートモジュールは、標準モジュールの[ Sub 請求書を作成する(myarr, myarr2) ]で処理を実行するために必要な材料(配列データ)を作っています。

配列 myarr に代入するデータのイメージ図
辞書 mydic と配列 myarr2 に代入するデータのイメージ図

これらの配列データを使って請求書を作っているんだね。

差し込み印刷を自動化するマクロをつくる方法まとめ

  この記事で解説したマクロは、以下のプロシージャを部品化し、それぞれの処理を実行し連携させています。

 すでに作成されていた請求書を一度削除するマクロを実行しています。
前の月の処理で残っていた請求書シートを削除することで不要なシートの印刷をしないようにします。

 請求書が何枚必要なのかという数量を取得するために、辞書 mydic を利用して販売記録シートの取引先名だけの配列 myarr2 を作成しています。

 請求書の明細情報が欲しいので、販売記録シートの配列 myarr にデータを代入しています。
myarr には、取引先名商品名/サービス名単価数量金額が入ります。

 ❷、❸の販売記録シートモジュールで取得した配列データ myarr myarr2 から必要なデータを取り出して請求書を作成しています。

 作成した請求書をPrintOutメソッドをつかって印刷します。

販売記録にある情報をもとに請求書を作成・印刷できるマクロができたね。

 こちらの記事では、請求書の作成と印刷までを自動化するマクロをエクセルVBAでつくる方法について解説しました。

VBAコードは長文となって難しいように感じるかもしれませんが、小さなかたまりの単位の処理にわけて考えるとそれぞれの処理はとても簡単な内容になっています。

 今回紹介したマクロで処理していることが、毎月人の手で作業していることだと考えると作業の負担を軽くすることや、作業時間を短縮できそうと感じていただけるのでしたら、マクロを作ることに挑戦してみてはいかがでしょうか。

Excel VBAで簡単なマクロを作れる人が、さらに知識を深めるためにおすすめしたい一冊はこちら。

コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。

コメント

タイトルとURLをコピーしました