この記事でわかること
- 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)で保存する
- 「ファイル」→「名前を付けて保存」
- ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
- 保存
テスト時はプレビューで確認する
PrintOutは実行すると即印刷される。テスト段階では Preview:=True を付けてプレビュー確認すること。コード内にコメントで切り替え方法を記載している。
—
手順(コピペ → 実行まで約5分)
VBE(コードを書く画面)を開く
- Excelで
Alt + F11を押す
標準モジュールを挿入する
- VBEのメニュー →「挿入」→「標準モジュール」
コードを貼り付けて実行する
- コードウィンドウに、下のコードをそのままコピペする
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.PaperSize、ws.PageSetup.Orientation と書く手間を省くため。可読性も上がるし、内部的にもオブジェクト参照の回数が減るので効率的。
.Zoom = False と .FitToPagesWide = 1 の組み合わせは、「列が多い表を横方向だけ1ページに収める」ための定番設定。Zoom を False にしないと 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
コードの流れ
Application.PrintCommunication = Falseで PageSetup の高速化を開始- 全シートをループし、非表示シートをスキップしながら印刷設定を統一
Application.PrintCommunication = Trueで高速化を解除- 表示中のシート名を配列に格納し、まとめてプレビュー表示(または印刷)
高速化について: 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・ヘッダー日付 |
コードの流れ
- 印刷対象のシート名を配列で定義
- 各シート名について存在チェック+非表示チェック
- 対象シートの印刷設定を一括変更
- 存在しないシート・非表示シートはスキップしてログに記録
- 対象シートをまとめてプレビュー表示(または印刷)
- 結果メッセージで印刷シート数とスキップ情報を表示
この実務版の大きな特徴は、シートの存在チェックを On Error Resume Next で行っている点。Worksheets(CStr(sheetName)) で存在しないシート名を指定するとエラーになるが、On Error Resume Next でエラーを一時的に無視し、ws が Nothing かどうかで存在を判定している。このパターンは、シート名の配列に間違った名前が含まれていても処理が止まらないので実務向き。存在しないシートやスキップしたシートは 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に一括変換する方法を参照。
関連記事
- ExcelファイルをPDFに一括変換する方法 — 印刷ではなくPDF保存したい場合
- 複数シートを一括処理する方法 — シートのループ処理の基本
- 印刷時のヘッダー・フッターをVBAで一括設定する方法 — ヘッダー・フッターだけを一括設定
- 一覧表からExcelテンプレートに差し込み印刷する方法 — 一覧データをテンプレートに差し込んで印刷
- 画面更新・再計算を止めてマクロを高速化する方法 — PageSetup処理の高速化テクニック
次にやりたくなること
- 一覧表からExcelテンプレートに差し込み印刷する方法: 一覧データをテンプレートに差し込んで印刷したい場合
- ExcelファイルをPDFに一括変換する方法: 印刷の代わりにPDF保存で配布したい場合
- ウィンドウ枠の固定・解除を自動化する方法(記事071): 画面表示で見出し行を固定したい場合(印刷のタイトル行とは別の設定)
- 処理時間を計測する方法(記事118): PrintCommunicationの効果を数値で確認したい場合
—
もっとカスタマイズしたい場合
「部署ごとに印刷設定を変えたい」「印刷後にPDF保存もしたい」「特定のセル値に応じて印刷範囲を動的に変えたい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できる。
相談時に伝えると話が早い情報:
- Excel のバージョン / OS
- シート数と印刷対象のルール
- 用紙サイズ・余白・ヘッダーの要件
- 印刷頻度と1回あたりの枚数


コメント