Article

【Excel VBA】全シートの印刷設定(用紙サイズ・向き・余白)を一括変更するマクロ

この記事で分かること

全シートの印刷設定(用紙サイズ・向き・余白)をVBAで一括変更するマクロを、グラフシート分岐やFitToPages+Zoomの罠まで実機検証つきで解説します。

Excel のブックが 10 枚、20 枚と増えてくると、印刷設定がシートごとにバラバラになりがちです。印刷直前に気づいて慌てて各シートを開いて「用紙サイズ」「向き」「余白」を 1 枚ずつ直す — よくある残業パターンです。

この記事では、ブック内の全シートの印刷設定を 1 クリックで A4 横・余白統一に揃える VBA マクロを紹介します。コピペでそのまま使えるコードに加えて、グラフシートでの挙動差、「横 1 ページに収まらない」ときの典型的な落とし穴まで、Windows 11 + Excel 2024 で実機検証した内容をまとめています。

この記事で使うマクロ入りブック(7 シート + グラフシート、各シートで印刷設定がバラバラな状態)をダウンロードできます。そのままマクロを実行して動作を確認できます。

サンプルブックを開いた状態。下部のシートタブに売上日報・在庫一覧・請求書・顧客台帳・経費精算・出荷履歴・商品マスタ・売上推移グラフの 8 枚が並んでいる
サンプルブックの構成。7 枚のワークシートと 1 枚のグラフシート、合計 8 シートの印刷設定を 1 つのマクロで揃えます

マクロの完成コード(コピペで使えます)

まず完成形を示します。新しい標準モジュールに下のコードを貼り付けて F5 で実行するだけです。A4 横・上下余白 1.5cm・左右余白 1.8cm・横 1 ページに収めて中央揃えで印刷されるよう、ブック内の全シートを更新します。

Option Explicit

' 全シートの印刷設定を一括変更するマクロ
' A4 横・上下余白 1.5cm・左右余白 1.8cm・横1ページに収める・中央揃え
Public Sub SetupAllSheetsPrint()
    Dim sh As Object
    Dim origScreenUpdate As Boolean

    origScreenUpdate = Application.ScreenUpdating
    Application.ScreenUpdating = False

    On Error GoTo CleanUp

    For Each sh In ThisWorkbook.Sheets
        With sh.PageSetup
            .PaperSize = xlPaperA4
            .Orientation = xlLandscape
            .TopMargin = Application.CentimetersToPoints(1.5)
            .BottomMargin = Application.CentimetersToPoints(1.5)
            .LeftMargin = Application.CentimetersToPoints(1.8)
            .RightMargin = Application.CentimetersToPoints(1.8)
            .HeaderMargin = Application.CentimetersToPoints(0.8)
            .FooterMargin = Application.CentimetersToPoints(0.8)
        End With

        ' ワークシートだけに適用する設定
        ' (グラフシートだと Zoom や FitToPages がエラーになるため分岐)
        If sh.Type = xlWorksheet Then
            With sh.PageSetup
                .CenterHorizontally = True
                .FitToPagesWide = 1
                .FitToPagesTall = False
                .Zoom = False        ' FitToPages を有効化するため必須
            End With
        End If
    Next sh

    MsgBox "全 " & ThisWorkbook.Sheets.Count & " シートの印刷設定を変更しました。", vbInformation

CleanUp:
    Application.ScreenUpdating = origScreenUpdate
    If Err.Number <> 0 Then
        MsgBox "印刷設定の適用中にエラーが発生しました。" & vbCrLf & _
               "エラー " & Err.Number & ": " & Err.Description, vbExclamation
    End If
End Sub

コードのポイントは 3 つです。

  • For Each sh In ThisWorkbook.Sheets でワークシートとグラフシートの両方を対象にしている
  • If sh.Type = xlWorksheet Then で、グラフシートに無効な設定(ZoomFitToPages)を分岐している
  • On Error GoTo CleanUp で、途中でエラーになっても ScreenUpdating を必ず元に戻している

マクロの実行手順

上のコードをブックに組み込んで動かすまでの手順を示します。ダウンロードしたサンプルファイルではすでに組み込み済みなので、手順 3 から進めてください。

手順 1: Visual Basic Editor を開く

Excel でブックを開いた状態で Alt + F11 を押すと、VBE(Visual Basic Editor)が別ウィンドウで開きます。開発タブが表示されている場合は「開発 → Visual Basic」ボタンからでも同じです。

手順 2: 標準モジュールを追加してコードを貼り付ける

VBE のメニューから「挿入 → 標準モジュール」を選び、追加された Module1(名前は任意)に上の完成コードをそのまま貼り付けます。

VBE(Visual Basic Editor)のコードウィンドウ。標準モジュール M32438 にマクロがすべて貼り付けられている状態
標準モジュールに完成コードを貼り付けた状態。モジュール名は何でも構いません

手順 3: マクロを実行する

Excel 本体に戻り(Alt + F11 で切り替えられます)、Alt + F8 を押すと「マクロ」ダイアログが開きます。SetupAllSheetsPrint を選択して「実行」をクリックしてください。

Excel のマクロダイアログ。マクロ名一覧に SetupAllSheetsPrint が選択された状態で表示されている
「マクロ」ダイアログで SetupAllSheetsPrint を選び、「実行」ボタンをクリック

完了すると、処理件数を示すメッセージボックスが表示されます。

「全 8 シートの印刷設定を変更しました。」という完了を知らせるメッセージボックス
完了を知らせるメッセージ。ここで件数が想定通りになっているか確認できます

実行前と実行後の違い(ページレイアウトで確認)

「表示 → ページレイアウト」でマクロ実行前後を比べると、効果が一目で分かります。次の 2 枚は同じ「売上日報」シートです。

マクロ実行前のページレイアウトビュー。A4 縦向きで余白が広く、データが左寄せで表示されている
実行前:A4 縦・余白 2.5cm・左寄せ。右側に大きな余白が出てしまっています
マクロ実行後のページレイアウトビュー。A4 横向きに切り替わり、データがページ中央に配置されている
実行後:A4 横・余白 1.5cm / 1.8cm・中央揃え。横 1 ページにきれいに収まっています

残りの 6 枚のワークシートとグラフシートも、すべて同じ設定に揃います。マクロ実行後にシートタブを切り替えて確認してみてください。

コードの解説:PageSetup プロパティ早見表

ページ設定ダイアログのどの項目が、VBA のどのプロパティに対応するのかを一覧にしました。用途に合わせて書き換える際の参考にしてください。

Excel のページ設定ダイアログ。「ページ」「余白」「ヘッダー/フッター」「シート」の 4 タブが並び、印刷の向き、拡大/縮小、用紙サイズの設定項目が表示されている
Excel の「ページ設定」ダイアログ(ページタブ)。各項目が VBA のプロパティに対応しています
VBA プロパティ対応するダイアログ項目指定例
PaperSize用紙サイズxlPaperA4(A4)/xlPaperA3(A3)/xlPaperB5(B5)/xlPaperLetter(レター)
Orientation印刷の向きxlPortrait(縦)/xlLandscape(横)
TopMargin
BottomMargin
LeftMargin
RightMargin
余白(上・下・左・右)Application.CentimetersToPoints(1.5) のようにセンチで指定してポイントに変換する
HeaderMargin
FooterMargin
ヘッダー/フッターまでの余白同上。一般的に 0.8cm 前後
CenterHorizontally
CenterVertically
ページの中央(水平/垂直)True で中央揃え
※グラフシートでは無視される
FitToPagesWide
FitToPagesTall
次のページ数に合わせて印刷(横/縦)1(1 ページに収める)/False(枚数を制限しない)
Zoom = False とセットで使う
Zoom拡大/縮小(%)100(100%)/False(拡大縮小をやめて FitToPages を有効化)
PrintArea印刷範囲"A1:G30" のように文字列で指定
※グラフシートでは設定エラーになる

グラフシートでは「無視される設定」と「エラーになる設定」がある

ThisWorkbook.Sheets はワークシートとグラフシートの両方を返します。グラフシートに対して一部のプロパティを設定すると、次のように挙動が分かれます(Excel 2024 で実機確認済み)。

プロパティワークシートグラフシート
PaperSizeOrientation、各種 MarginOKOK
CenterHorizontallyCenterVerticallyOKエラーは出ないが無視される(設定しても False のまま)
FitToPagesWideFitToPagesTallZoomOK実行時エラー(「プロパティを設定できません」)
PrintAreaOK実行時エラー

このため、ワークシートとグラフシートを同じループで処理するときは、If sh.Type = xlWorksheet Then で分岐しておくのが安全です。分岐しないと、グラフシートを含むブックでマクロがエラー終了します。

応用パターン:よく使う書き換え例

A3 横・余白広めに変える版

プレゼン資料のような大判印刷に合わせる場合は、用紙サイズと余白を書き換えます。

With sh.PageSetup
    .PaperSize = xlPaperA3
    .Orientation = xlLandscape
    .TopMargin = Application.CentimetersToPoints(2.5)
    .BottomMargin = Application.CentimetersToPoints(2.5)
    .LeftMargin = Application.CentimetersToPoints(2.5)
    .RightMargin = Application.CentimetersToPoints(2.5)
End With

横幅だけ 1 ページに収める(縦は何ページでも OK)版

縦に長い明細表で「横は 1 ページ、縦は必要なだけ」という定番パターンです。FitToPagesTall = FalseZoom = False の 2 行がポイントです。

With sh.PageSetup
    .FitToPagesWide = 1       ' 横は 1 ページに収める
    .FitToPagesTall = False   ' 縦の枚数は制限しない
    .Zoom = False             ' これを入れないと Fit が効かない
End With

選択したシートだけに適用する版

「Ctrl + クリック」で複数シートを選んだ状態で実行すると、その選択範囲だけに適用されます。ThisWorkbook.SheetsActiveWindow.SelectedSheets に変えるだけです。

For Each sh In ActiveWindow.SelectedSheets
    ' ここは元のコードと同じ
Next sh

ヘッダーとフッターも一緒に設定する版

会社名や日付、ページ番号を全シート共通で入れたい場合はヘッダー/フッターのプロパティを追加します。&P は現在のページ番号、&N は総ページ数、&D は現在日付を表す Excel のフィールドコードです。

With sh.PageSetup
    .LeftHeader = "株式会社ヘルパソ"
    .CenterHeader = ""
    .RightHeader = "&D"           ' 現在日付
    .LeftFooter = ""
    .CenterFooter = "&P / &N"     ' 「3 / 8」のようなページ番号
    .RightFooter = ""
End With

うまく動かないときの確認ポイント

「PageSetup クラスの Zoom プロパティを設定できません」と出る

グラフシートに対して ZoomFitToPagesWideFitToPagesTallPrintArea を設定しようとすると発生します。本記事のコードのように If sh.Type = xlWorksheet Then で囲んで、ワークシート限定にしてください。

横 1 ページに収まらない

FitToPagesWide = 1 だけを書いて Zoom = False を書き忘れると、「拡大/縮小」が 100% のままになるため Fit が働きません。FitToPages を効かせるには Zoom = False が必須です。

処理時間が気になる(シートが多く、実行に時間がかかる)

PageSetup プロパティは 1 つ代入するたびに印刷スプーラと通信する仕様のため、ブックに何十枚もシートがあると体感できる時間がかかります(手元の環境では 8 シートで約 11 秒)。表示の高速化として Application.ScreenUpdating = False は上のコードにすでに入っていますが、それでも足りない場合は次項の PrintCommunication を参考にしてください。ただし副作用があるため、あくまで任意の最適化です。

「メソッド ‘PageSetup’ は失敗しました」と出る

既定のプリンタが設定されていない、またはプリンタドライバが壊れている環境で起こりやすいエラーです。物理プリンタが無くても、Windows 標準の「Microsoft Print to PDF」や「Microsoft XPS Document Writer」が既定プリンタになっていれば動きます。「設定 → Bluetooth とデバイス → プリンターとスキャナー」から既定プリンタを確認してください。

【参考・任意】Application.PrintCommunication による最適化

Microsoft のドキュメントには、Application.PrintCommunication = False で印刷スプーラ通信を一時停止し、PageSetup の書き込みをまとめてから True に戻すと高速化できる、と記載があります。理論的にはシート数が多いほど効果が大きくなります。

ただし、Windows 11 + Excel 2024 の実機検証では、PrintCommunication = True で戻す段階で 1004 系エラーが発生し、バッファされていた PageSetup の書き込みがまとめて破棄される(つまり全ての設定変更が失われる)現象を再現しました。書き込み直後に readback すると、Orientation や余白が元のまま残ります。この副作用があるため、本記事の完成コードでは意図的に PrintCommunication を使っていません。

下のコードは「環境によっては動く」最適化版です。処理時間が気になるユーザーは、自分の環境で試した上で副作用が出ないことを確認してから採用してください。

' 【自己責任・任意】PrintCommunication で高速化を試みる版
' 環境によっては restore 時に 1004 エラーが発生し、全設定が失われることがある
Public Sub SetupAllSheetsPrint_Fast()
    Dim sh As Object
    Application.PrintCommunication = False
    Application.ScreenUpdating = False
    On Error GoTo CleanUp
    For Each sh In ThisWorkbook.Sheets
        With sh.PageSetup
            .PaperSize = xlPaperA4
            .Orientation = xlLandscape
            .TopMargin = Application.CentimetersToPoints(1.5)
            .BottomMargin = Application.CentimetersToPoints(1.5)
            .LeftMargin = Application.CentimetersToPoints(1.8)
            .RightMargin = Application.CentimetersToPoints(1.8)
        End With
        If sh.Type = xlWorksheet Then
            With sh.PageSetup
                .CenterHorizontally = True
                .FitToPagesWide = 1
                .FitToPagesTall = False
                .Zoom = False
            End With
        End If
    Next sh
CleanUp:
    ' 必ず True に戻す(戻し忘れると印刷系 UI が無反応になる)
    Application.PrintCommunication = True
    Application.ScreenUpdating = True
    If Err.Number <> 0 Then
        MsgBox "エラー " & Err.Number & ": " & Err.Description, vbExclamation
    End If
End Sub

もし最適化版を実行した結果、設定が反映されない・メッセージが出ずに終わる場合は、PrintCommunication の restore に失敗しています。その場合は本記事冒頭の標準版に戻して使ってください。また、念のため VBE の「イミディエイトウィンドウ」(Ctrl + G)で次の 1 行を実行しておくと、印刷系 UI が無反応のまま残る事故を防げます。

Application.PrintCommunication = True

まとめ:このマクロで押さえるべきポイント

  • 全シートを一括更新するには For Each sh In ThisWorkbook.Sheets のループで回す
  • 余白は CentimetersToPoints() でセンチ指定からポイントに変換する
  • グラフシート対策に If sh.Type = xlWorksheet Then で分岐する
  • FitToPages を効かせるには Zoom = False が必須(書き忘れ注意)
  • On Error GoTo CleanUpScreenUpdating を必ず元に戻す
  • PrintCommunication による高速化は環境依存で壊れることがあるので、標準版をベースに必要なときだけ試す

サンプルブックには、ここまで紹介したマクロがすでに組み込まれています。ダウンロード後、マクロを有効にして Alt + F8SetupAllSheetsPrint → 実行、で動作を確認できます。余白値や用紙サイズを自分の業務に合わせて書き換えれば、そのまま実務に組み込めます。

全シートを対象にする VBA パターンに興味があれば、【Excel VBA】全ワークシートを個別のブックファイルに分割保存するマクロも併せてご覧ください。同じ For Each のループ構造で、ブックを増やす方向の活用例です。印刷まわりでは、Excel ワークシートを 1 枚の用紙に印刷する最適化マクロで、シート単位での「とにかく 1 ページに収める」系の応用コードも紹介しています。

Next Read

このあと読む記事

今の内容に近い記事から、次の1本と補助記事を続けて見つけられるようにしています。

Keep Exploring

このテーマをさらに探す

同じテーマの入口記事と更新記事を、一覧の形でまとめています。

コメント