【VBA】複数シートの印刷設定を一括変更して印刷する方法(コピペOK)

VBA
スポンサーリンク
スポンサーリンク
  1. この記事でわかること
  2. どんな場面で使う?
  3. 完成イメージ(Before / After)
  4. 実行前の準備
    1. バックアップを取る
    2. Excelをマクロ有効ブック(.xlsm)で保存する
    3. テスト時はプレビューで確認する
  5. 手順(コピペ → 実行まで約5分)
    1. VBE(コードを書く画面)を開く
    2. 標準モジュールを挿入する
    3. コードを貼り付けて実行する
  6. コード(基本版)– PageSetupで印刷設定を変更して印刷
    1. 書き換えポイント
  7. コード(応用版)– 全シートの印刷設定を一括変更して印刷
    1. コードの流れ
  8. コード(実務版)– シート名リストで対象を選んで印刷
    1. 書き換えポイント
    2. コードの流れ
  9. よくある落とし穴5選
    1. 1. Preview:=True を付けずにテスト → 大量印刷
    2. 2. PageSetupの処理が遅い
    3. 3. Zoom と FitToPages が競合する
    4. 4. 余白の単位を間違える
    5. 5. 非表示シートを印刷しようとしてエラー
    6. 6. PrintCommunication = False のまま処理が中断した
    7. VBAで印刷設定が反映されない・変わらないときの対処法
    8. VBAのPageSetupが遅い・処理に時間がかかるときの高速化方法
    9. VBAで印刷時にZoomとFitToPagesが競合するときの対処法
  10. FAQ
    1. Q1: 印刷ではなくPDF保存したい
    2. Q2: 用紙サイズをA3に変えたい
    3. Q3: 印刷部数を変えたい
    4. Q4: 両面印刷を設定したい
    5. Q5: シートごとに異なる印刷設定にしたい
  11. まとめ
    1. 関連記事
    2. 次にやりたくなること
  12. もっとカスタマイズしたい場合

この記事でわかること

  • VBAで複数シートの印刷設定(用紙サイズ・余白・向きなど)を一括変更できる
  • 設定変更後にまとめて印刷できる
  • シート名リストで対象シートを選んで印刷できる

対象: Excel 2016以降 / Microsoft 365、Windows 10/11

どんな場面で使う?

印刷設定の一括変更は、以下のような場面で特に威力を発揮する。

  • 月次報告書を12シート分印刷するのに、毎回1シートずつ印刷設定を確認している。A4横・余白狭め・ヘッダーに日付を入れて…を12回繰り返すのは非効率
  • 部署ごとのシートに同じ印刷設定を適用したい。営業部・経理部・人事部…とシートが増えるたびに手作業で設定するのは面倒
  • テンプレートブックを配布する前に、全シートの印刷設定を統一したい。設定がバラバラだと、印刷したときに1シートだけ向きが違ったり余白が広かったりして見栄えが悪い
  • PrintTitleRows(タイトル行)を全シートに設定して、印刷時に見出し行が毎ページ繰り返されるようにしたい。画面表示でのウィンドウ枠固定とは別に、印刷用の設定が必要
  • 定期的に同じブックを印刷するルーチン作業。印刷設定→印刷→次のシート→印刷設定→印刷…の繰り返しをボタン1つに集約したい

完成イメージ(Before / After)

Before(手作業):

1シートずつ「ページレイアウト」タブを開いて、用紙サイズ・余白・向き・ヘッダーを設定。12シートあれば12回繰り返す。


Sheet1 → ページ設定 → A4横 → 余白狭め → ヘッダー設定 → 印刷
Sheet2 → ページ設定 → A4横 → 余白狭め → ヘッダー設定 → 印刷
  ...(12回繰り返し)
Sheet12 → ページ設定 → A4横 → 余白狭め → ヘッダー設定 → 印刷

After(VBA実行後):

マクロを1回実行するだけで、全シートの印刷設定が統一されて印刷される。


マクロ実行 → 全12シートの印刷設定を一括変更 → まとめて印刷完了

自分も以前、月次報告書を12シート分印刷するのに、毎回1シートずつ印刷設定を確認していた。A4横・余白狭め・ヘッダーに日付…を12回繰り返す。設定漏れで1シートだけA4縦で印刷されて、上司に「これだけ向きが違うよ」と指摘されたこともあった。VBAで印刷設定を一括変更するようにしてからは、設定漏れがゼロになった。12シート分の印刷がボタン1つで完了する。同じように複数シートの印刷で苦労している人に、この記事で一括設定の便利さを体験してほしい。

複数シートのループ処理が初めての場合は、先に 複数シートを一括処理する方法 を読んでおくと理解しやすい。

実行前の準備

バックアップを取る

PageSetupの変更は元に戻せない(Ctrl+Zが効かない)。必ずファイルのコピーを別フォルダに保存してから実行する。

Excelをマクロ有効ブック(.xlsm)で保存する

  1. 「ファイル」→「名前を付けて保存」
  2. ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
  3. 保存

テスト時はプレビューで確認する

PrintOutは実行すると即印刷される。テスト段階では Preview:=True を付けてプレビュー確認すること。コード内にコメントで切り替え方法を記載している。

手順(コピペ → 実行まで約5分)

VBE(コードを書く画面)を開く

  1. Excelで Alt + F11 を押す

標準モジュールを挿入する

  1. VBEのメニュー →「挿入」→「標準モジュール」

コードを貼り付けて実行する

  1. コードウィンドウに、下のコードをそのままコピペする
  2. Alt + F8 → マクロ名を選んで「実行」

コード(基本版)– PageSetupで印刷設定を変更して印刷

まずは1シートの印刷設定を変更して印刷する基本形。PageSetupのプロパティを理解するのに使う。


'============================================================
' ■ アクティブシートの印刷設定を変更して印刷(基本版)
'   → 用紙サイズ・向き・余白・ヘッダーを設定してプレビュー表示
'============================================================
Sub PrintSingleSheet()

    Dim ws As Worksheet
    Set ws = ActiveSheet

    '--- 印刷設定を変更
    With ws.PageSetup
        '--- ★書き換えポイント ---
        .PaperSize = xlPaperA4            '← 用紙サイズ(A4)
        .Orientation = xlLandscape        '← 印刷の向き(横)
        .Zoom = False                     '← 倍率を無効にして FitToPages を使う
        .FitToPagesWide = 1               '← 横方向を1ページに収める
        .FitToPagesTall = False           '← 縦方向はページ数を制限しない

        '--- 余白(センチメートルで指定)
        .LeftMargin = Application.CentimetersToPoints(1)
        .RightMargin = Application.CentimetersToPoints(1)
        .TopMargin = Application.CentimetersToPoints(1.5)
        .BottomMargin = Application.CentimetersToPoints(1.5)

        '--- ヘッダー / フッター
        .CenterHeader = "&D"              '← 中央ヘッダーに日付
        .RightFooter = "&P / &N"          '← 右フッターにページ番号/総ページ数

        '--- 中央配置
        .CenterHorizontally = True        '← 水平方向に中央配置
        '--- ★ここまで ---
    End With

    '--- プレビュー表示(テスト時はこちら)
    ws.PrintPreview

    '--- 本番印刷するときはこちら(上の行をコメントアウトして下を有効にする)
    ' ws.PrintOut Copies:=1

    MsgBox ws.Name & " の印刷設定を変更しました。", vbInformation

End Sub

書き換えポイント

プロパティ 説明 設定値の例
.PaperSize 用紙サイズ xlPaperA4(A4)、xlPaperA3(A3)、xlPaperB4(B4)
.Orientation 印刷の向き xlLandscape(横)、xlPortrait(縦)
.FitToPagesWide 横方向のページ数 1(1ページに収める)、False(制限なし)
.FitToPagesTall 縦方向のページ数 1(1ページに収める)、False(制限なし)
余白 左右上下の余白 CentimetersToPoints(1) = 1cm
.CenterHeader 中央ヘッダー "&D"(日付)、"&F"(ファイル名)
.RightFooter 右フッター "&P / &N"(ページ/総ページ)

基本版のコードでは With ws.PageSetup ブロックの中で一括して設定を行っている。PageSetup オブジェクトはシートごとに1つ存在し、印刷に関するすべての設定を保持している。With 構文を使っているのは、PageSetupのプロパティを何度も呼び出す際に、毎回 ws.PageSetup.PaperSizews.PageSetup.Orientation と書く手間を省くため。可読性も上がるし、内部的にもオブジェクト参照の回数が減るので効率的。

.Zoom = False.FitToPagesWide = 1 の組み合わせは、「列が多い表を横方向だけ1ページに収める」ための定番設定。ZoomFalse にしないと FitToPagesWide が効かないので、この順番で設定するのがポイント。縦方向は FitToPagesTall = False で制限していないので、データ行数に応じて自動的にページが分割される。

ヘッダー/フッターの特殊コード:

  • &D = 日付、&T = 時刻、&F = ファイル名、&A = シート名
  • &P = ページ番号、&N = 総ページ数

コード(応用版)– 全シートの印刷設定を一括変更して印刷

全シートに同じ印刷設定を適用してまとめて印刷する。Application.PrintCommunication = False で PageSetup の処理を高速化している。


'============================================================
' ■ 全シートの印刷設定を一括変更して印刷(応用版)
'   → 全シートに同じ印刷設定を適用し、まとめて印刷
'============================================================
Sub PrintAllSheets()

    Dim ws As Worksheet
    Dim sheetCount As Long

    sheetCount = 0

    '--- PageSetup の高速化(Excel 2010以降)
    Application.PrintCommunication = False

    '--- 全シートをループして印刷設定を変更
    For Each ws In ThisWorkbook.Worksheets

        '--- 非表示シートはスキップ
        If ws.Visible = xlSheetVisible Then

            With ws.PageSetup
                '--- ★書き換えポイント ---
                .PaperSize = xlPaperA4
                .Orientation = xlLandscape
                .Zoom = False
                .FitToPagesWide = 1
                .FitToPagesTall = False

                .LeftMargin = Application.CentimetersToPoints(1)
                .RightMargin = Application.CentimetersToPoints(1)
                .TopMargin = Application.CentimetersToPoints(1.5)
                .BottomMargin = Application.CentimetersToPoints(1.5)

                .CenterHeader = "&D"
                .RightFooter = "&P / &N"
                .CenterHorizontally = True
                '--- ★ここまで ---
            End With

            sheetCount = sheetCount + 1

        End If

    Next ws

    '--- PageSetup の高速化を解除
    Application.PrintCommunication = True

    '--- 全シートをまとめてプレビュー表示(テスト時)
    Dim i As Long
    Dim sheetNames() As String
    ReDim sheetNames(1 To sheetCount)

    i = 0
    For Each ws In ThisWorkbook.Worksheets
        If ws.Visible = xlSheetVisible Then
            i = i + 1
            sheetNames(i) = ws.Name
        End If
    Next ws

    ThisWorkbook.Sheets(sheetNames).PrintPreview

    '--- 本番印刷するときはこちら
    ' ThisWorkbook.Sheets(sheetNames).PrintOut Copies:=1

    MsgBox sheetCount & " シートの印刷設定を一括変更しました。", vbInformation

End Sub

コードの流れ

  1. Application.PrintCommunication = False で PageSetup の高速化を開始
  2. 全シートをループし、非表示シートをスキップしながら印刷設定を統一
  3. Application.PrintCommunication = True で高速化を解除
  4. 表示中のシート名を配列に格納し、まとめてプレビュー表示(または印刷)

高速化について: PageSetupのプロパティを変更するたびにプリンタドライバとの通信が発生する。PrintCommunication = False で通信を一時停止し、全プロパティの設定後に True で反映させると、処理速度が大幅に向上する。自分の環境では12シートの設定変更が30秒→3秒になったことがある。シート数が多いほど効果が顕著に出る。

この応用版では、まず全シートの印刷設定をループで変更し、その後に表示中のシート名を配列に格納してまとめて PrintPreview(または PrintOut)を呼んでいる。2回ループしているように見えるが、1回目は設定変更のループ(PrintCommunicationで高速化)、2回目はシート名の収集だけなので処理は軽い。まとめて印刷するために ThisWorkbook.Sheets(sheetNames) のように配列でシートを指定するのがテクニック。

複数シートのループ処理の基本は 複数シートを一括処理する方法 を参照。

コード(実務版)– シート名リストで対象を選んで印刷

実務では「全シート」ではなく「特定のシートだけ」印刷したいケースが多い。シート名のリストで対象を絞り、対象外のシートはスキップする。


'============================================================
' ■ シート名リストで対象を選んで印刷(実務版)
'   → 指定したシートだけ印刷設定を変更して印刷
'   → 対象外のシートはスキップ+ログ表示
'============================================================
Sub PrintSelectedSheets()

    '--- ★書き換えポイント: 印刷したいシート名を列挙 ---
    Dim targetSheets As Variant
    targetSheets = Array("1月", "2月", "3月", "4月", "5月", "6月", _
                         "7月", "8月", "9月", "10月", "11月", "12月")
    '--- ★ここまで ---

    Dim ws As Worksheet
    Dim sheetName As Variant
    Dim printList() As String
    Dim skipList As String
    Dim printCount As Long
    Dim skipCount As Long
    Dim found As Boolean

    printCount = 0
    skipCount = 0
    skipList = ""

    '--- PageSetup の高速化
    Application.PrintCommunication = False

    '--- 対象シートの印刷設定を変更
    For Each sheetName In targetSheets

        found = False

        '--- シートが存在するか確認
        On Error Resume Next
        Set ws = ThisWorkbook.Worksheets(CStr(sheetName))
        On Error GoTo 0

        If Not ws Is Nothing Then
            If ws.Visible = xlSheetVisible Then

                With ws.PageSetup
                    '--- ★書き換えポイント: 印刷設定 ---
                    .PaperSize = xlPaperA4
                    .Orientation = xlLandscape
                    .Zoom = False
                    .FitToPagesWide = 1
                    .FitToPagesTall = False

                    .LeftMargin = Application.CentimetersToPoints(1)
                    .RightMargin = Application.CentimetersToPoints(1)
                    .TopMargin = Application.CentimetersToPoints(1.5)
                    .BottomMargin = Application.CentimetersToPoints(1.5)

                    .CenterHeader = "&D"
                    .RightFooter = "&P / &N"
                    .CenterHorizontally = True
                    '--- ★ここまで ---
                End With

                printCount = printCount + 1
                ReDim Preserve printList(1 To printCount)
                printList(printCount) = CStr(sheetName)

            Else
                skipCount = skipCount + 1
                skipList = skipList & CStr(sheetName) & "(非表示)" & vbCrLf
            End If
        Else
            skipCount = skipCount + 1
            skipList = skipList & CStr(sheetName) & "(存在しない)" & vbCrLf
        End If

        Set ws = Nothing

    Next sheetName

    '--- PageSetup の高速化を解除
    Application.PrintCommunication = True

    '--- 対象シートがなければ終了
    If printCount = 0 Then
        MsgBox "印刷対象のシートが見つかりませんでした。" & vbCrLf & _
               "スキップ:" & vbCrLf & skipList, vbExclamation
        Exit Sub
    End If

    '--- 対象シートをまとめてプレビュー表示(テスト時)
    ThisWorkbook.Sheets(printList).PrintPreview

    '--- 本番印刷するときはこちら
    ' ThisWorkbook.Sheets(printList).PrintOut Copies:=1

    '--- 結果メッセージ
    Dim msg As String
    msg = "印刷対象:" & printCount & " シート" & vbCrLf

    If skipCount > 0 Then
        msg = msg & "スキップ:" & skipCount & " シート" & vbCrLf & skipList
    End If

    MsgBox msg, vbInformation

End Sub

書き換えポイント

変数 説明 初期値
targetSheets 印刷したいシート名の配列 "1月""12月"
PageSetup各プロパティ 印刷設定(基本版と同じ) A4横・余白1cm・ヘッダー日付

コードの流れ

  1. 印刷対象のシート名を配列で定義
  2. 各シート名について存在チェック+非表示チェック
  3. 対象シートの印刷設定を一括変更
  4. 存在しないシート・非表示シートはスキップしてログに記録
  5. 対象シートをまとめてプレビュー表示(または印刷)
  6. 結果メッセージで印刷シート数とスキップ情報を表示

この実務版の大きな特徴は、シートの存在チェックを On Error Resume Next で行っている点。Worksheets(CStr(sheetName)) で存在しないシート名を指定するとエラーになるが、On Error Resume Next でエラーを一時的に無視し、wsNothing かどうかで存在を判定している。このパターンは、シート名の配列に間違った名前が含まれていても処理が止まらないので実務向き。存在しないシートやスキップしたシートは skipList に記録して、最後にまとめてユーザーに報告する設計になっている。「3月シートが印刷されていない」と気づいたとき、結果メッセージを見れば原因がすぐ分かる。

ファイルやフォルダの存在確認の応用パターンはファイルやフォルダの存在を確認する方法(記事074)で詳しく解説している。

印刷ではなくPDFとして保存したい場合は ExcelファイルをPDFに一括変換する方法 を参照。

よくある落とし穴5選

1. Preview:=True を付けずにテスト → 大量印刷

PrintOutにPreview:=Trueを付けずにテストしたら、12シート×2部=24枚が一気に印刷されて紙が大量に無駄になった。テスト時は必ずプレビューにすべき。

対策: テスト段階では PrintPreview を使うか、PrintOut Preview:=True を付ける。コード内にコメントで切り替え方法を記載してある。

2. PageSetupの処理が遅い

12シートの印刷設定を変更するのに30秒以上かかる場合がある。原因はプリンタドライバとの通信。

対策: Application.PrintCommunication = False で通信を一時停止する。応用版・実務版のコードには最初から入っている。

3. Zoom と FitToPages が競合する

Zoom = 80.FitToPagesWide = 1 を両方設定すると、後から設定した方が有効になる。

対策: FitToPages を使う場合は必ず Zoom = False にする。逆に Zoom(倍率指定)を使う場合は FitToPagesWide / FitToPagesTall を設定しない。

4. 余白の単位を間違える

.LeftMargin = 1 と書くと1ポイント(約0.035cm)になってしまい、ほぼ余白なしになる。

対策: センチメートルで指定する場合は Application.CentimetersToPoints(1) を使う。1cm = 約28.35ポイント。

5. 非表示シートを印刷しようとしてエラー

Visible = False のシートに対して PrintOut を実行するとエラーになる。

対策: ループ内で ws.Visible = xlSheetVisible をチェックしてスキップする。応用版・実務版のコードには最初から入っている。

6. PrintCommunication = False のまま処理が中断した

エラーが発生して PrintCommunication = True に戻す前に処理が中断すると、以降のPageSetup操作が正常に動作しなくなることがある。

対策: エラーハンドラーを追加して、エラー発生時にも必ず Application.PrintCommunication = True に戻す処理を入れる。もし既に状態がおかしくなっている場合は、イミディエイトウィンドウ(Ctrl + G)で Application.PrintCommunication = True を実行する。

VBAで印刷設定が反映されない・変わらないときの対処法

「PageSetupのプロパティを変更したのに印刷プレビューで設定が反映されない」という場合、原因は Application.PrintCommunication = False のまま解除を忘れていること。PrintCommunicationをFalseにするとプリンタドライバとの通信が停止し、設定変更がバッファされる。処理後に Application.PrintCommunication = True を実行しないと変更が反映されない。対処法は、PageSetupの設定が終わったら必ず PrintCommunication = True に戻すこと。もし既に状態がおかしくなっている場合は、イミディエイトウィンドウで Application.PrintCommunication = True を実行する。

VBAのPageSetupが遅い・処理に時間がかかるときの高速化方法

「12シートの印刷設定を変更するのに30秒以上かかる」という場合、原因はPageSetupのプロパティを変更するたびにプリンタドライバとの通信が発生していること。対処法は、ループの前に Application.PrintCommunication = False を入れて通信を一時停止し、ループ後に True で一括反映すること。自分の環境ではこの1行を追加するだけで30秒→3秒に短縮された。シート数が多いほど効果が大きいので、複数シートのPageSetup変更では必須のテクニック。

VBAで印刷時にZoomとFitToPagesが競合するときの対処法

「FitToPagesWideを設定したのにページに収まらない」という場合、原因はZoomプロパティとFitToPagesの競合。.Zoom = 80 のように倍率指定が残っていると、FitToPagesWide / FitToPagesTall が無視される。対処法は、FitToPagesを使う場合は必ず .Zoom = False を先に設定すること。逆に倍率指定(Zoom)を使いたい場合は FitToPagesWide / FitToPagesTall を設定しない。この2つは排他的な関係なので、どちらか一方だけを使うのが鉄則。

FAQ

Q1: 印刷ではなくPDF保存したい

PrintOut の代わりに ExportAsFixedFormat を使う。詳しくは ExcelファイルをPDFに一括変換する方法 を参照。

Q2: 用紙サイズをA3に変えたい

.PaperSize = xlPaperA4.PaperSize = xlPaperA3 に変更する。その他の用紙サイズ: xlPaperB4(B4)、xlPaperB5(B5)、xlPaperLegal(Legal)。

Q3: 印刷部数を変えたい

PrintOut Copies:=2 のように部数を指定する。デフォルトは1部。

Q4: 両面印刷を設定したい

VBAのPageSetupからは両面印刷を直接設定できない。プリンタドライバ側の設定に依存する。Windowsの「デバイスとプリンター」からプリンターのプロパティで両面印刷をデフォルトに設定しておくのが現実的。

Q5: シートごとに異なる印刷設定にしたい

ループ内で ws.Name を判定し、シート名に応じて設定を分岐させる。例えば「集計」シートだけA3横にする場合:


If ws.Name = "集計" Then
    .PaperSize = xlPaperA3
Else
    .PaperSize = xlPaperA4
End If

まとめ

  • 基本版: PageSetupで1シートの印刷設定を変更して印刷
  • 応用版: 全シートの印刷設定を一括変更して印刷。PrintCommunicationで高速化
  • 実務版: シート名リストで対象を絞り、対象外はスキップ+ログ表示

重要なのは、テスト時は必ずプレビューで確認してから本番印刷に切り替えること。PrintOutは実行すると即印刷されるため、設定ミスに気づかないまま大量印刷してしまうリスクがある。

印刷設定の一括変更は、一度マクロにしてしまえば毎月の作業が劇的に楽になる。自分の場合、12シートの印刷設定を手作業でやっていたときは15分くらいかかっていたが、マクロにしてからは3秒で終わるようになった。設定漏れでやり直す手間もなくなったし、新しいシートを追加してもマクロのシート名配列に1行追加するだけ。「毎月やる印刷作業」がある人にはぜひ試してほしい。画面表示での見出し行の固定はウィンドウ枠の固定(記事071)、印刷ではなくPDF保存したい場合はExcelファイルをPDFに一括変換する方法を参照。

関連記事

次にやりたくなること

もっとカスタマイズしたい場合

「部署ごとに印刷設定を変えたい」「印刷後にPDF保存もしたい」「特定のセル値に応じて印刷範囲を動的に変えたい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できる。

相談時に伝えると話が早い情報:

  • Excel のバージョン / OS
  • シート数と印刷対象のルール
  • 用紙サイズ・余白・ヘッダーの要件
  • 印刷頻度と1回あたりの枚数

コメント

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