← 記事一覧へ戻る

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

宛名リストから、表紙と明細を1件分のセットにして順に印刷する流れの図

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ページに収まらないときの直し方もあわせてどうぞ。

毎月の請求書づくりを丸ごと仕組みにしたい場合は、こちらからご相談ください。


※本記事のイラストは、仕組みがわかるように作成した説明用のイメージです。