Excelで定型的な印刷作業を行う際、毎回ページ設定や印刷範囲を手動で調整するのは手間がかかります。特に、部署内で共通のフォーマットで印刷する場合や、定期的に同じレポートを印刷する場合には、この作業の自動化が求められます。
本記事では、Excel VBAを使用して、ページ設定や印刷範囲といった印刷関連の設定をコードで自動制御する方法を解説します。これにより、印刷作業の効率を飛躍的に向上させることが可能です。
この記事を読めば、VBAの基本的なコードを使い、Excelの印刷設定を自動化できるようになります。
【要点】Excel VBAで印刷設定を自動化する
- PageSetupオブジェクト: 印刷の向き、用紙サイズ、余白などのページ設定をコードで変更します。
- PrintAreaプロパティ: 印刷する範囲をシート単位またはブック単位で指定します。
- VBAエディタでのコード記述: Subプロシージャ内に印刷設定を行うコードを記述し、実行します。
ADVERTISEMENT
目次
VBAで印刷設定を制御する仕組み
Excel VBAでは、ワークシートやブックの様々なオブジェクトを操作できます。印刷設定に関連する機能は、主にPageSetupオブジェクトと、シートやレンジオブジェクトのPrintAreaプロパティを通じて制御されます。
PageSetupオブジェクトは、アクティブなシートまたは指定したシートの印刷に関する詳細な設定を保持しています。これには、印刷の向き、用紙サイズ、拡大縮小率、ヘッダー・フッター、そして余白などが含まれます。
PrintAreaプロパティは、印刷時に実際に紙に出力される範囲を定義します。これを指定することで、シート全体ではなく、特定のセル範囲のみを印刷対象とすることができます。
PageSetupオブジェクトによるページ設定の自動化
PageSetupオブジェクトを使用すると、Excelの「ページレイアウト」タブで設定できる項目をVBAコードから直接操作できます。これにより、作業の自動化と標準化が実現します。
印刷の向き、用紙サイズ、余白の設定
これらの基本的なページ設定は、PageSetupオブジェクトのプロパティを直接変更することで実現します。例えば、印刷の向きを横に変更したり、用紙サイズをA4に固定したり、余白を一定の値に設定したりすることが可能です。
- VBAエディタを開く
Excelで Alt + F11 キーを押して、VBAエディタ(Microsoft Visual Basic for Applications)を開きます。 - 標準モジュールの挿入
メニューバーの「挿入」から「標準モジュール」を選択し、新しいモジュールを挿入します。 - Subプロシージャの作成
挿入したモジュールに、以下のコード例のようにSubプロシージャを作成します。 - PageSetupオブジェクトの利用
以下のコードは、アクティブシートのページ設定を変更する例です。Sub PageSettingsAutomation()'アクティブシートのPageSetupオブジェクトを取得Dim ws As WorksheetSet ws = ActiveSheetWith ws.PageSetup'印刷の向きを横(xlLandscape)に設定.Orientation = xlLandscape'用紙サイズをA4(xlPaperA4)に設定.PaperSize = xlPaperA4'上余白を1cm(72ポイント)に設定.TopMargin = 72'下余白を1cm(72ポイント)に設定.BottomMargin = 72'左余白を1.5cm(108ポイント)に設定.LeftMargin = 108'右余白を1.5cm(108ポイント)に設定.RightMargin = 108'ヘッダーとフッターの無効化(必要に応じて).HeaderMargin = 0.FooterMargin = 0'シートの文字をページ幅に合わせる(必要に応じて).FitToPagesWide = 1.FitToPagesTall = False '縦方向は自動調整しないEnd WithMsgBox "ページ設定を自動化しました。"End Sub - コードの実行
VBAエディタに戻り、作成したSubプロシージャ(例: PageSettingsAutomation)を選択した状態で、ツールバーの「実行」(▶)ボタンをクリックするか、F5 キーを押してコードを実行します。
拡大縮小印刷の設定
特定のサイズに収まるように印刷したい場合、拡大縮小印刷の設定が役立ちます。これは、FitToPagesWideプロパティとFitToPagesTallプロパティで制御します。
- コードの追加
上記の PageSettingsAutomation サブルーチン内に、以下の行を追加または修正します。 - FitToPagesWideプロパティ
シートの幅を1ページに合わせる場合に使用します。.FitToPagesWide = 1この `1` は「1ページ幅に収める」という意味です。0に設定すると、この機能は無効になります。
- FitToPagesTallプロパティ
シートの高さを指定したページ数に合わせる場合に使用します。.FitToPagesTall = 1この `1` は「1ページ高さに収める」という意味です。0に設定すると、この機能は無効になります。
- 両方を同時に設定する注意点
.FitToPagesWide = 1 と .FitToPagesTall = 1 を同時に設定すると、シート全体が1ページに収まるように拡大縮小されます。意図しないサイズになる可能性もあるため、必要に応じてどちらか一方のみを設定するか、プレビューで確認することが重要です。
ヘッダー・フッターの設定
ヘッダーやフッターにページ番号、日付、ファイル名などを自動挿入したい場合も、PageSetupオブジェクトで設定できます。
- ヘッダー・フッターのプロパティ
PageSetupオブジェクトには、ヘッダーとフッターそれぞれに対して、左、中央、右部分を設定するプロパティがあります。- .LeftHeader
- .CenterHeader
- .RightHeader
- .LeftFooter
- .CenterFooter
- .RightFooter
- ヘッダー・フッターのコード例
例えば、中央ヘッダーにシート名、中央フッターにページ番号を表示するには、以下のように記述します。With ws.PageSetup'中央ヘッダーにシート名を表示.CenterHeader = "&" & ws.Name'中央フッターにページ番号を表示(例: Page 1 of X).CenterFooter = "Page &P of &N"End With特殊文字について
&P: 現在のページ番号&N: 総ページ数&A: ファイル名&F: ファイルパス&D: 日付&T: 時刻&"フォント名": フォント設定&[サイズ]: フォントサイズ - ヘッダー・フッターの無効化
ヘッダーやフッターを印刷しない場合は、以下のプロパティを0に設定します。.HeaderMargin = 0.FooterMargin = 0
PrintAreaプロパティによる印刷範囲の制御
PrintAreaプロパティを使用すると、印刷したいセル範囲をVBAコードで指定できます。これにより、毎回手動で印刷範囲を設定する手間が省け、指定した範囲のみが印刷されるようになります。
シート単位での印刷範囲指定
特定のシートの特定のセル範囲だけを印刷対象にしたい場合に便利です。
- PrintAreaプロパティの指定
以下のコードは、アクティブシートのA1セルからE10セルまでを印刷範囲として設定する例です。Sub SetPrintArea()Dim ws As WorksheetSet ws = ActiveSheet'印刷範囲を設定(例: A1からE10)ws.PrintArea = "A1:E10"MsgBox "印刷範囲を" & ws.Name & "のA1:E10に設定しました。"End Sub - 印刷範囲の解除
印刷範囲を解除するには、PrintAreaプロパティに空文字列(“”)を設定します。Sub ClearPrintArea()Dim ws As WorksheetSet ws = ActiveSheet'印刷範囲を解除ws.PrintArea = ""MsgBox "印刷範囲を解除しました。"End Sub
ブック全体で印刷範囲を管理する
複数のシートにまたがる印刷範囲を指定したり、ブック全体で印刷範囲を管理したりすることも可能です。
- 複数シートにまたがる範囲の指定
シート名を指定して、複数シートにまたがる範囲を定義できます。Sub SetMultiSheetPrintArea()Dim ws1 As WorksheetDim ws2 As WorksheetSet ws1 = ThisWorkbook.Sheets("Sheet1")Set ws2 = ThisWorkbook.Sheets("Sheet2")'Sheet1のA1:C5とSheet2のA1:C5を印刷範囲に設定ThisWorkbook.PrintArea = "Sheet1!A1:C5,Sheet2!A1:C5"MsgBox "ブック全体の印刷範囲を設定しました。"End Sub - ブックのPrintAreaプロパティ
ブック全体の印刷範囲を設定するには、 ThisWorkbook.PrintArea を使用します。シートの .PrintArea プロパティと混同しないように注意が必要です。
ADVERTISEMENT
印刷プレビューと印刷実行の自動化
ページ設定や印刷範囲の指定が終わったら、実際に印刷プレビューを表示したり、直接印刷を実行したりすることもVBAで自動化できます。
印刷プレビューの表示
ユーザーに印刷内容を確認してもらうために、印刷プレビューを表示させるコードです。
- Previewメソッド
PageSetupオブジェクトには、印刷プレビューを表示するための Preview メソッドがあります。Sub ShowPrintPreview()Dim ws As WorksheetSet ws = ActiveSheet'印刷範囲が設定されているか確認If ws.PrintArea <> "" Then'印刷プレビューを表示ws.PageSetup.PreviewElseMsgBox "印刷範囲が設定されていません。"End IfEnd Sub - プレビュー時のオプション
Previewメソッドには、ユーザーが印刷設定を変更できるかどうかなどを指定する引数があります。ws.PageSetup.Preview True '印刷ダイアログを表示せず、プレビューのみws.PageSetup.Preview False '印刷ダイアログを表示して、印刷実行またはプレビューを選択
直接印刷を実行する
ユーザーの操作を介さずに、直接プリンターに印刷指示を出すコードです。
- PrintOutメソッド
ワークシートオブジェクトには、直接印刷を実行する PrintOut メソッドがあります。Sub PrintDirectly()Dim ws As WorksheetSet ws = ActiveSheet'印刷範囲が設定されているか確認If ws.PrintArea <> "" Then'直接印刷を実行(例: 1部印刷)ws.PrintOut From:=1, To:=1, Copies:=1MsgBox "印刷を実行しました。"ElseMsgBox "印刷範囲が設定されていません。"End IfEnd Sub - PrintOutメソッドの引数
From: 印刷開始ページ
To: 印刷終了ページ
Copies: 印刷部数
Collate: true(True)にすると、部単位で印刷(1部目が全部終わってから2部目)。false(False)にすると、ページ単位で印刷(各ページの1部目が全部終わってから、各ページの2部目)。 - 注意点
PrintOut メソッドは、確認なしに印刷が開始されるため、誤って実行しないように注意が必要です。本番環境で利用する前に、必ずテスト環境で十分な検証を行ってください。
よくある印刷設定のトラブルシューティング
VBAで印刷設定を自動化する際に遭遇しやすい問題と、その解決策について説明します。
印刷範囲が正しく設定されない
PrintAreaプロパティを設定しても、意図した範囲が印刷されない場合の対処法です。
- シート名の指定ミス
ブック全体の印刷範囲を設定する際に、シート名を誤っていると正しく設定されません。シート名が正確か、大文字・小文字、全角・半角を確認してください。ThisWorkbook.PrintArea = "Sheet1!A1:C5"は正しいが、ThisWorkbook.PrintArea = "Sheet1 !A1:C5"(スペースが入っている)は誤りです。 - シートがアクティブでない
アクティブシートでないシートの .PrintArea プロパティに値を設定しても、反映されない場合があります。必ず対象シートをアクティブにするか、 ThisWorkbook.PrintArea を使用してください。'NG例:Dim ws As WorksheetSet ws = ThisWorkbook.Sheets("Sheet2")ws.PrintArea = "A1:B5" 'アクティブシートではないため、反映されない可能性'OK例:ws.Activate 'シートをアクティブにするws.PrintArea = "A1:B5" - シート保護がかかっている
シートが保護されている場合、 PrintArea プロパティの変更ができないことがあります。シート保護を解除してから実行するか、 Protect メソッドの UserInterfaceOnly:=True オプションを使用してください。
ページ設定が反映されない
PageSetupオブジェクトのプロパティを変更しても、印刷結果に反映されない場合の確認事項です。
- 対象シートの指定漏れ
ActiveSheet.PageSetup を使用している場合、コード実行時にアクティブなシートにのみ設定が適用されます。複数のシートに適用したい場合は、 For Each ws In ThisWorkbook.Worksheets ループを使用するか、シート名を明示的に指定してください。Dim ws As WorksheetFor Each ws In ThisWorkbook.WorksheetsWith ws.PageSetup.Orientation = xlLandscapeEnd WithNext ws - Excelのバージョンによる違い
一部のPageSetupプロパティは、Excelのバージョンによって挙動が異なる場合があります。特に古いバージョンではサポートされていないプロパティもあります。 - 他のマクロとの競合
他のVBAコードが同時に実行されている場合、意図せずページ設定が上書きされる可能性があります。コードの実行順序を確認してください。
印刷プレビューと実際の印刷結果が異なる
プレビューでは問題ないのに、実際の印刷ではレイアウトが崩れる場合の対処法です。
- プリンタードライバーの問題
Excelの印刷設定は、OSにインストールされているプリンタードライバーに依存します。プリンタードライバーが最新の状態であるか確認してください。 - フォントの違い
プレビュー環境と印刷環境で、使用されているフォントが異なる場合にレイアウトが崩れることがあります。可能であれば、標準的なフォント(例: MSゴシック、Arial)を使用するようにしてください。 - 「ページ幅に合わせる」設定の限界
.FitToPagesWideや.FitToPagesTallによる拡大縮小は、セルの内容が極端に大きい場合や、複雑な書式設定がされている場合に、意図した通りに収まらないことがあります。その場合は、手動で拡大縮小率を調整するか、印刷範囲を見直す必要があります。
まとめ
Excel VBAを使用することで、ページ設定や印刷範囲といった印刷関連の項目を自動化できます。PageSetupオブジェクトとPrintAreaプロパティを使いこなすことで、定型的な印刷作業の効率を大幅に向上させることが可能です。
本記事で解説したPageSetupオブジェクトによる印刷の向き、用紙サイズ、余白、拡大縮小、ヘッダー・フッターの設定方法、そしてPrintAreaプロパティによる印刷範囲の指定方法を習得すれば、日々の印刷業務を効率化できます。
さらに、これらの設定をボタン一つで実行できるようにマクロを組めば、より高度な自動化が実現します。Nextアクションとして、これらのコードを実際の業務フローに組み込むことを検討してみてください。
ADVERTISEMENT
超解決 Excel・Word研究班
企業のDX支援や業務効率化を専門とする技術者チーム。20年以上のExcel・Word運用改善実績に基づき、不具合の根本原因と最短の解決策を監修しています。ExcelとWordを使った「やりたいこと」「困っていること」「より便利な使い方」をクライアントの視点で丁寧に提供します。
Office・仕事術の人気記事ランキング
- 【Word】差し込み印刷で数字の桁を整える!金額にカンマ(桁区切り)を入れる設定
- 【Teams】メッセージを「保存済み」にして後で読む!重要なチャットをブックマークして整理する技
- 【Outlook】宛先が「オートコンプリート」に出ない・間違っている時の修正手順|履歴の削除と再構築
- 【Excel】矢印キーで「セルが動かず画面がスクロールする」!ScrollLockの解除方法(ノートPC対応)
- 【Outlook】メールの受信が数分遅れる!リアルタイムで届かない時の同期設定と送受信グループ設定
- 【Outlook】予定表の「祝日」が表示されない!最新カレンダーの追加と二重表示の修正手順
- 【Outlook】「メール送信を5分遅らせる」設定!誤送信を防ぐ最強のディレイ機能
- 【Word】校閲機能の基本!赤字(変更履歴)とコメントで修正を見える化する
- 【神技】保存せずに閉じたExcel・Wordファイルを復元する!消えたデータを復活させる4つの救出法
- 【Excel】文字がセルの枠からはみ出す・隠れる!「折り返して表示」と「縮小して全体を表示」の使い分け
