TL;DR —
Worksheet.PageSetupはページを定義します。何を入れるか(PrintArea)、どちらを向くか(Orientation)、どう拡大縮小するか(ZoomまたはFitToPagesWide/FitToPagesTall)、余白、繰り返すタイトル行、そしてヘッダーとフッターです。PrintOut も PDF 保存 もこのページを描き出すので、レイアウトの問題を直すのはここです。誰もがつまずくルールは一つ。1 ページに収める設定は、.Zoom = Falseにしたあとでしか効きません。
Sub SetUpReportPage()
With Worksheets("Report").PageSetup
.PrintArea = "$A$1:$H$60"
.Orientation = xlLandscape
.Zoom = False ' 必須。これがないと下の 2 行は無視される
.FitToPagesWide = 1
.FitToPagesTall = False ' 縦はデータに必要なだけのページ数
.PrintTitleRows = "$1:$2"
End With
End Sub
これは、Excel から出力を取り出すための三部作の土台となる記事です。この記事で扱う PageSetup が、ページとは何かを決めます。PrintOut はそのページをプリンターへ送り、
ExportAsFixedFormat は同じページを PDF へ送ります。出力の命令はどちらも一行で済みます。本当の仕事はページのほうにあります。印刷結果や PDF がおかしく見えるとき、直す場所はほぼ例外なくここであって、それを出力した命令ではありません。
この記事で学べること
- なぜページの定義が紙と PDF の両方を支配するのか
- 印刷範囲の設定とクリア(
Rangeから設定する方法を含む) - 印刷の向き、用紙サイズ、ページ中央への配置
- 拡大縮小:
Zoomか、ページ数に合わせるか、そして両者をつなぐルール - タイトル行の繰り返しと、ページ番号入りのヘッダー・フッター
- インチやセンチメートルでの余白指定
PrintCommunicationでページ設定を速くする方法
考え方の軸:ページこそが成果物
Excel が印刷や書き出しをするとき、表を印刷しているのではありません — シートをページに切り分け、そのページを出力しています。PageSetup は、その切り分け方のすべてのルールを持っています。含める範囲、用紙、向き、倍率、余白、そして各ページで繰り返すもの。PrintOut と
ExportAsFixedFormat は、その結果の届け先が二つあるというだけです。ですから、ページ設定を成果物、出力の命令を配送と考えましょう。ページを明示的に設定するレポートマクロは、どのパソコンでも同じ結果を出します。前回残された設定に頼るマクロは、そうはいきません。
印刷範囲
PrintArea は A1 形式のアドレスを入れた 文字列 であって、Range ではありません。範囲から設定するには、その範囲の Address を渡します。
Dim ws As Worksheet
Set ws = Worksheets("Report")
ws.PageSetup.PrintArea = ws.Range("A1").CurrentRegion.Address ' データのブロック
ws.PageSetup.PrintArea = "" ' クリアする:すべてを印刷
CurrentRegion や 最終行 から設定すれば、今月の行数がいくつであっても、レポートはちょうどそのデータだけを印刷します。空文字列でクリアすることも同じくらい大切です。以前の実行で残された印刷範囲は、次のレポートを黙って途中で切ってしまいます。
印刷の向き、用紙サイズ、ページ中央
With ws.PageSetup
.Orientation = xlLandscape ' または xlPortrait
.PaperSize = xlPaperA4 ' または xlPaperLetter
.CenterHorizontally = True
End With
PaperSize はプリンタードライバーが対応しているものに左右されます。プリンターにないサイズを指定するとエラーになります。ヨーロッパと米国の両方に出ていくブックなら、決め打ちせずに意図して設定しましょう。
拡大縮小:Zoom か、ページ数に合わせるか
拡大縮小の方法は二つあり、互いに排他的です。Zoom は 10 から 400 までのパーセントです。FitToPagesWide と
FitToPagesTall は、指定したページ数に収まるよう Excel に倍率を選ばせます。Excel がページ数に合わせる設定を使うのは、Zoom が False のときだけです — Zoom に数値が入っている間は、黙って無視されます。「1 ページに収める」マクロの多くが何もしないのは、これが理由です。
With ws.PageSetup
.Zoom = False
.FitToPagesWide = 1 ' すべての列を横 1 ページに
.FitToPagesTall = False ' 行は必要なだけのページに流す
End With
FitToPagesWide = 1 と FitToPagesTall = False の組み合わせは、ほとんどのレポートが求める設定です。列は決して分けず、行は流れるままにします。両方を 1 にするとすべてが一枚に押し込まれます。集計表ならそれでかまいませんが、長い一覧では読めなくなります。
タイトル行、ヘッダーとフッター
PrintTitleRows は、見出しの行を各ページの上端で繰り返します。引数は行のアドレスを表す文字列です。ヘッダーとフッターはコードを含んだテキストを受け取ります。&P はページ番号、&N は総ページ数、&D は日付、&A はシート名です。
With ws.PageSetup
.PrintTitleRows = "$1:$2"
.CenterFooter = "&P / &N ページ"
.RightHeader = "&A - 印刷日 &D"
End With
& はコードの始まりを表すので、ヘッダーのテキストに文字としてのアンパサンドを入れるには二つ重ねます。
"R&&D 部門レポート" は R&D 部門レポート と印刷されます。
インチやセンチメートルでの余白
余白の単位はインチではなく ポイント です。Application.InchesToPoints や
Application.CentimetersToPoints で換算します。
With ws.PageSetup
.LeftMargin = Application.CentimetersToPoints(1.5)
.RightMargin = Application.CentimetersToPoints(1.5)
.TopMargin = Application.InchesToPoints(0.75)
End With
.LeftMargin = 1 と書くと、余白は 1 ポイント — 約 0.35 ミリメートル — になります。印刷結果が突然紙の端まではみ出すよくある原因がこれです。
PrintCommunication でページ設定を速くする
PageSetup への代入は一つひとつがプリンタードライバーとやり取りするので、十個の設定のまとまりに数秒かかることもあり、多くのシートをループすればさらにかかります。設定している間はそのやり取りを止め、終わったら再開しましょう。
Application.PrintCommunication = False
With ws.PageSetup
.Orientation = xlLandscape
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = False
End With
Application.PrintCommunication = True ' まとめた設定をここで適用する
必ず元に戻してください — 設定が確定するのは True に戻したときだけです。ScreenUpdating
にも同じ考え方が当てはまります。マクロの実行中は、必要のない仕事を Excel にさせないことです。
ExcelMaster の活用
ページ設定は、レポートマクロが人知れず失敗する場所です。ページ数に合わせる設定を黙って無効にする Zoom、センチメートルのつもりがポイントで指定された余白、先月から残っている印刷範囲、アンパサンドが消えてしまうフッター。どれもエラーにはなりません — 紙でも PDF でも、レポートがただおかしな形で出てくるだけです。
ExcelMaster には、ページの姿をそのまま伝えられます — 「A4 横、横 1 ページに収めて、先頭 2 行を繰り返し、フッターにページ番号」 — すると、Zoom のルール、単位の換算、高速化までを押さえた完全な PageSetup のブロックを書き、ページをプレビューしてくれるので、何かを印刷したり書き出したりする前にレイアウトを確かめられます。
よくある質問
VBA で印刷範囲を設定するには?
PageSetup.PrintArea にアドレスの文字列を代入します。たとえば Worksheets("Report").PageSetup.PrintArea = "$A$1:$H$60" です。範囲を使うなら、その Address を渡します。.PrintArea = Range("A1").CurrentRegion.Address
です。"" を設定すると印刷範囲がクリアされ、シート全体が印刷されます。
FitToPagesWide が効かないのはなぜですか?
Zoom にまだパーセントが入っているからです。Excel は PageSetup.Zoom = False でない限り、FitToPagesWide
と FitToPagesTall を無視します。先に Zoom を False にしてから、ページ数に合わせる設定をします。典型的には FitToPagesWide = 1 と FitToPagesTall = False です。
VBA で印刷の向きを横にするには?
Worksheets("Report").PageSetup.Orientation = xlLandscape を使います。縦に戻すには xlPortrait です。この設定は印刷にも PDF の書き出しにも効きます。どちらもシートのページ設定を描き出すからです。
見出しの行をすべての印刷ページで繰り返すには?
PageSetup.PrintTitleRows に行のアドレスの文字列を設定します。たとえば "$1:$2" で 1 行目と 2 行目が繰り返されます。各ページの左側で列を繰り返すなら、"$A:$A" のような列のアドレスを PrintTitleColumns に設定します。
PageSetup のマクロがこんなに遅いのはなぜですか?
PageSetup のプロパティは一つひとつがプリンタードライバーとやり取りするからです。設定を
Application.PrintCommunication = False と Application.PrintCommunication = True で挟めば、Excel はそれらを一度にまとめて適用します。True に戻すのを忘れないでください。戻さないと設定が確定しません。
検証環境
検証環境: Excel 365 (Windows 11)、VBA 7.1 — 最終確認 2026-09-29。
関連ガイド: VBA Save as PDF · VBA PrintOut · VBA CurrentRegion · VBA Last Row · VBA Used Range · VBA ScreenUpdating · VBA Workbook BeforePrint
