VBAを使った印刷設定【 印刷の自動化で作業効率を格段に上げる方法 】

印刷したらA4用紙に収まりきらず、最後の行が見切れていた経験はありませんか?
こんな問題はVBAで解決することができます。
私も以前は、大量の書類を印刷するたびに「余白の調整」「用紙サイズの確認」「印刷範囲の設定」を1枚ずつ手動でやっていました。
10枚・20枚の書類があると、それだけで30分以上の時間がかかっていた。。。
VBAを使えば、こうした印刷設定の作業をすべてボタン1クリックで自動化することができます。
この記事では、VBAで印刷設定を自動化するために必要なPrintOutメソッドとPageSetupオブジェクトの基本的な使い方を、プログラミング初心者の方でもわかるように丁寧に解説します。
A4サイズにきれいに収まる書類を自動作成するサンプルコードも紹介しますので、ぜひ最後まで読んでみてください。
手作業の印刷設定が引き起こす3つの問題
毎回手動で印刷設定を調整していると、見えないところで大きなムダが積み重なっています。
VBAによる自動化の必要性を理解するために、まず手作業の印刷設定がどれだけ非効率かを整理しておきましょう。
問題①:印刷のたびにページ設定をやり直している
Excelで書類を作成するたびに「余白の設定」「用紙サイズの確認」「印刷の向き(縦・横)」を毎回手動で設定している方は多いはずです。
これはExcelが「前回の設定を引き継がないケース」があるためで、同じ作業を毎回繰り返すことになります。
1回の設定作業は2〜3分に見えても、毎日10回やれば20〜30分のムダになります。
VBAでPageSetupオブジェクトを使えば、余白・用紙サイズ・印刷の向きをすべてコードで固定化し、毎回自動で最適な状態に設定することができます。
問題②:1ページに収まらず見切れてしまう
「印刷してみたら最終行が見切れていた」「2ページ目に数行だけはみ出してしまった」という経験は、Excelユーザーならほぼ全員が経験していることではないでしょうか。
手動の場合、印刷プレビューを確認しながら列幅を縮めたりフォントサイズを調整したりと、試行錯誤の時間が必要です。
VBAのFitToPagesWide・FitToPagesTallプロパティを使えば「必ずA4用紙1枚に収める」という指定を自動で行うことができます。
問題③:印刷結果が書類ごとにバラバラで見栄えが悪い
複数の担当者が作成した書類を印刷すると、余白や余白のバランス、ヘッダー・フッターの有無などがバラバラになりがちです。
結果として、まとまりのない見栄えの悪い書類が出来上がってしまいます。
VBAで印刷設定を統一化すれば、誰が作成した書類でも同じフォーマットで印刷できる仕組みを作ることができます。
PageSetupオブジェクトの基本的な使い方
PageSetupオブジェクトとは、Excelの「ページ設定」ダイアログで設定できる内容をVBAで操作するためのオブジェクトです。
余白・用紙サイズ・印刷の向き・ヘッダー・フッターなど、印刷に関するあらゆる設定をコードで管理することができます。
用紙サイズと印刷の向きを設定する
まず最初に、用紙サイズと印刷の向き(縦・横)を設定する基本コードを見てみましょう。
Sub 印刷設定_用紙サイズと向き()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 用紙サイズをA4に設定
ws.PageSetup.PaperSize = xlPaperA4
' 印刷の向きを縦(ポートレート)に設定
ws.PageSetup.Orientation = xlPortrait
' 印刷の向きを横(ランドスケープ)に設定する場合
' ws.PageSetup.Orientation = xlLandscape
MsgBox "用紙サイズと印刷の向きを設定しました。", vbInformation
End Sub
コードの流れを解説します。
ws.PageSetup.PaperSize = xlPaperA4 で、対象シートの用紙サイズをA4に設定しています。
xlPaperA4はVBAに用意されている定数で、「A4サイズ」という意味です。
印刷の向きはxlPortrait(縦)とxlLandscape(横)の2種類があり、書類の内容に合わせて使い分けることができます。
余白を細かく設定する
書類の余白が大きすぎると印刷範囲が狭くなり、小さすぎると印刷物の見栄えが悪くなります。
PageSetupオブジェクトでは、上下左右の余白を個別に設定することが可能です。
Sub 印刷設定_余白の設定()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 余白の単位はポイント(1センチ = 約28.35ポイント)
' centimetersToPoints関数でセンチメートル指定が可能
' 上余白:2センチ
ws.PageSetup.TopMargin = Application.CentimetersToPoints(2)
' 下余白:2センチ
ws.PageSetup.BottomMargin = Application.CentimetersToPoints(2)
' 左余白:2.5センチ
ws.PageSetup.LeftMargin = Application.CentimetersToPoints(2.5)
' 右余白:2センチ
ws.PageSetup.RightMargin = Application.CentimetersToPoints(2)
' ヘッダー余白:1センチ
ws.PageSetup.HeaderMargin = Application.CentimetersToPoints(1)
' フッター余白:1センチ
ws.PageSetup.FooterMargin = Application.CentimetersToPoints(1)
MsgBox "余白の設定が完了しました。", vbInformation
End Sub
コードの流れを解説します。
余白の単位はポイントですが、Application.CentimetersToPoints()関数を使えばセンチメートル単位で指定できるため、直感的に設定しやすくなります。
TopMargin(上)・BottomMargin(下)・LeftMargin(左)・RightMargin(右)の4つの余白の他に、HeaderMarginとFooterMarginでヘッダー・フッターの余白も細かく設定できます。
印刷範囲をA4用紙1枚に自動調整する
データ量によって印刷ページ数が変わってしまう問題を解決するのが、FitToPagesWideとFitToPagesTallプロパティです。
「横1ページ・縦1ページに収める」と指定すると、ExcelがA4用紙1枚に収まるよう自動的に縮小して印刷してくれます。
Sub 印刷設定_A4用紙1枚に収める()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' Zoom(拡大縮小率)をFalseにしてFitToPages系を有効化
ws.PageSetup.Zoom = False
' 横方向:1ページに収める
ws.PageSetup.FitToPagesWide = 1
' 縦方向:1ページに収める(0にすると縦は自動)
ws.PageSetup.FitToPagesTall = 1
MsgBox "A4用紙1枚に収める設定が完了しました。", vbInformation
End Sub
コードの流れを解説します。
FitToPagesWideとFitToPagesTallを使うには、まず ws.PageSetup.Zoom = False で拡大縮小率の自動計算をオフにする必要があります。
これをFalseにしないとFitToPages系の設定が無効になってしまうため、必ずセットで書くようにしましょう。
FitToPagesTall = 0 にすると縦方向は自動計算されるため、横1ページに収めたいが縦は何ページになっても構わないという場合はこの設定が便利です。
PrintOutメソッドの基本的な使い方
PageSetupオブジェクトで印刷の見た目を整えたら、次はPrintOutメソッドで実際に印刷を実行します。
PrintOutメソッドには複数の引数があり、印刷部数・印刷先・印刷範囲などを細かく制御することが可能です。
基本的な印刷実行コード
最もシンプルなPrintOutメソッドの使い方から確認していきましょう。
Sub 印刷実行_基本()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 基本的な印刷実行(引数なし = デフォルト設定で印刷)
ws.PrintOut
MsgBox "印刷が完了しました。", vbInformation
End Sub
ws.PrintOut だけで、Sheet1の内容をデフォルトプリンターで1部印刷することができます。
引数を指定しない場合は、ページ全体・1部・デフォルトプリンター・印刷前確認なしという設定で印刷が実行されます。
印刷部数・印刷ページを指定して印刷する
実務では「1ページ目だけ3部印刷する」「2ページ目から最終ページまで印刷する」といった細かい指定が必要になることがあります。
Sub 印刷実行_詳細設定()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 引数を指定した印刷実行
ws.PrintOut _
From:=1, _ ' 印刷開始ページ(1ページ目から)
To:=2, _ ' 印刷終了ページ(2ページ目まで)
Copies:=3, _ ' 印刷部数(3部)
Preview:=False, _ ' 印刷前にプレビューを表示しない
Collate:=True ' 部単位で印刷する
MsgBox "1〜2ページを3部印刷しました。", vbInformation
End Sub
コードの流れを解説します。
From と To でページ範囲を指定し、Copies で印刷部数を設定しています。
Preview:=True にすると印刷前にプレビュー画面が表示されるため、内容を確認してから印刷したい場合に便利です。
Collate:=True は「部単位で印刷する」設定で、3部印刷する場合に「1・2・3ページ→1・2・3ページ→1・2・3ページ」という順番で印刷されます。
印刷前にプレビューで確認する方法
大量の書類を自動印刷する前に、必ずプレビューで確認することを習慣にしましょう。
PrintPreviewメソッドを使えば、印刷前に画面上で仕上がりを確認することができます。
Sub 印刷プレビュー確認()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 印刷プレビューを表示
ws.PrintPreview
' プレビューを閉じた後に印刷するか確認
Dim answer As Integer
answer = MsgBox("印刷を実行しますか?", vbYesNo, "印刷確認")
If answer = vbYes Then
ws.PrintOut
MsgBox "印刷が完了しました。", vbInformation
Else
MsgBox "印刷をキャンセルしました。", vbInformation
End If
End Sub
コードの流れを解説します。
ws.PrintPreview でプレビュー画面を開き、ユーザーが閉じたあとにMsgBoxで「印刷するか」を確認しています。
vbYesNo を使ったMsgBoxは「はい」「いいえ」の2択ダイアログを表示し、「はい(vbYes)」を選んだときだけ印刷が実行される仕組みです。
自動印刷マクロに安全装置として組み込んでおくと、誤って印刷が実行されるリスクを減らすことができます。
実践!A4サイズのキレイな書類を自動作成するVBA
ここからが本記事のメインパートです。
PageSetupオブジェクトとPrintOutメソッドを組み合わせ、A4用紙にきれいに収まる書類を自動で作成・印刷するマクロを紹介します。
実践コード①|A4縦1枚に自動調整して印刷するマクロ
最もよく使う、「A4縦1枚に収めてきれいに印刷する」マクロです。
私が実際に業務で使っているコードをベースに、初心者でも理解しやすいように整理しました。
Sub A4縦1枚自動印刷()
Dim ws As Worksheet
Set ws = ThisWorkbook.ActiveSheet ' アクティブシートを対象にする
'--- ページ設定 ---
' 用紙サイズをA4に設定
ws.PageSetup.PaperSize = xlPaperA4
' 印刷の向きを縦に設定
ws.PageSetup.Orientation = xlPortrait
' 余白の設定(上下:2cm、左:2.5cm、右:2cm)
ws.PageSetup.TopMargin = Application.CentimetersToPoints(2)
ws.PageSetup.BottomMargin = Application.CentimetersToPoints(2)
ws.PageSetup.LeftMargin = Application.CentimetersToPoints(2.5)
ws.PageSetup.RightMargin = Application.CentimetersToPoints(2)
ws.PageSetup.HeaderMargin = Application.CentimetersToPoints(1)
ws.PageSetup.FooterMargin = Application.CentimetersToPoints(1)
' A4縦1枚に収める(Zoomは必ずFalseにする)
ws.PageSetup.Zoom = False
ws.PageSetup.FitToPagesWide = 1
ws.PageSetup.FitToPagesTall = 1
' 印刷をページ中央に配置(水平・垂直ともに中央)
ws.PageSetup.CenterHorizontally = True
ws.PageSetup.CenterVertically = False ' 縦は上揃えのまま
' セルの枠線は印刷しない
ws.PageSetup.PrintGridlines = False
'--- 印刷実行 ---
' プレビュー確認してから印刷
Dim answer As Integer
answer = MsgBox("印刷プレビューを確認しますか?", vbYesNo, "印刷前確認")
If answer = vbYes Then
ws.PrintPreview
End If
' 印刷実行の最終確認
Dim finalAnswer As Integer
finalAnswer = MsgBox("印刷を実行します。よろしいですか?", vbYesNo, "印刷実行確認")
If finalAnswer = vbYes Then
ws.PrintOut Copies:=1, Preview:=False
MsgBox "印刷が完了しました!", vbInformation
Else
MsgBox "印刷をキャンセルしました。", vbInformation
End If
End Sub
コードの流れを解説します。
まずPageSetupで用紙サイズ・向き・余白・1枚収め設定・中央配置をまとめて設定しています。
CenterHorizontally = True で印刷内容を用紙の水平方向の中央に配置。
これを設定しておくと、データが少なくても用紙の左側に寄らず、見栄えの良い書類に仕上がります。
PrintGridlines = False でセルの枠線を非印刷にしているのは、グリッドがない方がビジネス書類として見栄えが良いためです(必要な場合はTrueに変更してください)。
最後に2段階の確認ダイアログを設けることで、誤って印刷が実行されるリスクを防いでいます。
実践コード②|複数シートを一括でA4印刷するマクロ
「複数のシートをすべて同じ設定でまとめて印刷したい」というケースにも対応したマクロです。
For Eachループを使って全シートを順番に処理し、同じ印刷設定を一括で適用します。
Sub 複数シート一括A4印刷()
Dim wb As Workbook
Set wb = ThisWorkbook
' 印刷対象シートのリスト(シート名を配列で指定)
Dim targetSheets As Variant
targetSheets = Array("1月", "2月", "3月")
' 各シートに同じ印刷設定を適用する
Dim sheetName As Variant
For Each sheetName In targetSheets
' シートが存在するか確認
Dim ws As Worksheet
On Error Resume Next
Set ws = wb.Worksheets(sheetName)
On Error GoTo 0
If Not ws Is Nothing Then
' ページ設定を適用
ws.PageSetup.PaperSize = xlPaperA4
ws.PageSetup.Orientation = xlPortrait
ws.PageSetup.TopMargin = Application.CentimetersToPoints(2)
ws.PageSetup.BottomMargin = Application.CentimetersToPoints(2)
ws.PageSetup.LeftMargin = Application.CentimetersToPoints(2.5)
ws.PageSetup.RightMargin = Application.CentimetersToPoints(2)
ws.PageSetup.Zoom = False
ws.PageSetup.FitToPagesWide = 1
ws.PageSetup.FitToPagesTall = 1
ws.PageSetup.CenterHorizontally = True
ws.PageSetup.PrintGridlines = False
Else
MsgBox sheetName & " シートが見つかりませんでした。", vbExclamation
End If
Set ws = Nothing ' wsをリセット
Next sheetName
' 設定完了後、一括印刷の確認
Dim answer As Integer
answer = MsgBox("3シートを一括印刷しますか?", vbYesNo, "一括印刷確認")
If answer = vbYes Then
Dim s As Variant
For Each s In targetSheets
On Error Resume Next
wb.Worksheets(s).PrintOut Copies:=1, Preview:=False
On Error GoTo 0
Next s
MsgBox "3シートの印刷が完了しました!", vbInformation
Else
MsgBox "印刷をキャンセルしました。", vbInformation
End If
End Sub
コードの流れを解説します。
targetSheets にシート名を配列で指定し、For Each ループで1シートずつ処理しています。
On Error Resume Next と If Not ws Is Nothing Then の組み合わせは「指定したシート名が存在しない場合のエラー防止」のための安全対策です。
シート名の配列を変更するだけで対象シートを自由に変えられるため、月次レポートや部門ごとのシートを一括印刷する業務に活用しやすいコードになっています。
実践コード③|ヘッダー・フッターを自動設定して印刷するマクロ
ビジネス書類では、ページ番号や作成日、会社名などをフッターに自動入力したいというニーズが多くあります。
PageSetupオブジェクトを使ってヘッダー・フッターをVBAで自動設定する方法を紹介します。
Sub ヘッダーフッター付き印刷()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
'--- ページ設定 ---
ws.PageSetup.PaperSize = xlPaperA4
ws.PageSetup.Orientation = xlPortrait
ws.PageSetup.TopMargin = Application.CentimetersToPoints(2.5) ' ヘッダーのスペースを確保
ws.PageSetup.BottomMargin = Application.CentimetersToPoints(2.5) ' フッターのスペースを確保
ws.PageSetup.LeftMargin = Application.CentimetersToPoints(2.5)
ws.PageSetup.RightMargin = Application.CentimetersToPoints(2)
ws.PageSetup.HeaderMargin = Application.CentimetersToPoints(1.2)
ws.PageSetup.FooterMargin = Application.CentimetersToPoints(1.2)
ws.PageSetup.Zoom = False
ws.PageSetup.FitToPagesWide = 1
ws.PageSetup.FitToPagesTall = 0 ' 縦は自動
'--- ヘッダーの設定 ---
' ヘッダーは左・中央・右の3つのゾーンに分かれている
ws.PageSetup.LeftHeader = "マメBlog 社内資料" ' 左ヘッダー
ws.PageSetup.CenterHeader = "月次売上レポート" ' 中央ヘッダー(タイトル)
ws.PageSetup.RightHeader = "作成日:" & Format(Now(), "yyyy年m月d日") ' 右ヘッダー(作成日自動入力)
'--- フッターの設定 ---
ws.PageSetup.LeftFooter = "社外秘" ' 左フッター
ws.PageSetup.CenterFooter = "&P / &N ページ" ' 中央フッター(ページ番号)
' &P = 現在のページ番号、&N = 総ページ数
ws.PageSetup.RightFooter = "" ' 右フッターは空欄
'--- 印刷実行 ---
Dim answer As Integer
answer = MsgBox("ヘッダー・フッター付きで印刷しますか?", vbYesNo, "印刷確認")
If answer = vbYes Then
ws.PrintOut Copies:=1, Preview:=False
MsgBox "印刷が完了しました!", vbInformation
Else
MsgBox "印刷をキャンセルしました。", vbInformation
End If
End Sub
コードの流れを解説します。
ヘッダーとフッターはそれぞれ左・中央・右の3ゾーンに設定できます。
RightHeader に Format(Now(), “yyyy年m月d日") を使うことで、マクロを実行した日の日付が自動的に右ヘッダーに入力されます。
フッターの &P は現在のページ番号、&N は総ページ数を意味する特殊コードです。
これにより「1 / 3 ページ」のように自動的にページ番号が印刷される仕組みになります。
VBAの印刷設定でつまずきやすい注意点
印刷設定のVBAを実装していると、いくつかのつまずきポイントがあります。
私が実際に経験したミスをもとに、事前に知っておきたい注意点を整理しました。
注意点①:ZoomとFitToPagesを同時に有効にしてはいけない
PageSetup.Zoom と FitToPagesWide / FitToPagesTall は同時に有効にすることができません。
FitToPages系を使いたい場合は、必ず ws.PageSetup.Zoom = False を先に書く必要があります。
Zoomに数値が入っている状態でFitToPagesを設定しても、Zoomの設定が優先されて1枚に収まらないという現象が起きます。
注意点②:PageSetupは処理が遅い
PageSetupオブジェクトのプロパティを設定するたびにExcelはバックグラウンドでページのレイアウトをリセットするため、VBAの処理が遅くなりやすいです。
複数シートにまとめて設定する場合は、Application.ScreenUpdating = False で画面更新を止めておくと処理速度が上がります。
Sub 高速版_印刷設定()
' 画面更新を止めて処理速度アップ
Application.ScreenUpdating = False
' ... PageSetupの設定処理 ...
' 処理完了後に画面更新を再開
Application.ScreenUpdating = True
MsgBox "設定完了", vbInformation
End Sub
注意点③:プリンターによって印刷結果が変わることがある
同じマクロを実行しても、プリンターの種類によって余白の実際の幅や印刷結果が微妙に変わることがあります。
これはプリンタードライバーの仕様の違いによるもので、VBAの問題ではありません。
初めてマクロを実行したときは必ずPrintPreviewで確認し、プリンターに合わせた微調整を行うことをおすすめします。
VBAスキルを身につけたら副収入を得るチャンスがある
ここまで印刷設定VBAの使い方を解説してきましたが、「VBAってこんなに便利なんだ」と感じてもらえたなら、それはビジネスチャンスにもなります。
実は私自身、印刷設定の自動化マクロを作れるようになったころから「このスキルで副収入を得られないか?」と考え始め、実際に収入につなげることができました。
ココナラでVBAスキルを販売した体験談
最初に挑戦したのはスキルマーケット「ココナラ」です。
テキスト入力やデータ起こし、マクロ開発のサービスを出品したのですが、登録したばかりの頃は実績・評価がゼロで、なかなか仕事を獲得することができませんでした。
そこで自己紹介文とポートフォリオを充実させ、単価が低くても作業量をこなして実績を積み重ねる対策をすることに。
ココナラを始めて約1年が経ったころ、VBAスキルを活かしたマクロ開発の依頼を受注できるようになり、月に2万〜3万円の副収入を継続して得ることができるようになりました。
リピートしてくれる依頼者も増えてきて、継続的な収入につながっていったのです。
信頼度を上げるまでに時間はかかりますが、VBAスキルで副収入を得ることは十分に可能です。
→ → →関連記事「【体験談あり】VBAスキルで副収入を得る方法|未経験から案件獲得まで」で詳しく解説しています。
ブログを活用して直接受注する方法
その後、エクセルVBAの情報を発信するブログを始めたところ、ブログから直接マクロ開発の依頼を受注できるようになりました。
ブログ経由の直接受注は、ココナラやクラウドワークスと違って手数料がかかりません。
さらに打ち合わせ方法(オンライン通話・メール・電話)を自分で決められる自由度の高さも大きなメリットです。
収入をアップさせ、安定してお客さんを獲得したい!という直接受注も視野に入れておきましょう。
クラウドワークス テックで案件を紹介してもらった体験
さらに高単価な案件に挑戦するなら、クラウドワークス テックがおすすめです。
私の場合は「本業以外の時間(1日4時間稼働可能)・完全リモート」という条件で案件を紹介してもらいました。
担当者のサポートが手厚く、「どのような仕事なのか」「自分に務まるのか」を事前に詳しく確認できたため、安心して副業をスタートできることが大きな魅力です。
月に10万円程度の報酬を受け取れたのですが、本業との掛け持ちがきつく感じることもあったのが正直なところです。
VBAスキルで副業をする際は、報酬金額だけでなく「自分に務まるか」「本業を疎かにせず作業時間を確保できるか」をしっかり検討しましょう。
→ → →フリーランスの求人サポートサービス「クラウドワークス テック」
![]()
まとめ ~ 印刷設定VBAでムダな手作業をゼロにしよう ~
この記事では、VBAで印刷設定を自動化するためのPageSetupオブジェクトとPrintOutメソッドの基本的な使い方から、実践的な自動化コードまでを解説してきました。
PageSetupオブジェクトを使えば、用紙サイズ・印刷の向き・余白・1枚収め設定・中央配置・ヘッダー・フッターをすべてコードで管理することができます。
PrintOutメソッドと組み合わせることで、A4用紙にきれいに収まる書類をボタン1クリックで自動印刷する仕組みの構築が可能です。
まずはこの記事のサンプルコードをそのままコピーして試してみてください。
動いた瞬間の達成感が、VBAをもっと学びたいという意欲につながっていきます。
もし「自分の業務に合わせた複雑なチェック処理を実装したい」「既存のマクロを改良したい」といったご要望がありましたら、マメBlogのエクセルマクロ開発依頼にご相談ください。
業務内容に合わせたオーダーメイドマクロを設定させていただきます。
最後まで読んでいただきありがとうございました。
エクセルVBAを使って面倒なルーティーン作業を自動化しちゃいましょう。







