Excel のブックが 10 枚、20 枚と増えてくると、印刷設定がシートごとにバラバラになりがちです。印刷直前に気づいて慌てて各シートを開いて「用紙サイズ」「向き」「余白」を 1 枚ずつ直す — よくある残業パターンです。
この記事では、ブック内の全シートの印刷設定を 1 クリックで A4 横・余白統一に揃える VBA マクロを紹介します。コピペでそのまま使えるコードに加えて、グラフシートでの挙動差、「横 1 ページに収まらない」ときの典型的な落とし穴まで、Windows 11 + Excel 2024 で実機検証した内容をまとめています。
この記事で使うマクロ入りブック(7 シート + グラフシート、各シートで印刷設定がバラバラな状態)をダウンロードできます。そのままマクロを実行して動作を確認できます。

マクロの完成コード(コピペで使えます)
まず完成形を示します。新しい標準モジュールに下のコードを貼り付けて 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で、グラフシートに無効な設定(Zoom、FitToPages)を分岐しているOn Error GoTo CleanUpで、途中でエラーになってもScreenUpdatingを必ず元に戻している
マクロの実行手順
上のコードをブックに組み込んで動かすまでの手順を示します。ダウンロードしたサンプルファイルではすでに組み込み済みなので、手順 3 から進めてください。
手順 1: Visual Basic Editor を開く
Excel でブックを開いた状態で Alt + F11 を押すと、VBE(Visual Basic Editor)が別ウィンドウで開きます。開発タブが表示されている場合は「開発 → Visual Basic」ボタンからでも同じです。
手順 2: 標準モジュールを追加してコードを貼り付ける
VBE のメニューから「挿入 → 標準モジュール」を選び、追加された Module1(名前は任意)に上の完成コードをそのまま貼り付けます。

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

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

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


残りの 6 枚のワークシートとグラフシートも、すべて同じ設定に揃います。マクロ実行後にシートタブを切り替えて確認してみてください。
コードの解説:PageSetup プロパティ早見表
ページ設定ダイアログのどの項目が、VBA のどのプロパティに対応するのかを一覧にしました。用途に合わせて書き換える際の参考にしてください。

| VBA プロパティ | 対応するダイアログ項目 | 指定例 |
|---|---|---|
PaperSize | 用紙サイズ | xlPaperA4(A4)/xlPaperA3(A3)/xlPaperB5(B5)/xlPaperLetter(レター) |
Orientation | 印刷の向き | xlPortrait(縦)/xlLandscape(横) |
TopMarginBottomMarginLeftMarginRightMargin | 余白(上・下・左・右) | Application.CentimetersToPoints(1.5) のようにセンチで指定してポイントに変換する |
HeaderMarginFooterMargin | ヘッダー/フッターまでの余白 | 同上。一般的に 0.8cm 前後 |
CenterHorizontallyCenterVertically | ページの中央(水平/垂直) | True で中央揃え※グラフシートでは無視される |
FitToPagesWideFitToPagesTall | 次のページ数に合わせて印刷(横/縦) | 1(1 ページに収める)/False(枚数を制限しない)※ Zoom = False とセットで使う |
Zoom | 拡大/縮小(%) | 100(100%)/False(拡大縮小をやめて FitToPages を有効化) |
PrintArea | 印刷範囲 | "A1:G30" のように文字列で指定※グラフシートでは設定エラーになる |
グラフシートでは「無視される設定」と「エラーになる設定」がある
ThisWorkbook.Sheets はワークシートとグラフシートの両方を返します。グラフシートに対して一部のプロパティを設定すると、次のように挙動が分かれます(Excel 2024 で実機確認済み)。
| プロパティ | ワークシート | グラフシート |
|---|---|---|
PaperSize、Orientation、各種 Margin | OK | OK |
CenterHorizontally、CenterVertically | OK | エラーは出ないが無視される(設定しても False のまま) |
FitToPagesWide、FitToPagesTall、Zoom | OK | 実行時エラー(「プロパティを設定できません」) |
PrintArea | OK | 実行時エラー |
このため、ワークシートとグラフシートを同じループで処理するときは、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 = False と Zoom = False の 2 行がポイントです。
With sh.PageSetup
.FitToPagesWide = 1 ' 横は 1 ページに収める
.FitToPagesTall = False ' 縦の枚数は制限しない
.Zoom = False ' これを入れないと Fit が効かない
End With選択したシートだけに適用する版
「Ctrl + クリック」で複数シートを選んだ状態で実行すると、その選択範囲だけに適用されます。ThisWorkbook.Sheets を ActiveWindow.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 プロパティを設定できません」と出る
グラフシートに対して Zoom、FitToPagesWide、FitToPagesTall、PrintArea を設定しようとすると発生します。本記事のコードのように 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 CleanUpでScreenUpdatingを必ず元に戻すPrintCommunicationによる高速化は環境依存で壊れることがあるので、標準版をベースに必要なときだけ試す
サンプルブックには、ここまで紹介したマクロがすでに組み込まれています。ダウンロード後、マクロを有効にして Alt + F8 → SetupAllSheetsPrint → 実行、で動作を確認できます。余白値や用紙サイズを自分の業務に合わせて書き換えれば、そのまま実務に組み込めます。
全シートを対象にする VBA パターンに興味があれば、【Excel VBA】全ワークシートを個別のブックファイルに分割保存するマクロも併せてご覧ください。同じ For Each のループ構造で、ブックを増やす方向の活用例です。印刷まわりでは、Excel ワークシートを 1 枚の用紙に印刷する最適化マクロで、シート単位での「とにかく 1 ページに収める」系の応用コードも紹介しています。
コメント