Excelの連続印刷マクロ応用|ページ設定を毎回そろえる・複数ページや複数シートを1件分で印刷
Excelの連続印刷マクロで、拡大縮小や余白が勝手に変わる、1件が2ページ以上になる、表紙と明細の2シートを1件分として出したい、一部の番号だけ印刷したい。そんなときに使える応用の書き方を、コピペできるコードでまとめました。
宛名リストから請求書を連続印刷するマクロ、使ってみたら便利だった。でも、しばらく使っていると困りごとが出てきます。
- 誰かが印刷設定を触ったらしく、今月は縮小されて小さく出てきた
- 明細が増えて、1件が2ページになった
- 表紙と明細が別のシートなのに、1件ずつセットで出せない
- 1件だけ刷り直したいのに、全件出てしまう
どれも、マクロに数行足すだけで直せます。この記事は、Excelマクロ入門|宛名リストから請求書を連続印刷するの続きです。基本のマクロをまだ作っていない人は、先にそちらを見てください。
この記事でわかること
- ページ設定(用紙・拡大縮小・余白)を、マクロで毎回そろえる方法
- 1件が2ページ以上になるときの設定
- 表紙と明細など、複数のシートを1件分として印刷する方法
- 番号を指定して、一部の宛先だけ印刷する方法
結論:困りごと別の直し方
| 困りごと | 原因 | 直し方 |
|---|---|---|
| 拡大縮小や余白が勝手に変わる | ページ設定はシートに保存されていて、誰でも変えられる | 印刷の直前に、マクロでページ設定を指定し直す |
| 1件が2ページ以上になる | 縦も1ページに収めようとして縮小されている、または改ページ位置がずれている | 横は1ページ、縦は必要なだけと指定する |
| 表紙と明細を1件ずつセットで出したい | 1シートずつしか印刷していない | 2つのシートをまとめて印刷する |
| 一部だけ刷り直したい | 2行目から最後まで全部回している | 開始と終了の番号を聞いてから回す |

ページ設定を毎回そろえる
印刷の設定(用紙の大きさ、縦横、拡大縮小、余白)は、シートの中に保存されています。便利な反面、誰かが一度変えると、そのまま残ります。ほかの人が別の用途で印刷したあとに、自分の請求書が小さく出てくるのはこのためです。
そこで、印刷する前に、マクロで毎回同じ設定を入れ直します。前回の記事のマクロの、For i = 2 To 最終行 の前に、次の数行を足します。
' ページ設定を毎回そろえる(印刷の前に1回だけ)
With テンプレ.PageSetup
.PaperSize = xlPaperA4 ' 用紙:A4
.Orientation = xlPortrait ' 向き:縦(横向きは xlLandscape)
.Zoom = False ' 倍率指定をやめて、ページ数で合わせる
.FitToPagesWide = 1 ' 横は1ページに収める
.FitToPagesTall = 1 ' 縦も1ページに収める
.TopMargin = Application.CentimetersToPoints(1.5) ' 上の余白(cm)
.BottomMargin = Application.CentimetersToPoints(1.5) ' 下の余白(cm)
.LeftMargin = Application.CentimetersToPoints(1.5) ' 左の余白(cm)
.RightMargin = Application.CentimetersToPoints(1.5) ' 右の余白(cm)
.CenterHorizontally = True ' 左右の中央にそろえる
End With
余白の数字(1.5)は、cmで書けるようにしてあります。自分の請求書に合わせて変えてください。
.Zoom = Falseは、「○%に縮小」という指定をやめる、という意味です。「何ページに収めるか」の指定(FitToPages…)を効かせるには、この行が必要です。- 印刷範囲も毎回そろえたいときは、
Withの中に.PrintArea = "$A$1:$F$40"のように、請求書の枠の範囲を1行足します。
これで、ここで指定した用紙・拡大縮小・余白は、誰かが変えていても印刷のたびにそろいます。行の高さや列の幅など、ここに書いていない設定は戻らないので注意してください。
1件が2ページ以上になるとき
明細が長く、1件が2ページになる請求書もあります。このとき縦も1ページに収める設定のままだと、2ページ分を1ページに縮めて、文字がとても小さくなります。
1件が複数ページになるなら、さっきのページ設定の2行を次のように変えます。
.FitToPagesWide = 1 ' 横は1ページに収める
.FitToPagesTall = False ' 縦は必要なだけページを使う
False にすると、縦は何ページになってもよい、という意味になります。横だけ1ページに収まるように縮小され、縦は自然にページが分かれます。
ページの切れ目を自分で決めたいときは注意が必要です。「横1ページ」のようにページ数で合わせる設定にしていると、自分で入れた改ページは無視されて、Excelが自動で切れ目を決めます。切れ目を自分で決めたいなら、ページ数で合わせる2行の代わりに .Zoom = 90 のような倍率の指定にして、[表示]→[改ページプレビュー]で青い線をドラッグしておきます。この場合、横を1ページに収める指定は効かなくなるので、プレビューで横がはみ出していないか確かめてください。
連続印刷マクロは、1件ごとに別々に印刷を指示します。両面印刷で使うときは、1件の終わりと次の件の始まりが、意図どおりの紙に分かれるかを2件分で試し刷りしてください。
表紙と明細を1件ずつセットで印刷する
「請求書(表紙)」と「明細」が別のシートになっているときは、2つのシートをまとめて印刷します。前回のマクロの テンプレ.PrintOut の行を、次の1行に置き換えます。
' 表紙と明細の2シートを、1件分としてまとめて印刷する
Worksheets(Array("請求書", "明細")).PrintOut

Array の中に、印刷したいシートの名前を並べます。3枚以上でも同じ書き方です。印刷される順番は、Array に書いた順ではなく、下のシートタブの並び順です。表紙を先に出したいなら、シートタブを「請求書 → 明細」の順に並べておきます。
- それぞれのシートのページ設定は、シートごとに使われます。表紙はA4縦、明細はA4横、のように分けることもできます
- ページ設定をマクロでそろえるときは、
With Worksheets("明細").PageSetupのように、シートごとに書きます - 宛名や金額が明細シートにもある場合は、明細シート側のセルも差し替える行を足してください
番号を指定して、一部だけ印刷する
1件だけ刷り直したいときに、全件が出てしまうのは困ります。宛名リストの「何行目から何行目まで」を最初に聞くようにします。前回のマクロの For i = 2 To 最終行 の行を、次のように置き換えます。
Dim 開始 As Long, 終了 As Long, 入力 As Variant
入力 = Application.InputBox("何件目から印刷しますか?(1件目=リストの2行目)", "開始", 1, Type:=1)
If VarType(入力) = vbBoolean Then Exit Sub ' キャンセル
If 入力 <> Int(入力) Then MsgBox "整数で入力してください。": Exit Sub
開始 = 入力
入力 = Application.InputBox("何件目まで印刷しますか?", "終了", 最終行 - 1, Type:=1)
If VarType(入力) = vbBoolean Then Exit Sub
If 入力 <> Int(入力) Then MsgBox "整数で入力してください。": Exit Sub
終了 = 入力
If 開始 < 1 Or 終了 < 開始 Or 終了 > 最終行 - 1 Then
MsgBox "番号の指定を確認してください(1〜" & (最終行 - 1) & ")。"
Exit Sub
End If
For i = 開始 + 1 To 終了 + 1
Application.InputBox の Type:=1 は、数字だけを受け付ける指定です。キャンセルを押すと、何も印刷せずに終わります。
開始 + 1 としているのは、宛名リストの1行目が見出しで、1件目が2行目にあるためです。3件目だけ刷り直すなら、開始と終了の両方に「3」を入れます。
最後の MsgBox で件数を出している行は、(終了 - 開始 + 1) に変えると、実際に印刷した件数が表示されます。
組み合わせたコード
ここまでの4つをまとめたものです。前回の記事と同じく、「宛名リスト」シートのA列に会社名、B列に金額、「請求書」シートのB2に会社名、B3に金額を入れる前提です。このままでは表紙(請求書シート)だけを印刷します。明細シートもセットで出すときは、Array("請求書") を Array("請求書", "明細") に変えてください。
コードを開く(全部コピーして貼り付け)
Sub 請求書を連続印刷_応用()
Dim リスト As Worksheet
Dim テンプレ As Worksheet
Dim 最終行 As Long
Dim i As Long
Dim 開始 As Long, 終了 As Long, 入力 As Variant
Set リスト = Worksheets("宛名リスト")
Set テンプレ = Worksheets("請求書")
最終行 = リスト.Cells(リスト.Rows.Count, "A").End(xlUp).Row
If 最終行 < 2 Then
MsgBox "宛名リストに宛先がありません。"
Exit Sub
End If
' 何件目から何件目までを印刷するか(数字だけ受け付ける)
入力 = Application.InputBox("何件目から印刷しますか?(1件目=リストの2行目)", "開始", 1, Type:=1)
If VarType(入力) = vbBoolean Then Exit Sub ' キャンセル
If 入力 <> Int(入力) Then MsgBox "整数で入力してください。": Exit Sub
開始 = 入力
入力 = Application.InputBox("何件目まで印刷しますか?", "終了", 最終行 - 1, Type:=1)
If VarType(入力) = vbBoolean Then Exit Sub
If 入力 <> Int(入力) Then MsgBox "整数で入力してください。": Exit Sub
終了 = 入力
If 開始 < 1 Or 終了 < 開始 Or 終了 > 最終行 - 1 Then
MsgBox "番号の指定を確認してください(1〜" & (最終行 - 1) & ")。"
Exit Sub
End If
' ページ設定を毎回そろえる
With テンプレ.PageSetup
.PaperSize = xlPaperA4
.Orientation = xlPortrait
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1 ' 1件が複数ページなら False にする
.TopMargin = Application.CentimetersToPoints(1.5)
.BottomMargin = Application.CentimetersToPoints(1.5)
.LeftMargin = Application.CentimetersToPoints(1.5)
.RightMargin = Application.CentimetersToPoints(1.5)
.CenterHorizontally = True
End With
For i = 開始 + 1 To 終了 + 1
テンプレ.Range("B2").Value = リスト.Cells(i, "A").Value
テンプレ.Range("B3").Value = リスト.Cells(i, "B").Value
' 表紙だけを印刷。明細シートもセットで出すなら Array("請求書", "明細") にする
Worksheets(Array("請求書")).PrintOut
Next i
MsgBox "印刷が終わりました(" & (終了 - 開始 + 1) & " 件)"
End Sub最初は、開始と終了に「1」を入れて、1件だけ試し刷りしてください。見た目を確かめてから全件を出すと、紙を無駄にしません。
よくある質問
Q. マクロを使わずに連続印刷するには?
宛名や金額を差し替えながら印刷したいなら、Wordの差し込み印刷が使えます。Excelの一覧をそのまま読み込めます。手順はWordの差し込み印刷で請求書を一括作成する方法にまとめています。宛先ごとにホチキス留めしたいときは、差し込み印刷を1件ずつ印刷してホチキス留めする方法も参考にしてください。
Q. 複数のシートを連続印刷するには?
差し替えがなく、決まったシートを続けて出すだけなら、マクロは要りません。下のシート名のタブを Ctrl キーを押しながらクリックして複数選び、そのまま印刷します。ファイルの全シートを出すなら、印刷画面の設定で「ブック全体を印刷」を選びます。宛名を差し替えながら出したいときは、この記事の「表紙と明細を1件ずつセットで印刷する」の書き方を使います。
Q. 連続印刷で番号を指定するには?
この記事の「番号を指定して、一部だけ印刷する」の書き方で、開始と終了の番号を聞いてから印刷できます。3件目だけなら、両方に「3」を入れます。
Q. 印刷する前にプレビューで確認したい
PrintOut の代わりに PrintPreview と書くと、すぐには印刷せず、プレビューを表示します(プレビューの画面から印刷もできます)。全件のプレビューを1件ずつ閉じるのは手間なので、開始と終了に「1」を入れて、1件目だけ確かめる使い方がおすすめです。
まとめ
- 拡大縮小や余白は、印刷の直前にマクロで指定し直すと、誰かが触っても戻る
- 1件が複数ページなら、横は1ページ・縦は
False。切れ目を自分で決めるなら、ページ数ではなく倍率の指定にする - 表紙と明細は
Worksheets(Array("請求書", "明細")).PrintOutで1件分をまとめて出せる。順番はシートタブの並び順 - 一部だけ刷り直すなら、開始と終了の番号を聞いてから回す
次の一段:印刷の先まで仕組みにする
印刷が安定したら、残るのは封入や送付の準備です。紙で出す必要がない相手には、PDFで送る流れにすると、印刷そのものが減らせます。まずは印刷の見た目を1ページに整えたい人は、Excelの請求書が1ページに収まらないときの直し方もあわせてどうぞ。
毎月の請求書づくりを丸ごと仕組みにしたい場合は、こちらからご相談ください。
※本記事のイラストは、仕組みがわかるように作成した説明用のイメージです。