Excelで自動印刷するマクロの作り方と基本手順
Excelの自動印刷マクロの基本
Excelの「自動印刷マクロ」は、VBA(Visual Basic for Applications)を使って印刷の手順を自動で実行する仕組みのこと。手で行う作業(印刷範囲の設定、ページ方向、用紙サイズ、部数の指定など)をコードに書いておくと、毎回同じ状態で印刷できる。
できることの例は次のとおり。
- 1クリックで同じレイアウトで印刷する
- 複数シートを決めた順番で連続印刷する
- 条件に合うときだけ印刷する(値が入っている行だけなど)
- 既定とは別のプリンターへ出し分ける
一方、会社のルールでマクロが禁止されている環境や、プリンターの詳細設定(メーカー固有のプロパティ)には制約がある。安全面から、まずはコピーの多い一般業務で小さく試し、うまくいけば段階的に広げていくのがおすすめ。
FAQ:自動印刷はExcelだけで完結できますか?
ほとんどのケースはExcelとVBAで可能。複雑な仕分けや時間指定などが必要なら、後述の外部ツール併用も選択肢になる。
準備:セキュリティ設定と保存形式
マクロを使うには、ブックをマクロ有効形式で保存し、必要に応じてセキュリティ設定を見直す。
- 保存形式:拡張子が「.xlsm」のマクロ有効ブックに保存する
- 信頼済みの場所:社内ポリシーに合わせて「信頼できる場所」に保存する
- 署名と警告:配布する場合はデジタル署名を検討し、開くときの警告が出ても慌てないよう周知する
最初にテスト用の小さなブックを用意して、印刷先はテスト用のプリンター(またはPDF印刷)に向けると安心。作成者だけの運用でも、後で配布する可能性を考え、シート名やセル範囲などはハードコーディングしすぎない。
FAQ:マクロが動かない時の最初の確認は?
拡張子が「.xlsm」か、保存場所が信頼済みか、マクロ有効になっているかを順に確認する。印刷できない場合は、プリンターの選択とオンライン状態も見る。
最小コードで1枚印刷:PrintOutの基本
まずは最短の体験から。アクティブシートをそのまま印刷する最小コードは次のとおり。
“`vba
Sub PrintActiveSheet()
ActiveSheet.PrintOut
End Sub
“`
選択範囲だけを印刷したい場合は、選択範囲を一時的に印刷範囲にしてから実行する。
“`vba
Sub PrintSelection()
Selection.PrintOut
End Sub
“`
部数、ページ指定、両面などの代表的な引数も押さえておく。
“`vba
Sub PrintPages()
‘ From:=開始ページ, To:=終了ページ, Copies:=部数, Collate:=部ごとに揃える
ActiveSheet.PrintOut From:=1, To:=1, Copies:=2, Collate:=True
End Sub
“`
「Collate」は部ごとにページを揃える設定。「True」だと 1部の中でページ順に重なる。印刷の前に必ずプレビューしたい場合は、次章の方法を使う。
FAQ:選択範囲だけを印刷する最短コードは?
選択中なら Selection.PrintOut が最短。範囲が固定なら Range(“A1:D20”).PrintOut でもよい。
ボタンで印刷:フォーム/図形にマクロを割り当て
現場で使いやすくするには「印刷ボタン」を用意する。配置の手順は次のとおり。
- 開発タブで「挿入」からフォームコントロールのボタンを配置する(または図形でも可)
- 表示された一覧から印刷用マクロを選ぶ
- ボタンの文字をわかりやすくする(例:請求書を印刷)
ボタンに割り当てるコード例は次のとおり。
“`vba
Sub PrintByButton()
ActiveSheet.PrintOut Copies:=1, Collate:=True
End Sub
“`
運用では、シート名変更やコピーで割り当てが外れることがある。テンプレートを決め、配布時はボタンの再割り当ても確認しておくとトラブルが減る。
FAQ:ボタンが効かない時の対処は?
ボタンの右クリックで「マクロの登録」を開き、割り当てが外れていないか確認する。保護シートの場合は解除してから再設定する。
印刷範囲とページ設定をコードで統一
ページ設定は手作業で触ると崩れやすい。コードで毎回同じ設定を適用すると、レイアウトが揃う。
“`vba
Sub ApplyPageSetup(ws As Worksheet)
With ws.PageSetup
.PrintArea = “$A$1:$H$50” ‘ 印刷範囲
.Orientation = xlPortrait ‘ 縦(横は xlLandscape)
.PaperSize = xlPaperA4 ‘ 用紙サイズ
.Zoom = False ‘ 拡大縮小を無効にし、Fit を使う
.FitToPagesWide = 1 ‘ 横1ページに収める
.FitToPagesTall = False ‘ 縦方向は自動
.LeftMargin = Application.CentimetersToPoints(1)
.RightMargin = Application.CentimetersToPoints(1)
.TopMargin = Application.CentimetersToPoints(1.5)
.BottomMargin = Application.CentimetersToPoints(1.5)
.CenterHorizontally = True
.CenterVertically = False
End With
End Sub
“`
よく使う設定を一覧にすると次のイメージになる。
| 設定 | 目的 | よく使う値 |
|---|---|---|
| Orientation | 縦横 | xlPortrait / xlLandscape |
| PaperSize | 用紙サイズ | xlPaperA4 / xlPaperLetter |
| Zoom | 拡大縮小 | True=拡大率、False=Fit系 |
| FitToPagesWide/Tall | 1ページに収める | Wide=1, Tall=False など |
| Margins | 余白 | 1.0〜1.5cm 目安 |
| PrintArea | 印刷範囲 | “$A$1:$H$50” など |
複数シートでページ番号を通しにしたい場合は、対象シートを一時的にグループ化してから印刷する方法が簡単。
“`vba
Sub PrintWithContinuousPageNumber()
Sheets(Array(“表紙”, “明細”, “集計”)).Select
ActiveWindow.SelectedSheets.PrintOut
Sheets(“表紙”).Select
End Sub
“`
FAQ:複数シートのページ番号を通しにするには?
印刷直前に対象シートを選択状態(グループ化)にして一度に印刷する。各シートのページ設定が近いほど崩れにくい。
複数シート/条件付きの一括・連続印刷
実務では「特定の名前のシートだけ」「値が入っている行だけ」などの条件が役立つ。次は配列で指定したシートを順に印刷する例。
“`vba
Sub PrintSelectedSheets()
Dim targets, i As Long
targets = Array(“表紙”, “明細”, “集計”)
For i = LBound(targets) To UBound(targets)
If WorksheetExists(CStr(targets(i))) Then
Worksheets(targets(i)).PrintOut
End If
Next i
End Sub
Function WorksheetExists(name As String) As Boolean
On Error Resume Next
WorksheetExists = Not Worksheets(name) Is Nothing
On Error GoTo 0
End Function
“`
値が入っている行だけを1ページずつ印刷したいときは、最終行を見つけてループする。
“`vba
Sub PrintRowsOnlyIfHasValue()
Dim lastRow As Long, r As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For r = 2 To lastRow
If Cells(r, 1).Value <> “” Then
Range(Cells(r, 1), Cells(r, 8)).PrintOut
End If
Next r
End Sub
“`
FAQ:非表示や保護シートも印刷できる?
非表示シートは一時的に表示すれば印刷できる。保護中は印刷自体は可能な場合が多いが、範囲変更は保護解除が必要になる。
印刷前プレビューと確認ダイアログ
誤印刷を減らすには、プレビューをはさみ、ユーザーに確認してもらう。
“`vba
Sub PreviewThenPrint()
Dim ans As VbMsgBoxResult
ActiveSheet.PrintPreview ‘ プレビュー表示
ans = MsgBox(“この内容で印刷しますか?”, vbYesNo + vbQuestion)
If ans = vbYes Then
ActiveSheet.PrintOut
End If
End Sub
“`
プレビューを毎回スキップしたい場合は、別のマクロを用意して使い分ける。運用の場では、確認ダイアログを入れるだけで紙と時間の無駄が大きく減る。
FAQ:毎回プレビューをスキップできる?
できる。プレビューなしの PrintOut 専用マクロを別に用意し、ボタンを分けるとよい。
プリンター指定とプロパティ制御
既定以外のプリンターへ出し分けたいときは、ActivePrinter を使う。ネットワーク名は環境で異なるので、一覧から取得して選ばせる方法が安全。
“`vba
Sub PrintToSpecificPrinter()
Dim prev As String
prev = Application.ActivePrinter
Application.ActivePrinter = “Microsoft Print to PDF on Ne00:” ‘ 例
ActiveSheet.PrintOut Copies:=1
Application.ActivePrinter = prev
End Sub
“`
両面印刷(Duplex)や部単位での揃え(Collate)は、PrintOut の引数やプリンター側の既定設定で扱う。メーカー独自の詳細プロパティはVBAから直接変更できないことがあるので、プリンターのプロパティで既定値を整える運用も現実的。
FAQ:ネットワークプリンター名が変わったら?
一覧から選び直す仕組みにする。固定文字列を使う場合は、見つからなければ既定に戻すなどのフォールバックを入れる。
マクロを使わない選択肢(機能のみ/Power Automate)
環境によってはマクロ禁止の場合がある。そのときは次の方法を検討する。
- 印刷範囲をシート側で設定し、クイックアクセスツールバーに「印刷」を追加
- テンプレート化して「範囲を選んで印刷」だけで済む構成にする
- Microsoft Power Automate(デスクトップ)で、Excelを開き印刷するフローを作る
時間指定やファイル監視など、Excel単体では難しい自動化も実現できる。ただしツールの導入や権限は所属組織のルールを守る。
FAQ:VBA禁止の現実的な対応は?
印刷範囲の固定とテンプレート化、ボタンの代わりにクイックアクセスを活用する。必要ならPower Automateで外部から操作する。
よくあるエラーと原因切り分け
印刷できない、範囲がズレるなどの相談は多い。次の観点で切り分けると早い。
- プリンターがオフライン、またはドライバーの不整合
- シートで手動変更したページ設定が残っている
- マクロが別シートの名前を固定で参照している
- ネットワーク名やポートが変更された
最初はプレビューで崩れがないかを確認し、簡単なブックで再現する。原因がブック固有か、環境(PC/プリンター)かを分けて考えると解決しやすい。
FAQ:特定PCだけ印刷できない時の手順は?
他のPCで印刷できるかを確認し、できるならドライバーやプリンターのポート設定を見直す。できなければブック側の要因を疑う。
サンプルコード集:用途別テンプレ
まずは使い始めやすい雛形をまとめる。必要に応じて前章の手順と組み合わせて使う。
“`vba
‘ 1) アクティブシートを1部だけ印刷
Sub Tmpl_PrintActive()
ActiveSheet.PrintOut Copies:=1, Collate:=True
End Sub
‘ 2) 選択範囲だけ印刷
Sub Tmpl_PrintSelection()
Selection.PrintOut
End Sub
‘ 3) ページ設定を当ててから印刷
Sub Tmpl_SetupAndPrint()
ApplyPageSetup ActiveSheet
ActiveSheet.PrintOut
End Sub
‘ 4) 複数シートを指定順で印刷
Sub Tmpl_PrintInOrder()
Dim arr, i As Long
arr = Array(“表紙”, “明細”, “集計”)
For i = LBound(arr) To UBound(arr)
If WorksheetExists(CStr(arr(i))) Then
Worksheets(arr(i)).PrintOut
End If
Next i
End Sub
‘ 5) プレビューしてから確認
Sub Tmpl_PreviewConfirm()
ActiveSheet.PrintPreview
If MsgBox(“印刷しますか?”, vbYesNo + vbQuestion) = vbYes Then
ActiveSheet.PrintOut
End If
End Sub
‘ 6) 指定プリンターへ印刷(なければ既定)
Sub Tmpl_PrintToNamed()
Dim prev As String, target As String
target = “Microsoft Print to PDF on Ne00:” ‘ 例
prev = Application.ActivePrinter
On Error Resume Next
Application.ActivePrinter = target
If Err.Number <> 0 Then
Err.Clear
Application.ActivePrinter = prev ‘ 見つからなければ戻す
End If
On Error GoTo 0
ActiveSheet.PrintOut
Application.ActivePrinter = prev
End Sub
“`
FAQ:まずどのテンプレから使えばよい?
最小限なら「1) アクティブシート印刷」。レイアウトを固定したいなら「3) ページ設定→印刷」。複数なら「4) 指定順で印刷」から始める。
まとめ
自動印刷マクロは、同じ印刷を何度も行う作業で強い効果がある。まずは最小コードで体験し、ページ設定をコード化、ボタン化、複数・条件付き印刷へ広げる流れが実務で扱いやすい。環境による制約(セキュリティ、プリンター設定)は早めに確認し、必要なら外部ツールも検討する。