エクセルマクロで印刷を自動化!連続印刷からPDF出力まで

初心者

エクセルマクロ印刷ってできるの?
毎月の請求書印刷を自動化したい!

Dr.オフィス

「ファイル→印刷」を何回も押すのは面倒だよね!
マクロを使って自動印刷しよう!

今回は、エクセルマクロを使って印刷を自動化する方法をご紹介します。

PDF出力も自動化できますので、メールで請求書を送信する機会が多い方は是非、取り入れてみてください。

マクロで印刷する際のポイント
  1. 印刷の基本のコードはActiveSheet.PrintOut
  2. 連続印刷はForNext、複数シートはArrayで指定
  3. PDF化はExportAsFixedFormat
  4. テスト中はPrintOut Preview:=Trueでプレビュー設定する

マクロは難しそうに見えても、コピペで少しずつ書き換えれば必ず動かせるようになります。

まずは基本の印刷から、一緒に試してみましょう!

エクセルマクロの印刷のほか、エクセルVBAの便利ワザを以下の記事で解説しています。

\ Officeドクター読者限定・無料Q&A /

この記事の内容でわからないことや、今すぐ解決したいOfficeのお悩みはありませんか?
Officeドクターの中の人が、公式LINEで直接ご質問にお答えします!
下のボタンをタップして、表示された入力欄からそのまま送信してくださいね。

目次

エクセルのマクロで印刷を自動化する基本

エクセルのマクロを使うことで、毎回の印刷の手間を格段に省略することができます。

例えば、エクセルで作成した請求書を取引先ごとに「ファイル→印刷」で何回も印刷するのは面倒です。

同じ印刷を繰り返す場合は、マクロを設定することをお勧めします。

まずは、マクロで印刷を自動化する基本のコードから確認していきましょう。

開いているエクセルシートを印刷するマクロ

今、開いているエクセルシートを印刷する基本のコードは次のとおりです。

  Sub 印刷する()
      ActiveSheet.PrintOut
  End Sub

手順を確認しながら、一緒にマクロを作成してみましょう。

STEP
Visual Basicを開く
開発タブから開く
開発タブから開く
  • 「開発」タブを押す
  • 「Visual Basic」をクリック
STEP
標準モジュールを挿入
挿入タブから開く
挿入タブから開く
  • 「挿入」タブをクリック
  • 「標準モジュール」を選択
STEP
プロシージャを挿入
こちらも挿入タブから
こちらも挿入タブから
  • 「挿入」タブを押す
  • 「プロシージャ」をクリック
STEP
マクロ名を入力
名前は日本語でOK
名前は日本語でOK
  • マクロの内容が分かりやすい名前を付ける
  • 「OK」ボタンを押す
STEP
コードを入力
コードはコピペでOK
コードはコピペでOK

Public Sub マクロ名()End Subの間に、以下のコードをコピペします。

ActiveSheet.PrintOut
STEP
マクロを実行する
実行ボタンを押す
実行ボタンを押す

マクロを実行して、現在開いているシートが印刷されることを確認してください。

基本のコードに引数を追加することで、印刷時の詳しい設定ができます。

詳しくは次の章で解説します。

マクロの印刷ボタンを設置しよう!

マクロの印刷ボタンは、フォームコントロールで作るのが基本です。

開発タブから選択
開発タブから選択
  • 「開発」タブを選択
  • 「挿入」をクリック
  • 「フォームコントロール」より「ボタン」を選択

ボタンをエクセルシートに追加すると、紐づけるマクロを選択するダイアログボックスが表示されますので、印刷ボタンと紐づけたいマクロを選びましょう。

紐づけたいマクロを選択
紐づけたいマクロを選択

詳しい手順については、マクロの実行ボタンの作り方をまとめた記事をご参照ください。

マクロで自動印刷の応用からエラーの対処法まで解説

実務で自動印刷のマクロを活用する場合、印刷範囲を指定して余計なものが印刷されないようにしたり、一括印刷をしたりなどの工夫が必要です。

最初はコードを書くのは手間ですが、一度マクロを完成させてしまえば業務がグンと楽になります。

はじめに「マクロでどんな印刷ができたら良いか」を箇条書きにしてからマクロを作りましょう。

ここでは実務でよく使われる手法を紹介します。

エクセルVBAで印刷範囲を指定して印刷する

実務で使用しているエクセルシートは、シート内にマクロボタンやメモ書き、グラフなどが貼られていることがよくあります。

リストだけ印刷したい
リストだけ印刷したい

印刷したい範囲が決まっているときは、PrintOutの前にセルの範囲を指定するだけで印刷範囲を指定できます。

Public Sub 範囲指定して印刷()

    ActiveSheet.Range("A1:F22").PrintOut

End Sub

この場合は果物購入表のA1~F22セルだけが印刷されます。

ただ、リストは行が増えたり減ったりするので、実務ではデータが入っている最終行をVBAで調べてから印刷するほうが便利です。

Public Sub 最終行まで印刷()

    Dim lastRow As Long
    
    lastRow = Cells(Rows.Count, 6).End(xlUp).Row  ' 金額(F列)の最終行を取得
    
    ActiveSheet.Range("A1:F" & lastRow).PrintOut

End Sub

このように、F列の最終行を自動的に取得することで、行を追加しても印刷範囲から外れることはなくなります。

このコードのポイントは、F列を基準にして最終行を取得していることです。

A列を基準にすると、合計行のA列は空欄なので、合計行が印刷されません。

最終行を取得する際は、一番下まで値が続く列を選びましょう。

マクロで連続印刷やエクセルの複数シートを一括印刷

ワードの差し込み印刷のように、請求書の番号や宛名を変えて連続で印刷したい場合は、ForNext文を使って繰り返し処理を行います。

請求書サンプル
請求書サンプル

この請求書の宛名と金額を変えて連続印刷するコードは次のとおりです。

Public Sub 請求書を連続印刷()

    Dim i As Long
    For i = 4 To 13                        ' H4~H13 の10件
        Range("B6").Value = Cells(i, 8).Value   ' H列(8列目)の宛名を宛名セルB6へ
        Range("C11").Value = Cells(i, 9).Value   ' I列(9列目)の金額を金額セルC11へ
        Range("A1:F24").PrintOut Preview:=True   ' 請求書部分だけ印刷プレビュー表示
    Next i
    
End Sub

Range("A1:F24").PrintOut Preview:=TrueのうちPreview:=Trueは印刷プレビューを表示させる引数です。

このマクロを実行すると、宛名と金額が変化した請求書の印刷プレビューが10回表示されます。

実務で使える段階になったら、Preview:=Trueは削除してください。

なお、複数シートをまとめて一括印刷したいときは、印刷したいシート名を指定します。

Public Sub 指定シート印刷()

    Sheets(Array("6月", "7月")).PrintOut

End Sub

Array("6月", "7月")のように、印刷したいシート名を""ダブルクォーテーションで囲んで指定します。

シート名が1文字でも異なるとエラーになるので注意しましょう。

印刷設定をマクロでまとめて指定する方法

用紙サイズや印刷の向きなどの印刷設定は、PageSetupにまとめて書くことができます。

毎回、手作業で整えている印刷設定も、マクロにしておけば一発でそろいますし、設定忘れもありません。

用紙サイズ・向き・余白をまとめて設定してみましょう。

Public Sub 印刷設定して印刷()
    With ActiveSheet.PageSetup
        .PaperSize = xlPaperA4       ' 用紙サイズA4
        .Orientation = xlLandscape   ' 横向き
        .LeftMargin = Application.CentimetersToPoints(1)  '左の余白を1cmにする
        .Zoom = False         '拡大縮小率の指定を解除
        .FitToPagesWide = 1          ' 横1ページに収める
        .FitToPagesTall = 1          ' 縦1ページに収める
    End With
    ActiveSheet.PrintOut Preview:=True   ' プレビューで確認
End Sub

WithEnd Withで、設定をまとめて書いています。

.Orientation = xlLandscapeで紙の向きを横向きにしていますが、縦にするならxlLandscapexlPortraitに変更しましょう。

このマクロを実行すると、以下のように印刷プレビューが表示されます。

1ページにまとめて印刷される
1ページにまとめて印刷される

.Zoom = False.FitToPagesWide = 1.FitToPagesTall = 1の3つを合わせて指定することで、1ページに収めて印刷することができます。

もしも縦の長さを1ページに収めず自動調整にしたい場合は、.FitToPagesTall = FalseとすればOKです。

また、このコードでは印刷プレビューで確認するようにしていますが、下から2行目のPreview:=Trueを削除すれば、実際に印刷できます。

自動印刷のマクロを作成する場合は、マクロが完成するまでのテスト段階ではPreview:=Trueを付ける癖をつけておくことをお勧めします。

なお、印刷部数を指定して印刷したい場合は、以下のようにPrintOutの引数で指定しましょう。

ActiveSheet.PrintOut Copies:=3   ' 3部印刷する

エクセルをPDFとして出力するVBA

エクセルVBAでは、紙に印刷するだけでなく、PDFに保存することもできます。

請求書などをメールで送る機会が多いなら、マクロを作ってボタン1つでPDF化しましょう。

PDF化するにはExportAsFixedFormatを使います。

以下のコードは、実務で使える「請求書の宛名と金額を変えたものを連続でPDF化」するマクロです。

連続印刷の代わりに、1件ずつ別名でPDF保存します。

Public Sub 請求書を連続PDF保存()
    Dim i As Long
    Dim savePath As String
    Dim fileName As String

    savePath = ThisWorkbook.Path & "\"        ' このブックと同じフォルダに保存

    For i = 4 To 13                            ' H4~H13 の10件
        Range("B6").Value = Cells(i, 8).Value      ' H列(8列目)の宛名を宛名セルB6へ
        Range("C11").Value = Cells(i, 9).Value     ' I列(9列目)の金額を金額セルC11へ

        fileName = savePath & Cells(i, 8).Value & ".pdf"   ' 宛名をファイル名に

        Range("A1:F24").ExportAsFixedFormat _
            Type:=xlTypePDF, _
            fileName:=fileName                 ' 請求書部分だけPDF保存
    Next i

    MsgBox "PDFの保存が完了しました。" & vbCrLf & savePath, vbInformation
End Sub

ご自身の帳票に合わせて、セル番地を変更して使用してください。

請求書の宛名に「\ / : * ? " < > |」などファイル名に使えない文字が含まれているとエラーになります。

また、同じ宛名が2つ以上ある場合は、ファイル名が重複するためPDFが上書きされる可能性があります。

実務で使う場合は、顧客コードなどでファイル名を作ると安心です。

このマクロを実行すると、エクセルファイルと同じフォルダ内に、請求書の宛名がファイル名となったPDFファイルが作成されます。

同じフォルダに格納された
同じフォルダに格納された

また、マクロが終了したらメッセージボックスで処理が終了したことと、保存先のフォルダを表示するようにしています。

メッセージボックスが表示される
メッセージボックスが表示される

マクロで印刷できない!ボタンが反応しないときの対処法

エクセルシートを印刷するマクロを作ったのに、印刷がうまくできなかったり、ボタンが反応しなかったりすることがあります。

よくあるエラーと対処法をまとめましたので、参考にしてみてください。

マクロが無効と表示される

マクロが無効のままでは、マクロを実行してもエラーメッセージが表示されます。

マクロが無効のままではエラーが表示される
マクロが無効のままではエラーが表示される

警告バーからエクセルマクロを有効にしたうえで、再度実行しましょう。

マクロの印刷ボタンを押しても印刷できない

ボタンを押すとエラーメッセージが表示される
ボタンを押すとエラーメッセージが表示される

マクロを有効化しているのに、ボタンを押してもエラーメッセージが表示されることがあります。

ボタンを設定したあとに、マクロ名を変更したりシートの保護をかけたりするとエラーとなりボタンが反応しません。

エクセルのボタンに割り当てられたVBAを変更したり、シートの保護を解除したうえで、ボタンを再度押してみてください。

空白ページまで印刷されてしまう

表は1枚に収まるのに、白紙が一緒に出てくることがあります。

主な原因は次の3つが考えられます。

  1. 印刷範囲が広く設定されている
  2. 手動の改ページが入っている
  3. 見えない値や書式が入っているセルがある

対処法として、設定済みの印刷範囲の解除と手動の改ページを解除したうえで、必要に応じてVBAで印刷範囲を指定してください。

また、Ctrl +Endを押して使用範囲よりも遠いセルにカーソルが飛ばないか確認し、不要な行や列は削除しましょう。

マクロで両面印刷するには?

マクロで両面印刷の指定はできませんが、あらかじめプリンターの設定を両面印刷にしておけば、マクロで印刷したときに両面印刷になります。

エクセルで両面印刷をする手順をまとめた記事をご参照のうえ、設定してみてください。

図形やオブジェクトを印刷したくない

一部の図形やオブジェクトを印刷したくない場合は、マクロの設定ではなく図形の書式設定から「オブジェクトを印刷する」をオフにします。

エクセルで図形を印刷しない詳しい操作方法が書かれた記事がありますので、そちらをご参照ください。

また、シート内のすべての図形やグラフ、背景色などを印刷しない場合は、「簡易印刷」で印刷する方法があります。

簡易印刷を設定する場合はPageSetup.Draft = Trueを使います。

グラフや画像がある
グラフや画像がある

上の図のようにグラフや画像があるシートについて、以下のコードを実行してみましょう。

Public Sub 簡易印刷()

    With ActiveSheet
        .PageSetup.Draft = True      ' 簡易印刷オン
        .PrintOut Preview:=True   ' プレビューで確認
        .PageSetup.Draft = False     ' 簡易印刷設定を元に戻す
    End With
    
End Sub
簡易印刷のプレビュー
簡易印刷のプレビュー

PageSetup.Draft = Trueで簡易印刷をオンにしたあとは、使わなくなるタイミングでPageSetup.Draft = Falseで簡易印刷設定を元に戻すのがポイントです。

また、簡易印刷の場合は、図形やオブジェクトのほか、罫線やセルの色などの書式も印刷されなくなるため注意が必要です。

上記のコードからPreview:=Trueを除けばプレビューで確認せずに印刷できるので、必要に応じて削除しましょう。

エクセルマクロの印刷に関するQ&A

マクロを使って印刷するにはどうすればいいですか?

ActiveSheet.PrintOutで、今、開いているシートを印刷できます。

詳細はエクセルのマクロで印刷を自動化する基本をご確認ください。

マクロの印刷ボタンが反応しないのはなぜですか?

マクロが有効化されていないほか、マクロ名を変更したりシートの保護をかけたりするとボタンが反応しないことがあります。くわしくはマクロで印刷できない!ボタンが反応しないときの対処法をご覧ください。

マクロ印刷で日々の作業を効率化しよう!

エクセルのマクロで印刷を自動化する方法の基本と、連続印刷やPDF出力などの応用を解説しました。

最初に「マクロでどんな印刷ができたら良いか」を箇条書きにしてから作ると、迷わず完成させられます。

それではおさらいです。

おさらい
  1. 印刷の基本のコードはActiveSheet.PrintOut
  2. 連続印刷はForNext、複数シートはArrayで指定
  3. PDF化はExportAsFixedFormat
  4. テスト中はPrintOut Preview:=Trueでプレビュー設定する

印刷のマクロは、一度作ってしまえば毎回の設定やクリックの繰り返しから解放されます。

まずは基本のコードから、あなたの業務内容に合わせてアレンジしてみてください!

今回の記事のほか、エクセルVBAの便利ワザを知りたい方は、以下をご参照ください!

よかったらシェアしてね!
  • URLをコピーしました!
目次