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).Row | A列の最終データ行を取得する |
Cells(1, Columns.Count).End(xlToLeft).Column | 1行目の最終データ列を取得する |
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 | 用紙サイズ | xlPaperA4・xlPaperA3 |
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が初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



