Excelマクロで値を変えながら連続印刷する方法|差し込み印刷のように自動化しよう

Excelマクロで値を変えながら連続印刷する方法|差し込み印刷のように自動化しよう

くわしくは プライバシーポリシー をご確認ください。

Excelで「複数の書類を1枚ずつ自動で印刷したい」と思ったことはありませんか?
Wordには“差し込み印刷”機能がありますが、Excelには同じような機能がありません。
取引先ごとの見積書や、社員別の勤怠表などを1枚ずつ印刷するとなると、手作業では時間がかかってしまいますよね。

そこで便利なのが、マクロ(VBA)を使った連続印刷の自動化です。
あらかじめ一覧データとフォームを用意しておけば、ボタン1つでデータを差し替えながら連続印刷することができます。

この記事では、

  • マクロで印刷する方法(基本編)

  • マクロで値を変えながら連続印刷する方法

  • 間違い防止の工夫(確認メッセージ・試し印刷)

  • 配列を使って高速化する方法

まで、初心者でも実践できる手順で解説します。
最後に紹介する「マップ表を使った配列印刷」は、フォームや一覧の構成が変わっても柔軟に対応できる応用テクニックです。

目次

マクロで印刷する方法(基本編)

Excelマクロで印刷を自動化する場合、基本になるのが PrintOut メソッドです。
まずは、現在のシートをそのまま印刷するマクロを見てみましょう。


●現在のシートを印刷する基本コード

Sub 基本_現在のシートを印刷()
 ActiveSheet.PrintOut
End Sub

このマクロを実行すると、選択中のシートがそのまま印刷されます。
現在開いているシートを印刷したいだけなら、これで十分です。


●特定のシート(例:「フォーム」シート)を印刷する場合

Sub 基本_フォームを印刷()
 ThisWorkbook.Worksheets("フォーム").PrintOut
End Sub

「フォーム」という名前のシートを指定することで、
他のシートを開いていても 見積書などのテンプレートだけを印刷できます。


●補足:印刷プレビューを表示したい場合

印刷前に内容を確認したいときは、PrintOutPrintPreview に変更します。

Sub 基本_プレビュー表示()
 ThisWorkbook.Worksheets("フォーム").PrintPreview
End Sub

ワンポイント

  • PrintOut … そのまま印刷

  • PrintPreview … 印刷前に内容を確認できる(確認して閉じると次に進む)

  • 印刷範囲(PageSetup.PrintArea)は、事前に「フォーム」シートで設定しておくと安全です。

マクロを使った印刷については以下の記事もご参考ください。
Excelマクロで印刷する方法まとめ|ボタン作成・連続印刷・設定の基本と応用を紹介

次の章では、いよいよ 「値を変更しながら連続印刷」 に挑戦します。
Wordの差し込み印刷のように、一覧データを順に差し替えて自動印刷できるようにしましょう。


マクロで値を変更しながら連続印刷する方法

Excelでは、Wordのように「差し込み印刷」機能はありませんが、
一覧シートのデータを順番にフォームに反映させて印刷するマクロを使えば、
ほぼ同じことを実現できます。


●準備:2つのシートを用意する

まず、次の2枚のシートを準備します。

シート名 内容
一覧 印刷したいデータを一覧で管理(A列から順に入力)
フォーム 印刷レイアウト(見積書や証明書など)

例:一覧シートのデータ

A列:見積番号 B列:取引先名 C列:ご担当者 D列:郵便番号 E列:住所 F列:件名 G列:金額
M001 株式会社あおば商事 田中一郎 100-0001 東京都千代田区丸の内1-1-1 パーツ納入見積 150000
M002 株式会社すみれ工業 鈴木花子 150-0002 東京都渋谷区渋谷2-2-2 部品製作見積 220000

フォームシート

  • C2 に見積番号を表示

  • C3 に取引先名

  • C4 にご担当者

  • E9 に金額
    など、印刷用の書式を整えたレイアウトを配置しておきます。

一覧シートとフォームシートの作成例


●コード①:関数を使って自動反映する方法(初心者向け)

この方法は、フォーム側のセルに XLOOKUPINDEX+MATCH 関数を設定しておき、
マクロではキー(例:見積番号)を入れ替えるだけ、というシンプルな構成です。

Sub PrintWithChange()
 Dim i As Long
 Dim lastRow As Long
 lastRow = Sheets("一覧").Cells(Rows.Count, "A").End(xlUp).Row

 For i = 2 To lastRow
  Sheets("フォーム").Range("C2").Value = Sheets("一覧").Cells(i, "A").Value
  Application.Calculate ' 関数の再計算
  Sheets("フォーム").PrintOut
 Next i
End Sub

ポイント

  • C2 の値(見積番号)を順番に切り替えています。

  • Application.Calculate で、XLOOKUPなどの数式を再計算。

  • その都度 PrintOut で印刷。

 


●関数設定の例(フォームシート)

セル位置 数式例(一覧シートを参照)
C3 =XLOOKUP($C$2,一覧!$A:$A,一覧!$B:$B,"")
C4 =XLOOKUP($C$2,一覧!$A:$A,一覧!$C:$C,"")
E9 =XLOOKUP($C$2,一覧!$A:$A,一覧!$G:$G,"")

C2 に見積番号をセットすれば、ほかのセルも自動的に更新される仕組みです。
マクロでは、この C2 の値を順番に入れ替えて印刷します。


●コード②:プレビューを表示して確認する

一気に印刷してしまうのが不安な場合は、
PrintOut の部分を PrintPreview に変えるだけで、
1件ずつ内容を確認してから印刷できます。

Sub PrintWithChange_Preview()
Dim i As Long
Dim lastRow As Long
lastRow = Sheets("一覧").Cells(Rows.Count, "A").End(xlUp).Row

For i = 2 To lastRow
Sheets("フォーム").Range("C2").Value = Sheets("一覧").Cells(i, "A").Value
Application.Calculate
Sheets("フォーム").PrintPreview
Next i
End Sub

印刷プレビューを表示


補足:確認メッセージを追加することも可能

1件ごとに「印刷しますか?」と確認する場合は、次のように書き換えます。

 If MsgBox("この内容を印刷しますか?", vbYesNo + vbQuestion) = vbYes Then
  Sheets("フォーム").PrintOut
 End If

メッセージを表示して印刷するか確認


マクロ印刷の基本まとめ

  • 一覧シートにデータ、フォームシートにレイアウトを作成。

  • マクロでキー(C2セルなど)を入れ替えながら印刷。

  • PrintPreview で内容確認、PrintOut で直接印刷。

  • 関数を組み合わせれば、初心者でもすぐ試せる。


次の章では、間違いを防ぐための確認方法や試し印刷など、
「実務で使いやすくするための工夫」を紹介します。

マクロ印刷で間違いを防ぐための工夫

連続印刷マクロは便利ですが、設定を間違えると大量の誤印刷が発生してしまうおそれもあります。
そこで、安全に使うための確認機能をいくつか組み合わせておくと安心です。


●A:実行前にまとめて確認メッセージを出す

「印刷対象が全部で何件あるか」を事前に表示して、ユーザーに確認します。

Sub 間違い防止_一括確認メッセージ()
 Dim wsF As Worksheet, wsD As Worksheet
 Dim i As Long, lastRow As Long

 Set wsF = Sheets("フォーム")
 Set wsD = Sheets("一覧")
 lastRow = wsD.Cells(wsD.Rows.Count, "A").End(xlUp).Row

 If MsgBox("合計 " & (lastRow - 1) & " 件を印刷します。よろしいですか?", _
   vbYesNo + vbQuestion) = vbNo Then 
  Exit Sub
 else
  For i = 2 To lastRow
   wsF.Range("C2").Value = wsD.Cells(i, "A").Value
   Application.Calculate
   wsF.PrintOut
  Next i
 end if
End Sub

ポイント

  • MsgBox で確認メッセージを出し、vbNo なら途中で終了。

  • 一括印刷の前に“本当にこの件数でよいか”を確認できます。


●B:1件ごとに印刷するか確認する(個別チェック)

1枚ずつ MsgBoxでYesなら印刷/Noならスキップ
プレビューを出さないので、プレビュー側で印刷→コードでも印刷、という重複印刷が起きません

Sub 間違い防止_都度確認() '英名: Print_Confirm_Each
 Dim wsF As Worksheet, wsD As Worksheet
 Dim i As Long, lastRow As Long
 Dim keyVal As String

  Set wsF = Sheets("フォーム")
  Set wsD = Sheets("一覧")

  lastRow = wsD.Cells(wsD.Rows.Count, "A").End(xlUp).Row
 If lastRow < 2 Then
  MsgBox "一覧に印刷対象データがありません。", vbExclamation
  Exit Sub
 End If

 For i = 2 To lastRow
 ' ① キー(例:見積番号)をフォームへ反映
  keyVal = CStr(wsD.Cells(i, "A").Value)
  wsF.Range("C2").Value = keyVal

  ' ② 関数再計算(XLOOKUP/INDEX+MATCHなど)
  Application.Calculate

  ' ③ 都度確認(Yes=印刷 / No=スキップ / Cancel=全体中止)
  Select Case MsgBox( _
   Prompt:="この内容を印刷しますか?" & vbCrLf & "見積番号: " & keyVal, _
   Buttons:=vbYesNoCancel + vbQuestion, _
   Title:="印刷確認 (" & (i - 1) & "件目)" _
   )
    Case vbYes
     wsF.PrintOut
    Case vbNo
     ' 何もしない(次へ)
    Case vbCancel
     Exit Sub
  End Select
 Next i
End Sub

データごとにメッセージを表示して印刷するか確認

「この内容を印刷しますか?」のメッセージに対して、3通りの選択肢があります。

選択肢 動作
はい(Y) 該当データを印刷します。
いいえ(N) 何もせず、次のデータに進みます。
キャンセル 印刷マクロ全体を停止します。

1件ずつ確認しながら印刷できるため、誤印刷を防ぎたい場合や、途中で内容を確認したい場合に便利です。

補足:プレビューを併用する場合の注意

このコードではプレビューを表示しないため、二重印刷の心配がありません。
もしプレビューを組み合わせると、プレビュー画面から印刷した際に
マクロの PrintOut と重なって2回印刷される可能性があります。
プレビューを使いたい場合は、2章で紹介した「プレビュー表示」版コードを使い分けましょう。


●C:上位N件だけ試し印刷する(テスト用)

全件印刷する前に、まず3件ほど試し印刷して確認する方法も便利です。

Sub 試し印刷_上位3件だけ()
 '変数の設定
 Dim wsF As Worksheet, wsD As Worksheet
 Dim i As Long, lastRow As Long, n As Long

 'シート名代入
 Set wsF = Sheets("フォーム")
 Set wsD = Sheets("一覧")

 'データ数を取得
 lastRow = wsD.Cells(wsD.Rows.Count, "A").End(xlUp).Row

 'テスト印刷の設定
 n = 3 ' ←印刷件数を指定(ここでは3件)
 'テスト印刷がデータ数より少ないか確認(エラー回避のため)
 If lastRow - 1 < n Then n = lastRow - 1

 'テスト印刷確認メッセージを表示
 If MsgBox("上位 " & n & " 件のみ試し印刷します。よろしいですか?", _
  vbYesNo + vbQuestion) = vbNo Then Exit Sub

 '差し込み印刷開始
 For i = 2 To 1 + n
  wsF.Range("C2").Value = wsD.Cells(i, "A").Value
  Application.Calculate
  wsF.PrintOut
 Next i
End Sub

上位N件のみ試し印刷を行う場合、実行すると下図のように確認メッセージが表示されます。

試し印刷実行前にメッセージを表示

図:試し印刷マクロ実行時の確認メッセージ
上位3件だけ印刷する前に、確認ダイアログが表示されます。
「はい」を選ぶと3件分のみ印刷し、「いいえ」を選ぶとキャンセルされます。

ポイント

  • n の値を変えるだけで、試し印刷の件数を調整できます。

  • 社内確認やレイアウトチェックにおすすめです。

 


ここまでのまとめ

方法 内容 安全性 おすすめシーン
A 一括確認メッセージ ★★★ 一度に印刷する前の最終確認
B 1件ごとの確認 ★★★★ 内容を目視でチェックしたいとき
C 試し印刷(上位N件) ★★ テスト印刷・事前確認用

次の章では、一覧データを配列として一気に読み込み、
より高速かつ柔軟に印刷する「配列版の差し込み印刷マクロ」を紹介します。
フォームと一覧の列対応を自由に設定できる“マップ表”もあわせて解説します。

配列で一括読込 → 直接代入して高速に連続印刷する

なぜ配列?

一覧シートから1件ずつセル参照するより、いったん配列にまとめて読み込むほうが速く、印刷件数が多いほど効果が出ます。
やることはシンプル:

  1. 一覧を配列に読み込む

  2. 1行ずつフォームの決めセルへ代入

  3. 印刷(またはプレビュー)

配列については以下の記事をご参考ください。
VBAの配列の基本と使い方まとめ|1次元・2次元・動的・Functionの戻り値まで徹底解説!


前提(固定配置)

  • 「一覧」:A列=見積番号、B=取引先、C=担当、D=郵便、E=住所、F=件名、G=金額
    一覧シートの例

  • 「フォーム」:C2=見積番号、C3=取引先、C4=担当、C5=郵便、C6=住所、C7=件名、E9=金額
    (セル番地はそのまま使えます/変える場合はコード内の対応箇所だけ調整)
    フォームシートの例


コード①:プレビューで確認しながら(安全運用)

' プレビューで確認しながら出力(安全)
Sub 配列_連続印刷_プレビュー()
' 変数の宣言
 Dim wsF As Worksheet, wsD As Worksheet
 Dim lastRow As Long, lastCol As Long
 Dim arr As Variant
 Dim r As Long
 Dim prevScrUpd As Boolean

 'エラー回避処理
 On Error GoTo EH 

  ' シート名を格納
  Set wsF = Sheets("フォーム")
  Set wsD = Sheets("一覧")

  ' データ行数を取得(A列の最終行)
  lastRow = wsD.Cells(wsD.Rows.Count, "A").End(xlUp).Row

  ' "一覧"シート内にデータが入力されているか確認
  If lastRow < 2 Then
   MsgBox "一覧にデータがありません。", vbExclamation
   Exit Sub
  End If

  ' データの項目数を取得(見出しの最終列)
  lastCol = wsD.Cells(1, wsD.Columns.Count).End(xlToLeft).Column

  ' 配列に"一覧"シート内のデータを取り込み(A2:最終セルを一気読み)
  arr = wsD.Range(wsD.Cells(2, 1), wsD.Cells(lastRow, lastCol)).Value

  ' 画面更新を停止(高速化&チラつき防止)
  prevScrUpd = Application.ScreenUpdating
  Application.ScreenUpdating = False

  ' 1行ずつフォームへ書き込み → プレビュー
  For r = 1 To UBound(arr, 1)
   wsF.Range("C2").Value = arr(r, 1) ' 見積番号(A列)
   wsF.Range("C3").Value = arr(r, 2) ' 取引先(B列)
   wsF.Range("C4").Value = arr(r, 3) ' 担当(C列)
   wsF.Range("C5").Value = arr(r, 4) ' 郵便(D列)
   wsF.Range("C6").Value = arr(r, 5) ' 住所(E列)
   wsF.Range("C7").Value = arr(r, 6) ' 件名(F列)
   wsF.Range("E9").Value = arr(r, 7) ' 金額(G列)

   wsF.PrintPreview ' ←直接印刷したい場合は PrintOut
  Next r

 CleanExit:
  Application.ScreenUpdating = prevScrUpd
  Exit Sub

 '途中でエラーがあった場合の処理
 EH:
  MsgBox "エラー: " & Err.Description, vbExclamation
  Resume CleanExit
End Sub

プレビューから印刷する運用なので二重印刷になりません(コード側では印刷していないため)。


コード②:確認なしで一気に印刷(慣れてから)

‘ 配列で一覧データをまとめて読み込み、
‘ フォームに順番に書き込みながら一気に印刷するマクロ
‘ ※確認メッセージやプレビューは表示されません(慣れてから使用)

Sub 配列_連続印刷_直接印刷()
 ' 変数の宣言
 Dim wsF As Worksheet, wsD As Worksheet
 Dim lastRow As Long, lastCol As Long
 Dim arr As Variant
 Dim r As Long
 Dim prevScrUpd As Boolean

 On Error GoTo EH ' エラー発生時の安全処理へ

  ' シートを変数に代入
  Set wsF = Sheets("フォーム") ' 印刷用テンプレートシート
  Set wsD = Sheets("一覧") ' データ一覧シート

  ' 「一覧」シートの最終行(A列)を取得
  lastRow = wsD.Cells(wsD.Rows.Count, "A").End(xlUp).Row

  ' データが1件もない場合は警告を出して終了
  If lastRow < 2 Then
   MsgBox "一覧にデータがありません。", vbExclamation
   Exit Sub
  End If

  ' 「一覧」シートの最終列を取得(列数の確認)
  lastCol = wsD.Cells(1, wsD.Columns.Count).End(xlToLeft).Column

  ' A2セルから最終行・最終列までを配列に一括読み込み
  arr = wsD.Range(wsD.Cells(2, 1), wsD.Cells(lastRow, lastCol)).Value

  ' 画面更新を停止(高速化&チラつき防止)
  prevScrUpd = Application.ScreenUpdating
  Application.ScreenUpdating = False

  ' --- 一覧のデータを順番にフォームへ転記して印刷 ---
  For r = 1 To UBound(arr, 1)
   wsF.Range("C2").Value = arr(r, 1) ' 見積番号(A列)
   wsF.Range("C3").Value = arr(r, 2) ' 取引先(B列)
   wsF.Range("C4").Value = arr(r, 3) ' 担当(C列)
   wsF.Range("C5").Value = arr(r, 4) ' 郵便(D列)
   wsF.Range("C6").Value = arr(r, 5) ' 住所(E列)
   wsF.Range("C7").Value = arr(r, 6) ' 件名(F列)
   wsF.Range("E9").Value = arr(r, 7) ' 金額(G列)

   wsF.PrintOut ' 直接印刷(プレビューなし)
  Next r

 CleanExit:
 ' 画面更新を元に戻す
 Application.ScreenUpdating = prevScrUpd
 Exit Sub

 EH:
 ' エラーが発生した場合にメッセージを表示して安全終了
 MsgBox "エラー: " & Err.Description, vbExclamation
 Resume CleanExit
End Sub

このマクロはプレビューや確認なしで一括印刷するため、
実際の運用ではまずプレビュー版で内容を確認し、
問題ないことを確認してから使用するのがおすすめです。
印刷範囲(Print_Area)は事前に設定しておくと安全です。

まとめ

この記事では、Excelで値を変更しながら連続印刷する方法を初心者向けに解説しました。
Wordの「差し込み印刷」に近い仕組みを、VBAマクロを使って再現できます。


今回のポイント

内容 解説
① 基本の印刷マクロ PrintOutPrintPreview でシートを印刷・プレビューできる。
② 値を変えながら連続印刷 一覧シートのデータを順にフォームへ差し込み、自動で印刷可能。
③ 間違い防止の工夫 一括確認・都度確認・試し印刷などを組み合わせて安全に運用。
④ 配列で高速化(今回の新構成) 一覧のデータを配列に一括読み込みし、フォームにまとめて転記。印刷件数が多い場合もスムーズ。

配列を使うメリット

一覧のセルを1件ずつ読み込むのではなく、
一度にすべてのデータを配列にまとめて読み込むことで処理速度が大幅にアップします。

フォームの決まったセルに順番に代入していくだけなので、
構造はシンプルながら実務でも安定して使える方法です。

印刷前に内容を確認したい場合は PrintPreview
すぐ印刷したい場合は PrintOut に切り替えるだけでOK。

 応用編(中級者向け)

フォームと一覧の項目対応を固定せず、
「どのセルにどのデータを入れるか」をマップ表で定義しておくと、
レイアウトが変わってもコードを修正せずに再利用できます。

 詳しくは別記事:
「マップ表で柔軟に対応する自動印刷マクロ(VBA中級編)」 にて解説予定。


実務でのおすすめ構成

  1. 一覧シート:印刷対象のデータ(例:顧客一覧、社員名簿など)

  2. フォームシート:印刷レイアウト(テンプレート)

  3. マクロ

    • 検証段階 → プレビュー付き

    • 実務運用 → 直接印刷 or 試し印刷版

この3要素を組み合わせれば、見積書・案内状・名札などの帳票をExcelだけで自動化できます。

最後に

Excelでも、少しのマクロを加えるだけで
一覧データを自動で差し替えながら印刷することができます。
まずはプレビュー付きで動作を確認し、慣れたら直接印刷へステップアップしましょう。
繰り返し作業を自動化すれば、業務時間をぐっと短縮できます。


【関連記事】

※外部リンク※

※参考書籍 (PR)

※本ボックスにはアフィリエイトリンク(PR)が含まれます。
くわしくは プライバシーポリシー へ。