【VBA】連続印刷マクロの作り方!複数データを一括印刷する方法とは
毎月末になると、請求書や見積書を1件ずつ手動で印刷していませんか?
「印刷する→次のデータを開く→また印刷する」という作業を何十件も繰り返していると、あっという間に1時間以上が消えてしまいます。
実は私も会社員のころ、顧客リストをもとに請求書を印刷する作業を毎月手作業でこなしていました。
独立して個人事業主になった後、マクロ開発の案件を受注するようになって気づいたのですが、「連続印刷の自動化」は、依頼件数の中でも特にニーズが高い処理のひとつです。
VBAを使えば、一覧表に登録されている複数件のデータを順番に差し込んで、ボタン1クリックで連続印刷することが可能に。
この記事では、VBAで連続印刷マクロを作る方法を、プログラミング初心者の方でも理解できるよう、順を追って丁寧に解説していきます。
最後まで読んでいただければ、今日から使える連続印刷マクロを自分で作れるようになるはずです。
連続印刷を手作業で続けると起きる3つの問題
「毎回手作業で印刷しているけど、別に困っていない」と思っていませんか?
しかし手作業による印刷作業は、気づかないうちにいくつかの大きなリスクを生んでいます。
まずは問題を整理することで、VBAによる自動化がなぜ有効なのかを理解しておきましょう。
問題①:件数が増えるほど作業時間が比例して増える
手作業の印刷は、データが10件ならまだ耐えられます。
しかし50件、100件になると、1件あたり数分かかる作業が積み重なって、月末の印刷業務だけで数時間を消費することになります。
私がマクロ開発を受注したお客様の中にも、「月末は印刷だけで半日つぶれる」とおっしゃっていた方がいました。
VBAで連続印刷マクロを導入すれば、件数が100件になっても実行時間はほとんど変わりません。
問題②:印刷ミスが発生してもすぐに気づけない
手作業で複数件を印刷していると、「同じデータを2回印刷してしまった」「1件とばしてしまった」というミスが起きやすくなります。
帳票類のミスは、取引先への影響や社内の信頼低下につながることがあります。
VBAで処理の順番を管理させれば、ヒューマンエラーによる印刷ミスをほぼゼロにすることが可能です。
問題③:データが変わるたびに印刷設定を手直しする必要がある
顧客ごとに「宛名」「住所」「金額」が違う場合、毎回セルの値を書き換えてから印刷するという作業が発生します。
書き換え忘れや入力ミスが起きれば、それが帳票の誤記に直結します。
VBAを使えばデータを自動で差し込んでから印刷する処理を実装できるため、手書き修正のリスクをなくすことが可能です。
VBA連続印刷マクロの作り方|基本の仕組みを理解する
連続印刷マクロの基本的な仕組みは「繰り返し処理(Forループ)」と「印刷命令(PrintOut)」の組み合わせです。
まずは最もシンプルな構成から理解しておきましょう。
基本の連続印刷マクロのコード
下記は、「Sheet1」にある顧客一覧(A列:氏名、B列:金額)を読み込み、「印刷シート」に転記してから連続印刷するサンプルコードです。
Sub 連続印刷マクロ()
Dim ws管理 As Worksheet
Dim ws印刷 As Worksheet
Set ws管理 = ThisWorkbook.Worksheets("顧客一覧")
Set ws印刷 = ThisWorkbook.Worksheets("印刷シート")
'一覧の最終行を取得
Dim lastRow As Long
lastRow = ws管理.Cells(ws管理.Rows.Count, 1).End(xlUp).Row
'2行目から最終行まで繰り返す',
Dim i As Long
For i = 2 To lastRow
'一覧からデータを転記
ws印刷.Range("B3").Value = ws管理.Cells(i, 1).Value '氏名
ws印刷.Range("B4").Value = ws管理.Cells(i, 2).Value '金額
'印刷を実行
ws印刷.PrintOut
Next i
MsgBox "印刷が完了しました。" & lastRow - 1 & "件", vbInformation
End Sub
このコードの流れを解説します。
最初にSet ws管理 とSet ws印刷 でそれぞれのシートを変数に格納しています。
シート名は実際のファイルに合わせて変更してください。
lastRow = ws管理.Cells(ws管理.Rows.Count, 1).End(xlUp).Row は、A列の最終行を自動取得するコードです。
データが増えても範囲指定を手直しする必要がなく、使い回しやすい書き方として覚えておきましょう。
For i = 2 To lastRow のループで、2行目(データ開始行)から最終行まで1行ずつ処理を繰り返します。
ループの中で ws印刷.Range(“B3").Value = … と記述することで、印刷シートのセルに顧客データを順番に転記しています。
転記が終わったら ws印刷.PrintOut で印刷を実行し、次のデータに進みます。
全件の印刷が完了したら MsgBox で「印刷完了」のメッセージを表示する仕組みです。
サンプルコードの中で使われている転記マクロを関連記事「別シートにテキストを自動転記する方法」でダウンロードすることができます。
実際に転記マクロを動かしてどのような動きをするのかチェックしてみてください。
実務で使える連続印刷マクロ|請求書・見積書を一括印刷する方法
基本の仕組みを理解できたら、次はより実務に近い形のサンプルコードを見ていきましょう。
私が実際に受注した案件では、「取引先」「住所」「工事件名」「金額」「工期」が記載された顧客情報一覧表から、請求書・見積書を自動で差し込んで連続印刷するマクロを開発しました。
そのときの経験をもとに、実務で使えるコードを紹介します。
顧客情報一覧から請求書を連続印刷するVBA
下記のサンプルコードは、「顧客一覧」シートのデータを「請求書」シートに転記しながら、ボタン1クリックで全件を連続印刷するコードです。
Sub 請求書連続印刷()
Dim ws一覧 As Worksheet
Dim ws請求書 As Worksheet
Set ws一覧 = ThisWorkbook.Worksheets("顧客一覧")
Set ws請求書 = ThisWorkbook.Worksheets("請求書")
Dim lastRow As Long
lastRow = ws一覧.Cells(ws一覧.Rows.Count, 1).End(xlUp).Row
'印刷件数の確認メッセージ
Dim msg As String
msg = lastRow - 1 & "件のデータを印刷します。よろしいですか?"
If MsgBox(msg, vbYesNo + vbQuestion) = vbNo Then Exit Sub
Dim i As Long
For i = 2 To lastRow
'各項目を請求書シートに転記
ws請求書.Range("C5").Value = ws一覧.Cells(i, 1).Value '取引先名',
ws請求書.Range("C6").Value = ws一覧.Cells(i, 2).Value '住所
ws請求書.Range("C10").Value = ws一覧.Cells(i, 3).Value '工事件名
ws請求書.Range("C11").Value = ws一覧.Cells(i, 4).Value '金額
ws請求書.Range("C12").Value = ws一覧.Cells(i, 5).Value '工期
'印刷を実行(PDFとして出力したい場合はPrintToFile等を使用)
ws請求書.PrintOut
Next i
MsgBox "全 " & lastRow - 1 & " 件の印刷が完了しました。", vbInformation
End Sub
このコードのポイントを解説します。
For ループが始まる前に MsgBox で「印刷件数の確認」を表示しています。
「はい」を選んだときだけ印刷を実行し、「いいえ」を選んだときは Exit Sub でマクロを終了させる仕組みです。
誤ってボタンを押してしまったときの安全装置として、実務では必ず入れておくとよいでしょう。
ループの中では、ws一覧.Cells(i, 1).Value という形でA列・B列・C列…のデータを1行ずつ取得し、請求書シートの対応するセルに転記しています。
セルの位置(C5、C6、C10など)は実際のフォーマットに合わせて変更してください。
転記が完了したら ws請求書.PrintOut で印刷を実行し、次の行のデータに移ります。
全件の印刷が終わったら完了メッセージを表示して処理終了です。
印刷する件数を選択できる連続印刷マクロ(応用版)
実務では「全件ではなく指定した範囲だけ印刷したい」という場面もあります。
下記は、印刷する開始行と終了行をInputBoxで入力して、その範囲だけ印刷する応用コードです。
Sub 範囲指定連続印刷()
Dim ws一覧 As Worksheet
Dim ws請求書 As Worksheet
Set ws一覧 = ThisWorkbook.Worksheets("顧客一覧")
Set ws請求書 = ThisWorkbook.Worksheets("請求書")
'開始行と終了行をユーザーに入力してもらう
Dim startRow As Long
Dim endRow As Long
startRow = CLng(InputBox("印刷する開始行番号を入力してください(例:2)", "開始行"))
endRow = CLng(InputBox("印刷する終了行番号を入力してください(例:10)", "終了行"))
'入力チェック
If startRow < 2 Or endRow < startRow Then
MsgBox "行番号の入力が正しくありません。", vbCritical
Exit Sub
End If
Dim i As Long
For i = startRow To endRow
ws請求書.Range("C5").Value = ws一覧.Cells(i, 1).Value
ws請求書.Range("C6").Value = ws一覧.Cells(i, 2).Value
ws請求書.Range("C10").Value = ws一覧.Cells(i, 3).Value
ws請求書.Range("C11").Value = ws一覧.Cells(i, 4).Value
ws請求書.Range("C12").Value = ws一覧.Cells(i, 5).Value
ws請求書.PrintOut
Next i
MsgBox endRow - startRow + 1 & "件の印刷が完了しました。", vbInformation
End Sub
このコードでは InputBox を使って開始行・終了行の番号をユーザーに入力させています。
CLng() は入力した文字列を数値(Long型)に変換する関数です。
入力チェックで「開始行が2より小さい」「終了行が開始行より小さい」という不正な入力があった場合は、エラーメッセージを表示してマクロを終了させています。
このように入力値の検証処理(バリデーション)を入れておくと、操作ミスによる意図しない印刷を防ぐことができます。
連続印刷マクロをさらに使いやすくする3つのカスタマイズ
基本の連続印刷マクロを実装できたら、実務の使い勝手を上げるためのカスタマイズを加えていきましょう。
ここで紹介する3つは、私が案件で開発するときに必ずと言っていいほど追加している処理です。
カスタマイズ①:印刷プレビューで確認してから印刷する
いきなり印刷するのではなく、印刷プレビューを表示して確認してから実行したい場合は、PrintOut のオプションを変更します。
'プレビューを表示してから印刷(Preview:=True)
ws請求書.PrintOut Preview:=True
PrintOut のあとに Preview:=True を加えるだけで、実行するたびに印刷プレビューが表示されます。
確認してから「印刷」ボタンを押す運用にしたい場合は、このオプションを使いましょう。
連続印刷の場合は「件ずつプレビューを確認したい」という要望もあるため、件数が少ない案件ではこの方法が喜ばれることがあります。
カスタマイズ②:印刷済みフラグを一覧に記録する
「どのデータまで印刷したか」を一覧に記録しておくと、途中で中断したときに続きから再開することができます。
'印刷後にF列に「印刷済」を記録する
ws一覧.Cells(i, 6).Value = "印刷済"
ws一覧.Cells(i, 6).Value = “印刷済" を PrintOut の直後に追加するだけです。
6はF列を指しています(A=1、B=2、C=3…と数えます)。
すでに「印刷済」が入っている行をスキップするコードを追加すれば、重複印刷も防ぐことができます。
カスタマイズ③:印刷枚数・印刷部数を制御する
PrintOut には Copies(部数)と From・To(ページ指定)というオプションを追加することができます。
'2部ずつ、1ページ目だけを印刷する場合
ws請求書.PrintOut Copies:=2, From:=1, To:=1
複数部数を印刷したいときは Copies に部数を指定します。
帳票が複数ページにわたる場合でも、From と To で印刷するページを絞り込むことが可能です。
実務では「控え用に2部印刷」「1ページ目(表紙)だけ印刷」という要望が多く、このオプションを知っておくと非常に便利です。
連続印刷マクロを作る際の注意点
連続印刷マクロは便利な反面、いくつかの落とし穴があります。
私が実際にマクロ開発で遭遇した注意点を3つ紹介します。
注意点①:印刷設定(用紙サイズ・余白)はあらかじめ固定しておく
PrintOut を実行するとき、エクセルは「そのシートの現在の印刷設定」をそのまま使います。
用紙サイズがA4に設定されているか、余白が適切か、印刷範囲が正しく設定されているかを、マクロを実行する前に必ず確認しておきましょう。
印刷設定をVBAで固定したい場合は、With ws印刷.PageSetup を使います。
With ws請求書.PageSetup
.PaperSize = xlPaperA4 '用紙サイズをA4に固定
.Orientation = xlPortrait '縦向き
.FitToPagesWide = 1 '横方向を1ページに収める
.FitToPagesTall = 1 '縦方向を1ページに収める
End With
PageSetup を使うと印刷設定をVBAで固定できるため、「誰が実行しても同じ印刷結果になる」という状態を作ることができます。
注意点②:大量印刷の前にテスト印刷を必ず行う
100件以上のデータを一括印刷するときは、最初から全件実行するのではなく、まず2〜3件でテスト印刷を行いましょう。
転記するセル位置のミスや書式のずれは、テスト印刷の段階で発見できます。
大量印刷後に「全件ずれていた」という事態は、用紙と時間の無駄になるため注意が必要です。
注意点③:DoEventsを使って処理中のフリーズを防ぐ
大量のデータを連続印刷していると、Excelの画面が「応答なし」になることがあります。
これを防ぐには、ループの中に DoEvents を追加しましょう。
For i = 2 To lastRow
'転記処理...
ws請求書.PrintOut
DoEvents 'Excelの処理を一時的に解放して応答なしを防ぐ
Next i
DoEvents はExcelが他の処理を受け付けられるよう一時的に制御を解放するコードです。
件数が多い場合はこの1行を入れるだけで、処理中のフリーズを大幅に軽減することができます。
VBA連続印刷マクロを習得してスキルを収益化する
連続印刷マクロを自分で作れるようになると、他の人には真似できないVBAスキルが身についてきます。
私自身、プログラミング未経験の状態からネットや参考書で独学を始め、最初は「連続印刷のマクロを作ってほしい」という案件をきっかけに収益化が始まりました。
連続印刷マクロは需要が高く、実務に直結している処理です。
業務内容に合わせた連続印刷マクロを開発できるようになれば、フリーランスとしてマクロ開発案件を受注することも夢ではありません。
関連記事「【体験談あり】VBAスキルで副収入を得る方法|未経験から案件獲得まで」では、私がプログラミング未経験からVBAスキルを収益化するまでに行った手順を紹介しています。
まとめ ~ 連続印刷はVBAで自動化が正解 ~
手作業で1件ずつ印刷し続けていると、時間のロスはもちろん、印刷ミスや書き換え忘れというリスクも高まります。
VBAで連続印刷マクロを実装すれば、顧客一覧からデータを自動で差し込みながら、ボタン1クリックで全件を連続印刷することが可能です。
今回紹介したコードをまとめると、「基本の連続印刷マクロ」「請求書・見積書への差し込み印刷」「範囲指定印刷」「プレビュー・印刷フラグ・部数制御のカスタマイズ」というラインナップで、実務のほぼすべての印刷ニーズに対応できます。
最初は基本コードをそのままコピペして動かすところから始め、自分の業務に合わせて少しずつカスタマイズしていくのがおすすめです。
もし「自分の業務に合わせた複雑なチェック処理を実装したい」「既存のマクロを改良したい」といったご要望がありましたら、マメBlogのエクセルマクロ開発依頼にご相談ください。
業務内容に合わせたオーダーメイドマクロを設定させていただきます。
最後まで読んでいただきありがとうございました。
エクセルVBAを使って面倒なルーティーン作業を自動化しちゃいましょう。