VBAで印刷範囲を自動設定する方法|PageSetup・PaperSize・余白・PrintTitleRowsまとめて設定

VBAで印刷範囲を自動設定するには、最終行・最終列を取得して PageSetup.PrintArea に代入するだけです。データ量が毎回変わる帳票や報告書でも、常に正確な範囲を1クリックで設定できます。

この記事では、次の内容を順番に解説します。

  • データ範囲を自動検出して印刷範囲を設定する基本コード
  • 全シートを一括で設定する方法
  • 印刷範囲の設定と同時に用紙・余白・ヘッダーも設定する方法
  • 印刷まで一気に実行するマクロ

印刷範囲を自動で設定するには?

A列の最終行と1行目の最終列を取得し、A1からそのセルまでの範囲を PrintArea に設定します。データが増えても減っても、常に実際のデータ範囲だけを印刷範囲にできます。

Sub SetPrintArea()

    Dim ws      As Worksheet
    Dim lastRow As Long
    Dim lastCol As Long

    Set ws = ActiveSheet

    'A列の最終行を取得
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    '1行目の最終列を取得
    lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column

    '印刷範囲を設定
    ws.PageSetup.PrintArea = ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastCol)).Address

    MsgBox "印刷範囲を設定しました:" & ws.PageSetup.PrintArea

End Sub

PrintArea に設定する値は "$A$1:$E$20" のようなアドレス文字列です。.Address を使うことでRangeオブジェクトを自動的にアドレス文字列に変換できます。

コードの要素役割
Cells(Rows.Count, 1).End(xlUp).RowA列の最終データ行を取得する
Cells(1, Columns.Count).End(xlToLeft).Column1行目の最終データ列を取得する
PageSetup.PrintArea印刷範囲をアドレス文字列で設定する

全シートの印刷範囲を一括設定するには?

複数のシートがある場合は、For Each でループして全シートに一括設定できます。

Sub SetPrintAreaAllSheets()

    Dim ws      As Worksheet
    Dim lastRow As Long
    Dim lastCol As Long

    For Each ws In ThisWorkbook.Worksheets

        lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
        lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column

        '空シートはスキップ
        If lastRow = 1 And ws.Cells(1, 1).Value = "" Then GoTo NextSheet

        ws.PageSetup.PrintArea = _
            ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastCol)).Address

NextSheet:
    Next ws

    MsgBox "全シートの印刷範囲を設定しました。"

End Sub

用紙・余白・ヘッダーも同時に設定するには?

印刷範囲の設定と合わせて、用紙サイズ・向き・余白・ページ番号などもマクロで設定しておくと、毎回の印刷設定作業をまとめて自動化できます。

Sub SetPrintSettings()

    Dim ws      As Worksheet
    Dim lastRow As Long
    Dim lastCol As Long

    Set ws = ActiveSheet

    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column

    With ws.PageSetup

        '印刷範囲
        .PrintArea = ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastCol)).Address

        '用紙サイズ(A4)と向き(縦)
        .PaperSize  = xlPaperA4
        .Orientation = xlPortrait

        '余白(センチ単位をポイントに変換)
        .TopMargin    = Application.CentimetersToPoints(2)
        .BottomMargin = Application.CentimetersToPoints(2)
        .LeftMargin   = Application.CentimetersToPoints(2)
        .RightMargin  = Application.CentimetersToPoints(2)

        '1ページに収める
        .FitToPagesWide = 1
        .FitToPagesTall = False

        'フッターにページ番号
        .CenterFooter = "&P / &N"

        '見出し行を繰り返す(毎ページ1行目を印刷)
        .PrintTitleRows = "$1:$1"

    End With

    MsgBox "印刷設定を完了しました。"

End Sub

よく使う印刷設定のプロパティをまとめます。

プロパティ内容よく使う値
PaperSize用紙サイズxlPaperA4xlPaperA3
Orientation用紙の向きxlPortrait(縦)・xlLandscape(横)
FitToPagesWide横方向のページ数1 で1ページ幅に収める
PrintTitleRows各ページに繰り返す行"$1:$1" で1行目を毎ページ印刷
CenterFooterフッター中央の文字"&P / &N" でページ番号/総ページ数

印刷まで一気に実行するには?

印刷範囲を設定してそのまま印刷まで行う場合は、PrintOut メソッドを使います。確認ダイアログを出してから印刷するパターンが実務では安全です。

Sub SetAndPrint()

    Dim ws      As Worksheet
    Dim lastRow As Long
    Dim lastCol As Long
    Dim answer  As Integer

    Set ws = ActiveSheet

    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column

    ws.PageSetup.PrintArea = _
        ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastCol)).Address

    '印刷前に確認
    answer = MsgBox("印刷を実行しますか?" & vbCrLf & _
                    "範囲:" & ws.PageSetup.PrintArea, _
                    vbYesNo + vbQuestion)

    If answer = vbYes Then
        ws.PrintOut
        MsgBox "印刷を実行しました。"
    Else
        MsgBox "印刷をキャンセルしました。"
    End If

End Sub

まとめ

  • 最終行・列を取得して PageSetup.PrintArea に代入するのが印刷範囲自動設定の基本
  • For Each ws In Worksheets でループすると全シートを一括設定できる
  • PageSetup の各プロパティを使えば用紙サイズ・向き・余白・見出し行繰り返しもまとめて設定できる
  • FitToPagesWide = 1 でデータ量にかかわらず横1ページに収められる
  • PrintOut と確認ダイアログを組み合わせると、設定から印刷まで安全に自動化できる

よくある質問

印刷範囲を解除するにはどうすればいいですか?

ws.PageSetup.PrintArea = "" で印刷範囲の設定を解除できます。解除すると、シート全体が印刷対象になります。

複数の離れた範囲を印刷範囲に設定できますか?

できます。PrintArea にカンマ区切りで複数の範囲を設定します。例:ws.PageSetup.PrintArea = "$A$1:$D$10,$A$15:$D$20" のように書くと2か所をまとめて印刷範囲にできます。

CentimetersToPointsとは何ですか?

VBAの余白設定はポイント単位で行いますが、センチメートルで指定したいときに使う変換関数です。Application.CentimetersToPoints(2) で2センチをポイントに変換します。インチで指定したい場合は InchesToPoints を使います。

PageSetupの処理が遅いです

PageSetupのプロパティを変更するたびにExcelが内部処理を行うため、設定項目が多いと時間がかかります。With ws.PageSetup ブロックでまとめて設定することで、多少改善できます。また Application.PrintCommunication = False を事前に入れると大幅に速くなることがあります(設定後は必ず True に戻してください)。

プレビューを表示してから印刷したいです

ws.PrintPreview で印刷プレビューを開けます。プレビューから印刷ボタンを押すことで、ユーザーが最終確認してから印刷できる流れになります。


動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール