次の DEMO を見にいく
Excel

Excelで自動印刷するマクロの作り方と基本手順

k.w
\お買い物マラソン開催中/
スポンサーリンク

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 でもよい。

ボタンで印刷:フォーム/図形にマクロを割り当て

現場で使いやすくするには「印刷ボタン」を用意する。配置の手順は次のとおり。

  1. 開発タブで「挿入」からフォームコントロールのボタンを配置する(または図形でも可)
  2. 表示された一覧から印刷用マクロを選ぶ
  3. ボタンの文字をわかりやすくする(例:請求書を印刷)

ボタンに割り当てるコード例は次のとおり。

“`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/Tall1ページに収める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) 指定順で印刷」から始める。

まとめ

自動印刷マクロは、同じ印刷を何度も行う作業で強い効果がある。まずは最小コードで体験し、ページ設定をコード化、ボタン化、複数・条件付き印刷へ広げる流れが実務で扱いやすい。環境による制約(セキュリティ、プリンター設定)は早めに確認し、必要なら外部ツールも検討する。

スポンサーリンク
記事URLをコピーしました