Excel VBAでページ設定する方法をお探しですね。

広告

Excelで毎回「余白を狭く」「A4横向き」って設定するの、もう面倒じゃないですか?

請求書や見積書、月次レポート、一覧表などを印刷するとき、毎回「余白を狭くする」「A4横向きにする」「印刷範囲を選び直す」といった作業をしていませんか? 意外とこの手間、積み重なると時間がかかりますよね。

しかも、担当者やシートによって設定がバラバラだと、印刷結果の見た目も統一されず、「なんかちょっと違うな…」という仕上がりになってしまいます。

Excel VBAを使えば、余白・用紙サイズ・印刷範囲・拡大縮小といった設定を、ボタン一つでまとめて自動化できます。

印刷前の面倒な手作業がグッと減って、しかも毎回同じキレイな仕上がりになるんです。

この記事では、初心者でも実務ですぐ使える形で、Excel VBAで印刷設定を自動化する方法をわかりやすく解説します。

Excel VBAで印刷設定を自動化する基本の考え方

Excel VBAで印刷設定をいじるときに、中心になるのが**PageSetupオブジェクト**です。

これは、Excelの「ページレイアウト」タブや「ページ設定」画面で指定する内容を、VBAから自動で変更するための仕組みです。

たとえば、こんなことができます:

– 用紙の向き(縦・横)
– 用紙サイズ(A4、A3、B5など)
– 余白の幅
– 印刷範囲
– 拡大縮小の設定
– ページの中央寄せ
– ヘッダーやフッター

手動でやると、シートごとに「ページ設定」画面を開いて、一つひとつ設定しないといけませんよね。

でもVBAなら、ボタン一つで同じ設定を再現できるので、請求書や定型レポートの印刷にピッタリなんです。

印刷設定はシートごとに保存される

まず押さえておきたいのは、**印刷設定は基本的にワークシート単位で保存される**ということです。

– 今開いているシートだけ設定したい → `ActiveSheet.PageSetup`
– 特定のシート(例:Sheet1)を指定したい → `Worksheets(“Sheet1”).PageSetup`

複数のシートを同じ設定にそろえたいときは、ループ処理を使って、それぞれのシートの`PageSetup`に同じ値を設定していきます。

これで、ブック内の帳票すべてを「A4横向き、余白1cm、横1ページに収める」といった統一設定にできるんです。

余白を小さくすれば必ず紙いっぱいに印刷できる…わけじゃない

印刷自動化でよくある勘違いが、「余白を0にすれば紙いっぱいに印刷できる」というものです。

実は、プリンターには物理的に印刷できない領域があるので、Excel側で余白を0に近づけても、完全なフチなし印刷にならないことがあります。

また、表の縦横比と用紙の縦横比が合っていないと、下や右に大きな空白が残ることも。

そういう場合は、余白だけじゃなく、列幅、行の高さ、拡大縮小率、印刷範囲を合わせて調整する必要があります。

VBAなら、それらをまとめて設定できるので、印刷結果を安定させやすいんです。

基本形のコードを見てみよう

まずは、アクティブシート(今開いているシート)のページ設定をまとめて整える基本コードです。

“`vba
Sub 印刷ページ設定を整える()
Dim ws As Worksheet
Set ws = ActiveSheet

Application.PrintCommunication = False

With ws.PageSetup
.PrintArea = “A1:J50” ‘ 印刷範囲
.Orientation = xlLandscape ‘ 横向き
.PaperSize = xlPaperA4 ‘ A4サイズ

‘ 余白の設定(センチメートル単位)
.LeftMargin = Application.CentimetersToPoints(1)
.RightMargin = Application.CentimetersToPoints(1)
.TopMargin = Application.CentimetersToPoints(1.5)
.BottomMargin = Application.CentimetersToPoints(1.5)
.HeaderMargin = Application.CentimetersToPoints(0.5)
.FooterMargin = Application.CentimetersToPoints(0.5)

‘ 拡大縮小の設定
.Zoom = False ‘ 倍率指定はしない
.FitToPagesWide = 1 ‘ 横方向は1ページに収める
.FitToPagesTall = False ‘ 縦方向は自然に改ページ

‘ その他の設定
.CenterHorizontally = True ‘ 横方向に中央寄せ
.CenterVertically = False ‘ 縦方向は中央寄せしない
.PrintGridlines = False ‘ 枠線は印刷しない
.PrintHeadings = False ‘ 行列番号は印刷しない
End With

Application.PrintCommunication = True

MsgBox “印刷ページ設定を完了しました。

“, vbInformation
End Sub
“`

このコードでは、印刷範囲を`A1:J50`に固定して、用紙をA4横向きに設定しています。

左右の余白は1cm、上下の余白は1.5cm。

横方向は1ページに収めますが、縦方向はデータ量に応じて複数ページになってもOKという設定です。

実務では、横に長い一覧表は「横だけ1ページに収めて、縦は自然に改ページする」設定のほうが、文字が小さくなりすぎず読みやすい印刷結果になりやすいんですよ。

余白・用紙サイズ・向き・拡大縮小をPageSetupで指定する

余白の設定方法

余白をVBAで設定するには、以下のプロパティを使います:

– `LeftMargin` … 左余白
– `RightMargin` … 右余白
– `TopMargin` … 上余白
– `BottomMargin` … 下余白
– `HeaderMargin` … ヘッダー位置
– `FooterMargin` … フッター位置

**注意点:** VBAで直接数値を入れると、ポイント単位として扱われます。

1cmは約28.35ポイントなので、手計算で指定することもできますが、コードの読みやすさを考えると`Application.CentimetersToPoints(1)`のように書くほうが断然おすすめです。

あとから見た人にも「1cmの余白を指定している」とすぐわかりますからね。

用紙サイズと向きの指定

用紙サイズは`PaperSize`で指定します。

主な定数はこちら:

– A4 → `xlPaperA4`
– A3 → `xlPaperA3`
– B5 → `xlPaperB5`

用紙の向きは`Orientation`で指定します:

– 縦向き → `xlPortrait`
– 横向き → `xlLandscape`

縦長の帳票や申請書は縦向き、列数の多い一覧表や集計表は横向きにするのが一般的です。

印刷範囲の幅に対して用紙の向きが合っていないと、余白を狭くしても文字が小さくなったり、右側が別ページに分かれたりするので、表の形に合わせて向きを選ぶことが大切です。

拡大縮小印刷の考え方

拡大縮小印刷では、`Zoom`と`FitToPagesWide`、`FitToPagesTall`の関係を理解しておく必要があります。

– **Zoom** … 印刷倍率を指定(例:`Zoom = 80`で80%印刷)
– **FitToPagesWide** … 横方向を何ページに収めるか
– **FitToPagesTall** … 縦方向を何ページに収めるか

この2つの考え方は**同時に有効にできません**。

「1ページに収める」設定を使う場合は、必ず`Zoom = False`にしてから`FitToPagesWide`などを指定します。

ここを間違えると、設定したつもりでも反映されないので注意してください。

実務でよく使う拡大縮小の考え方は、次の3パターンです:

**①表全体を1ページに収めたい場合**
“`vba
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
“`

**②横方向だけ1ページに収めたい場合(おすすめ!)**
“`vba
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = False
“`

**③倍率を固定したい場合**
“`vba
.Zoom = 90 ‘ 90%で印刷
‘ FitToPages系は使わない
“`

特に、明細行が増減する請求書や一覧表では、縦方向まで1ページに固定すると文字が極端に小さくなることがあります。

そのため、**横方向だけ1ページに収める設定**は非常に実用的です。

横幅がはみ出ないから読みやすいし、行数が多い場合は自然に2ページ目、3ページ目へ流れます。

逆に、1枚に収めることが必須の掲示用資料や提出用フォーマットでは、`FitToPagesTall = 1`まで指定して、プレビューで文字サイズを確認するとよいでしょう。

処理速度を改善するテクニック

`Application.PrintCommunication = False`を使うと、ページ設定の処理速度を改善できる場合があります。

PageSetup関連の設定はプリンター情報と連動するため、項目を1つ変更するたびに通信が発生して処理が遅くなることがあるんです。

複数の設定をまとめて変更する前に`False`、設定後に`True`へ戻すことで、処理をまとめて反映できます。

“`vba
Application.PrintCommunication = False
‘ ここでPageSetupの設定をまとめて行う
Application.PrintCommunication = True
“`

ただし、古いExcel環境では利用できない場合もあるので、社内で複数バージョンのExcelを使っている場合は動作確認をしておくと安心です。

印刷範囲を固定・自動判定して設定する方法

固定範囲を印刷する場合

印刷範囲を指定するには、`PageSetup.PrintArea`を使います。

固定範囲を印刷する帳票であれば、こんな感じで直接指定するのが最もわかりやすい方法です:

“`vba
.PrintArea = “A1:J50”
“`

請求書や見積書のように、レイアウトが決まっていて印刷するセル範囲も毎回同じ場合は、固定範囲の指定で十分です。

印刷範囲を明示しておくと、シートの右側や下側にある作業用の計算セル、メモ、補助表などが誤って印刷されるのを防げます。

データ行数が変わる一覧表の場合

一方で、データ行数が毎回変わる一覧表では、印刷範囲を自動判定できると便利ですよね。

たとえば、A列に必ずデータが入る表であれば、A列の最終行を取得して、1行目の最終列を取得して、その範囲を印刷対象にできます。

ただし、表の途中に空白がある場合や、右端の列に見出しがない場合は、想定より狭い範囲になることがあります。

自動判定を使う場合は、**どの列・どの行を基準に最終行や最終列を判断するか**を、表の構造に合わせて決めることが重要です。

印刷範囲を自動設定するコード例

以下は、アクティブシートのデータ範囲をもとに印刷範囲を自動設定し、ページ設定まで行う例です:

“`vba
Sub 印刷範囲を自動設定する()
Dim ws As Worksheet
Dim lastRow As Long
Dim lastCol As Long
Dim targetRange As Range

Set ws = ActiveSheet

‘ A列の最終行と1行目の最終列を取得
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column

‘ 印刷範囲を決定
Set targetRange = ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastCol))

Application.PrintCommunication = False

With ws.PageSetup
.PrintArea = targetRange.Address
.PaperSize = xlPaperA4
.Orientation = xlLandscape

.LeftMargin = Application.CentimetersToPoints(1)
.RightMargin = Application.CentimetersToPoints(1)
.TopMargin = Application.CentimetersToPoints(1.5)
.BottomMargin = Application.CentimetersToPoints(1.5)

.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = False
.CenterHorizontally = True
End With

Application.PrintCommunication = True

‘ プレビュー表示
ws.PrintPreview
End Sub
“`

このコードでは、A列の最終行と1行目の最終列を基準に印刷範囲を作っています。

設定後に`PrintPreview`を実行しているので、すぐに印刷せず、プレビュー画面で確認できます。

実務では、いきなり`PrintOut`で印刷するよりも、最初は`PrintPreview`で確認する運用にしたほうが安全です。

特に余白や拡大縮小の設定は、プリンターやPDF出力環境によって見え方が変わることがあるので、導入直後はプレビュー確認を挟むことをおすすめします。

自動判定の注意点

自動判定で注意したいのは、**Excelの「使われた範囲」と実際に印刷したい範囲が一致しないケース**です。

過去に入力して削除したセル、書式だけが残っているセル、右下にあるメモ書きなどが原因で、不要に広い範囲が印刷対象になることがあります。

そのため、業務用のマクロでは、単純に`UsedRange`だけに頼るよりも、こんな設計のほうが安定します:

– 「A列を基準に最終行を取る」
– 「見出し行を基準に最終列を取る」
– 「必要なら印刷対象列を固定する」

印刷範囲を解除したい場合

印刷範囲を解除したい場合は、こう指定します:

“`vba
.PrintArea = “”
“`

たとえば、作業中は印刷範囲を固定せず、印刷ボタンを押したときだけ範囲を設定する運用も可能です。

帳票テンプレートでは、あらかじめ印刷範囲を固定しておく方法がわかりやすいですが、データの増減が多い集計表では、印刷直前にVBAで範囲を再設定するほうがミスを減らせます。

複数シートへの一括適用と実務で失敗しない注意点

複数シートを一括処理するメリット

ブック内に複数の帳票シートがある場合、1枚ずつページ設定を変更するのは手間がかかりますよね。

VBAでは`For Each`を使って全シートを順番に処理すれば、同じ余白、用紙サイズ、向き、拡大縮小設定を一括で適用できます。

月次報告書のように、部門別シートや拠点別シートが複数あるブックでは、印刷前に全シートのページ設定を統一するマクロが役立ちます。

設定のばらつきがなくなるので、PDF化や紙での提出時にも見た目が整います。

対象シートを絞り込む工夫

複数シートを処理する場合は、**対象外のシートをどう扱うか**も考えておく必要があります。

たとえば、集計用の非表示シート、マスターデータ、作業メモのシートまで同じ印刷設定を適用すると、意図しない範囲が印刷対象になることがあります。

実務では、こんな工夫をすると安全です:

– シート名に「印刷_」が付くものだけ処理する
– 非表示シートは除外する
– 特定のシート配列だけを対象にする

単純に全シートへ適用するコードは便利ですが、業務ブックでは対象範囲を明確にしたほうが運用ミスを防げます。

全シートへ一括適用するコード例

全シートへ同じページ設定を適用する基本コードはこちらです:

“`vba
Sub 全シートの印刷設定を統一する()
Dim ws As Worksheet

Application.ScreenUpdating = False
Application.PrintCommunication = False

For Each ws In ThisWorkbook.Worksheets
‘ 表示されているシートだけ処理
If ws.Visible = xlSheetVisible Then
With ws.PageSetup
.PaperSize = xlPaperA4
.Orientation = xlLandscape

.LeftMargin = Application.CentimetersToPoints(1)
.RightMargin = Application.CentimetersToPoints(1)
.TopMargin = Application.CentimetersToPoints(1.5)
.BottomMargin = Application.CentimetersToPoints(1.5)
.HeaderMargin = Application.CentimetersToPoints(0.5)
.FooterMargin = Application.CentimetersToPoints(0.5)

.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = False

.CenterHorizontally = True
.PrintGridlines = False
.PrintHeadings = False
End With
End If
Next ws

Application.PrintCommunication = True
Application.ScreenUpdating = True

MsgBox “表示中の全シートに印刷設定を適用しました。

“, vbInformation
End Sub
“`

このコードでは、表示されているシートだけを対象にしています。

`Application.ScreenUpdating = False`で画面更新を止めているので、処理中のちらつきを抑えられます。

大量のシートを処理する場合、PageSetupは比較的時間がかかる処理なので、画面更新やプリンター通信を抑える工夫が効果的です。

ただし、エラーが発生したときに設定を戻せないとExcelの動作に影響するので、本格的に使う場合はエラーハンドリングを追加して、最後に必ず`ScreenUpdating`や`PrintCommunication`を元に戻す設計にするとより安全です。

よくあるトラブルと対処法

①余白を0にしても余白が消えない

「余白を0にしたのに、まだ余白がある!」というトラブルは多いです。

これはExcelの設定ミスとは限らず、こんな原因が考えられます:

– **プリンターの印刷可能領域:** プリンターには物理的に印刷できない領域があります
– **表の縦横比:** A4用紙に対して表が横長または縦長すぎると、片側や下部に空白が残ります
– **拡大縮小設定:** 拡大縮小の設定が適切でないと、余白が残ることがあります

完全なフチなし印刷をしたい場合は、プリンター側がフチなし印刷に対応している必要があります。

また、列幅や行の高さを調整する必要がある場合も。

VBAで余白だけを詰めても解決しないケースがある点は、あらかじめ理解しておきましょう。

②ZoomとFitToPagesWideの設定が反映されない

次に多いのが、`Zoom`と`FitToPagesWide`の指定が競合して設定が反映されないケースです。

**整理して考えるとこうなります:**

– **1ページに収める設定を使う場合** → `Zoom = False`にしてから`FitToPagesWide`などを指定
– **倍率を固定したい場合** → `Zoom = 80`のように指定し、FitToPages系を使わない

この2つは同時に使えないので、どちらかを選ぶ必要があります。

③実行時エラー1004が出る

実行時エラー1004が出る場合は、こんな原因が考えられます:

– プリンターが設定されていない
– 使用できない用紙サイズを指定している
– シートが保護されている
– 印刷範囲の指定が不正である

PDFプリンターを含め、Windows側で有効なプリンターが設定されているかも確認してください。

まとめ:印刷自動化で業務をもっと楽に

最後に、印刷自動化は**「印刷する直前だけの処理」**と考えると、業務に組み込みやすくなります。

データ入力や集計の途中ではページ設定を気にせず、印刷ボタンを押したタイミングで、こんな流れで処理すればOK:

1. 印刷範囲を判定
2. 余白と用紙サイズを設定
3. プレビューを表示

こうすれば、利用者は細かい設定を意識せずに済みます。

さらに、PDF保存のマクロやヘッダー・フッター設定、改ページ設定と組み合わせることで、帳票作成全体の自動化にも発展できます。

**Excel VBAで印刷時の余白・用紙サイズ・印刷範囲を自動化することは、単なる時短だけでなく、印刷品質の標準化にもつながる、実務効果の高い改善です。

**

ぜひ、この記事を参考に、あなたの職場でも印刷自動化を試してみてください。

毎回の「余白を狭く」「A4横向き」という作業から解放されますよ!

広告