Excel上級者

VBAでPDF印刷を自動化!3つの方法と実務コード集

しんたろ。

VBAでPDFを印刷する方法、意外と情報がバラバラで困りますよね。この記事では3つの方法を比較しながら、コピペで使えるコードを紹介します。

この記事でわかること
  • VBAでPDFを印刷する3つの方法(Shell方式・Acrobat API方式・ExportAsFixedFormat)の使い分け
  • フォルダ内のPDFを一括印刷するマクロの書き方
  • PDFを開かずに印刷する方法
  • プリンタ指定・両面印刷・部数指定などの詳細設定
  • 実行時エラーや64ビット環境の問題への対処法
  • 請求書の一括印刷や日次レポートの自動印刷など実務活用例

VBAでPDFを印刷する方法は大きく分けて3つあります。それぞれ必要なソフトやコストが異なるため、自分の環境に合った方法を選ぶことが大切です。

本記事では、Shell方式(Adobe Reader)・Acrobat API方式・ExportAsFixedFormat方式の3つをサンプルコード付きで解説します。さらにフォルダ内PDFの一括印刷マクロや、よくあるエラーの対処法まで網羅しています。製造業で10年以上VBAを活用してきた筆者が、実務で本当に使えるコードだけを厳選しました。

VBAでPDFを印刷する3つの方法【比較表付き】

VBAからPDFを印刷するには、大きく分けて以下の3つの方法があります。まずはそれぞれの仕組みとコードを確認し、後半の比較表で自分に合った方法を選びましょう。

方法1: Shell方式(AcroRd32/Adobe Reader)

最も手軽な方法がShell関数を使う方式です。Adobe Reader(無料)がインストールされていれば使えます。Shell関数でAdobe Readerの実行ファイル(AcroRd32.exe)を呼び出し、コマンドラインオプションでPDFファイルのパスとプリンタ名を渡して印刷します。

Sub ShellでPDF印刷()
    Dim pdfPath As String
    Dim printerName As String
    Dim acrobatPath As String

    pdfPath = "C:\PDF\sample.pdf"
    printerName = "Microsoft Print to PDF"
    acrobatPath = "C:\Program Files\Adobe\Acrobat DC\Reader\AcroRd32.exe"

    '--- Shell関数でAdobe Readerを呼び出して印刷 ---
    Shell """" & acrobatPath & """ /t """" & pdfPath & """ """" & printerName & """"", vbHide

    '--- 印刷完了まで待機(秒数は環境に応じて調整) ---
    Application.Wait Now + TimeValue("00:00:05")

    MsgBox "印刷が完了しました"
End Sub
Shell方式のポイント
  • /tオプションはPDFを印刷後に自動で閉じるコマンドです
  • vbHideを指定するとAdobe Readerのウィンドウを非表示にできます
  • AcroRd32.exeのパスは環境によって異なるため、事前に確認してください
  • 64ビット版Adobe Acrobat Readerでは実行ファイル名がAcrobat.exeに変わっています

方法2: Acrobat API方式(CAcroApp/CAcroAVDoc)

Acrobat API方式は、Adobe Acrobat ProのCOMオブジェクトを使ってPDFを制御する方法です。印刷だけでなくページ操作やテキスト抽出など、高度なPDF操作が可能になります。ただし、有料のAcrobat Proが必須です。

まず、VBAエディタの「ツール」→「参照設定」からAdobe Acrobat xx.x Type Libraryにチェックを入れてください。

Sub AcrobatAPIでPDF印刷()
    Dim acroApp As Object
    Dim acroAVDoc As Object
    Dim acroPDDoc As Object
    Dim pdfPath As String

    pdfPath = "C:\PDF\sample.pdf"

    '--- Acrobat Appオブジェクトを生成 ---
    Set acroApp = CreateObject("AcroExch.App")
    Set acroAVDoc = CreateObject("AcroExch.AVDoc")

    '--- PDFファイルを開く ---
    If acroAVDoc.Open(pdfPath, "") Then
        Set acroPDDoc = acroAVDoc.GetPDDoc

        '--- 全ページを印刷(nFirstPage=0, nLastPage=全ページ) ---
        Dim nPages As Long
        nPages = acroPDDoc.GetNumPages

        '--- PrintPages(nFirstPage, nLastPage, nPSLevel, bBinaryOk, bShrinkToFit) ---
        acroPDDoc.GetJSObject.Print False, 0, nPages - 1, False

        '--- PDFを閉じる ---
        acroAVDoc.Close True
    Else
        MsgBox "PDFファイルを開けませんでした: " & pdfPath
    End If

    '--- Acrobatアプリを終了 ---
    acroApp.Exit

    Set acroPDDoc = Nothing
    Set acroAVDoc = Nothing
    Set acroApp = Nothing

    MsgBox "印刷が完了しました"
End Sub

Acrobat API方式ではページ範囲の細かい指定や、印刷前のPDF情報取得なども可能です。ただし、CreateObjectで生成するためAcrobat Proがインストールされていない環境ではエラーになります。

方法3: ExportAsFixedFormatでPDF出力する方法

ExportAsFixedFormatはExcelシートをPDFファイルとして保存するメソッドです。既存のPDFファイルを印刷する方法ではなく、Excelの内容をPDFに変換して出力する方法です。請求書や帳票をExcelで作成してPDF化する業務で活躍します。

Sub ExportAsFixedFormatでPDF出力()
    Dim savePath As String
    savePath = "C:\PDF\output_" & Format(Date, "yyyymmdd") & ".pdf"

    '--- アクティブシートをPDFとして保存 ---
    ActiveSheet.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=savePath, _
        Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, _
        IgnorePrintAreas:=False, _
        OpenAfterPublish:=False

    MsgBox "PDF出力が完了しました: " & savePath
End Sub

さらに、ExportAsFixedFormatで保存した後にそのまま印刷したい場合は、PrintOutメソッドと組み合わせて使います。

Sub PDF保存して印刷も実行()
    Dim savePath As String
    savePath = "C:\PDF\output_" & Format(Date, "yyyymmdd") & ".pdf"

    '--- PDFとして保存 ---
    ActiveSheet.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=savePath, _
        Quality:=xlQualityStandard

    '--- 同じシートを物理プリンタにも印刷 ---
    ActiveSheet.PrintOut Copies:=1

    MsgBox "PDF保存と印刷が完了しました"
End Sub

ExportAsFixedFormatはExcelの標準機能だけで使えるので、Adobe製品が不要という大きなメリットがあります。Excel帳票をPDF化する業務には最適です。

【比較表】3方式のメリット・デメリット・必要環境

3つの方法を一覧で比較します。自分の環境やコストに応じて最適な方法を選びましょう。

項目Shell方式Acrobat API方式ExportAsFixedFormat
必要ソフトAdobe Reader(無料)Adobe Acrobat Pro(有料)Excel のみ
コスト無料月額1,980円〜無料(Excel標準機能)
難易度低い高い(参照設定が必要)低い
既存PDFの印刷可能可能不可(Excel→PDF変換のみ)
ページ範囲指定制限あり可能可能(PrintArea設定)
開かずに印刷可能(/tオプション)一時的に開く対象外
メリット無料で手軽に使える高度なPDF制御が可能Adobe不要、標準機能のみ
デメリットAdobe Readerのパスが環境依存Acrobat Proが必須、コスト高既存PDFの印刷には使えない
おすすめ用途既存PDFの一括印刷PDF操作を含む高度な処理Excel帳票のPDF変換

迷ったらまずはShell方式を試してみてください。無料のAdobe Readerだけで動作し、コードもシンプルです。既存PDFの印刷ではなくExcelからPDF出力したい場合はExportAsFixedFormatを使いましょう。

VBAでフォルダ内のPDFを一括印刷するマクロ

業務でよくある「特定フォルダに入っているPDFをすべて印刷したい」という要望に応えるマクロを紹介します。Dir関数でフォルダ内のPDFファイルを列挙し、ループで順番に印刷する仕組みです。

フォルダ内の全PDFを自動印刷するコード

Shell方式を使って、指定フォルダ内のすべてのPDFファイルを一括印刷するマクロです。

Sub フォルダ内PDFを一括印刷()
    Dim folderPath As String
    Dim pdfFile As String
    Dim acrobatPath As String
    Dim printerName As String
    Dim count As Long

    folderPath = "C:\PDF\印刷対象\"
    acrobatPath = "C:\Program Files\Adobe\Acrobat DC\Reader\AcroRd32.exe"
    printerName = "Brother MFC-J6583CDW"  '--- プリンタ名は環境に合わせて変更 ---
    count = 0

    '--- フォルダ内の最初のPDFファイルを取得 ---
    pdfFile = Dir(folderPath & "*.pdf")

    '--- PDFファイルがなくなるまでループ ---
    Do While pdfFile <> ""
        '--- Shell関数で印刷実行 ---
        Shell """" & acrobatPath & """ /t """" & folderPath & pdfFile & """ """" & printerName & """"", vbHide

        count = count + 1

        '--- 印刷間隔を空ける(プリンタの処理を待つ) ---
        Application.Wait Now + TimeValue("00:00:03")

        '--- 次のPDFファイルを取得 ---
        pdfFile = Dir()
    Loop

    MsgBox count & "件のPDFを印刷しました"
End Sub
一括印刷のポイント
  • Dir(folderPath & "*.pdf")でフォルダ内のPDFファイル名を順番に取得します
  • Application.Waitで印刷間隔を空けないとプリンタがエラーになる場合があります
  • 待機時間はプリンタの処理速度やPDFのサイズに応じて調整してください
  • 印刷件数をカウントして最後にメッセージ表示すると運用しやすくなります

ファイル名で絞り込んで印刷する方法

フォルダ内のPDFをすべて印刷するのではなく、特定の条件に一致するファイルだけを印刷したい場合はLike演算子InStr関数を使ってフィルタリングします。

Sub ファイル名で絞り込んで印刷()
    Dim folderPath As String
    Dim pdfFile As String
    Dim acrobatPath As String
    Dim printerName As String
    Dim count As Long

    folderPath = "C:\PDF\印刷対象\"
    acrobatPath = "C:\Program Files\Adobe\Acrobat DC\Reader\AcroRd32.exe"
    printerName = "Brother MFC-J6583CDW"
    count = 0

    pdfFile = Dir(folderPath & "*.pdf")

    Do While pdfFile <> ""
        '--- Like演算子で「請求書」を含むファイル名のみ対象 ---
        If pdfFile Like "*請求書*" Then
            Shell """" & acrobatPath & """ /t """" & folderPath & pdfFile & """ """" & printerName & """"", vbHide
            count = count + 1
            Application.Wait Now + TimeValue("00:00:03")
        End If

        pdfFile = Dir()
    Loop

    MsgBox count & "件の請求書PDFを印刷しました"
End Sub

InStr関数を使えば、より柔軟な条件指定も可能です。

'--- InStr関数で複数条件のフィルタリング ---
If InStr(1, pdfFile, "請求書", vbTextCompare) > 0 Or _
   InStr(1, pdfFile, "見積書", vbTextCompare) > 0 Then
    '--- 印刷処理 ---
End If

PDFを開かずに印刷する方法

VBAでPDFを印刷する際、Acrobatの画面を表示させずにバックグラウンドで印刷したいというニーズは非常に多いです。Shell方式の/tオプションを使えば、PDFファイルを開かずに印刷できます。

Sub PDFを開かずに印刷()
    Dim pdfPath As String
    Dim printerName As String
    Dim acrobatPath As String

    pdfPath = "C:\PDF\sample.pdf"
    printerName = "Microsoft Print to PDF"
    acrobatPath = "C:\Program Files\Adobe\Acrobat DC\Reader\AcroRd32.exe"

    '--- /t オプション: 印刷してAcrobatを自動終了 ---
    '--- vbHide: ウィンドウを非表示にする ---
    Shell """" & acrobatPath & """ /t """" & pdfPath & """ """" & printerName & """"", vbHide

End Sub

Shell方式のコマンドラインオプションを整理すると次のようになります。

オプション動作用途
/t印刷後にAcrobatを終了開かずに印刷したいとき
/p印刷ダイアログを表示設定を確認してから印刷したいとき
/hウィンドウを最小化画面を占有させたくないとき
/n新しいインスタンスで起動既に起動中のAcrobatと干渉させたくないとき

/tオプションとvbHideを組み合わせることで、ユーザーの操作を一切妨げずにバックグラウンドでPDFを印刷できます。大量のPDFを一括印刷する業務では必須のテクニックです。

「PDFを開かずに印刷したい」は検索でもよく調べられるニーズです。/tオプションとvbHideの組み合わせを覚えておけば、バックグラウンド印刷が簡単に実現できます。

PDF印刷の詳細設定をVBAで制御する方法

実務では「特定のプリンタに出力したい」「2部ずつ両面印刷したい」など、細かい印刷設定が必要になる場面が多いです。ここではVBAで印刷設定を制御する方法を解説します。

プリンタを指定して印刷する

Shell方式ではコマンドライン引数でプリンタ名を指定します。PrintOutメソッドを使う場合はActivePrinterプロパティを変更するか、引数で直接指定します。

Sub プリンタを指定して印刷_Shell方式()
    Dim pdfPath As String
    Dim printerName As String
    Dim acrobatPath As String

    pdfPath = "C:\PDF\sample.pdf"
    acrobatPath = "C:\Program Files\Adobe\Acrobat DC\Reader\AcroRd32.exe"

    '--- プリンタ名を指定(コントロールパネルで確認できる名前を入力) ---
    printerName = "Brother MFC-J6583CDW"

    Shell """" & acrobatPath & """ /t """" & pdfPath & """ """" & printerName & """"", vbHide
End Sub
Sub プリンタを指定して印刷_PrintOut方式()
    Dim originalPrinter As String

    '--- 現在のプリンタを保存 ---
    originalPrinter = Application.ActivePrinter

    '--- プリンタを変更して印刷 ---
    Application.ActivePrinter = "Brother MFC-J6583CDW on Ne03:"
    ActiveSheet.PrintOut Copies:=1

    '--- 元のプリンタに戻す ---
    Application.ActivePrinter = originalPrinter

    MsgBox "指定プリンタで印刷しました"
End Sub
プリンタ名の確認方法
  • VBAのイミディエイトウィンドウで? Application.ActivePrinterを実行すると現在のプリンタ名を確認できます
  • Windowsの「設定」→「デバイス」→「プリンターとスキャナー」でも確認できます
  • PrintOut方式で使うプリンタ名には「on Ne03:」のようなポート情報が必要な場合があります

両面印刷・部数・ページ範囲を指定する

PrintOutメソッドでは部数やページ範囲を引数で指定できます。両面印刷はプリンタの設定に依存しますが、対応プリンタであればDuplexプロパティで制御可能です。

Sub 詳細設定付きで印刷()
    '--- 部数を指定して印刷(3部) ---
    ActiveSheet.PrintOut Copies:=3

    '--- ページ範囲を指定して印刷(2ページ目から5ページ目) ---
    ActiveSheet.PrintOut From:=2, To:=5

    '--- 部数とページ範囲を組み合わせ ---
    ActiveSheet.PrintOut From:=1, To:=3, Copies:=2
End Sub
Sub 両面印刷を設定()
    '--- プリンタが両面印刷に対応している場合 ---
    With ActiveSheet.PageSetup
        '--- xlDuplexVertical: 長辺綴じ ---
        '--- xlDuplexHorizontal: 短辺綴じ ---
        .Duplex = xlDuplexVertical
    End With

    ActiveSheet.PrintOut Copies:=1
End Sub

PrintOutメソッドの主要パラメータを一覧にまとめます。

パラメータ説明設定例
From印刷開始ページFrom:=2
To印刷終了ページTo:=5
Copies印刷部数Copies:=3
Preview印刷プレビューを表示Preview:=True
ActivePrinter出力先プリンタ名ActivePrinter:=”プリンタ名”
Collate部単位で印刷するかCollate:=True

印刷ダイアログを表示せずにバックグラウンド印刷する

PrintOutメソッドはデフォルトで印刷ダイアログを表示せずに直接印刷を実行します。ダイアログを表示したい場合はApplication.Dialogs(xlDialogPrint).Showを使います。

Sub バックグラウンドで印刷()
    '--- 印刷ダイアログなしで直接印刷 ---
    Application.DisplayAlerts = False
    ActiveSheet.PrintOut Copies:=1, Preview:=False
    Application.DisplayAlerts = True
End Sub

Sub 印刷ダイアログを表示して印刷()
    '--- ユーザーに設定を確認させたい場合 ---
    Application.Dialogs(xlDialogPrint).Show
End Sub

Shell方式でバックグラウンド印刷する場合は、前述のvbHideオプションを使えばウィンドウが表示されません。定時バッチ処理や大量印刷の自動化では、ダイアログ非表示が基本です。

VBA PDF印刷でよくあるエラーと対処法

VBAでPDFを印刷する際に遭遇しやすいエラーと、その対処法をまとめました。エラーが出たときにすぐ確認できるようにしておくと便利です。

「実行時エラー」が出る場合の対処法

Shell方式でよく発生する実行時エラーの原因と対処法を紹介します。

Sub エラーハンドリング付きPDF印刷()
    On Error GoTo ErrHandler

    Dim pdfPath As String
    Dim acrobatPath As String
    Dim printerName As String

    pdfPath = "C:\PDF\sample.pdf"
    acrobatPath = "C:\Program Files\Adobe\Acrobat DC\Reader\AcroRd32.exe"
    printerName = "Microsoft Print to PDF"

    '--- ファイルの存在確認 ---
    If Dir(pdfPath) = "" Then
        MsgBox "PDFファイルが見つかりません: " & pdfPath, vbExclamation
        Exit Sub
    End If

    '--- Acrobat Readerの存在確認 ---
    If Dir(acrobatPath) = "" Then
        MsgBox "Adobe Readerが見つかりません: " & acrobatPath, vbExclamation
        Exit Sub
    End If

    '--- 印刷実行 ---
    Shell """" & acrobatPath & """ /t """" & pdfPath & """ """" & printerName & """"", vbHide

    MsgBox "印刷が完了しました"
    Exit Sub

ErrHandler:
    MsgBox "エラーが発生しました" & vbCrLf & _
           "エラー番号: " & Err.Number & vbCrLf & _
           "エラー内容: " & Err.Description, vbCritical
End Sub

よく発生するエラーの一覧です。

エラー番号原因対処法
53ファイルが見つからないPDFファイルのパスやAcrobatのパスが正しいか確認する
5プロシージャの呼び出しが無効Shell関数の引数(ダブルクォーテーションのエスケープ)を見直す
429ActiveXコンポーネントはオブジェクトを作成できないAcrobat Proがインストールされているか確認する(API方式の場合)
1004アプリケーション定義またはオブジェクト定義のエラーPrintOut/ExportAsFixedFormatのパラメータを見直す

64ビット環境で動かない場合の対処法

64ビット版のWindowsやOfficeを使っている場合、AcroRd32.exeのパスが異なるケースがあります。近年のAdobe Acrobat Reader DCでは実行ファイル名がAcrobat.exeに変更されています。

Sub 環境に応じてAcrobatパスを自動判定()
    Dim acrobatPath As String

    '--- 新しいAdobe Acrobat Reader(64ビット版)のパスを優先 ---
    If Dir("C:\Program Files\Adobe\Acrobat DC\Reader\AcroRd32.exe") <> "" Then
        acrobatPath = "C:\Program Files\Adobe\Acrobat DC\Reader\AcroRd32.exe"
    ElseIf Dir("C:\Program Files\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe") <> "" Then
        acrobatPath = "C:\Program Files\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe"
    ElseIf Dir("C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe") <> "" Then
        acrobatPath = "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe"
    ElseIf Dir("C:\Program Files\Adobe\Acrobat DC\Acrobat\Acrobat.exe") <> "" Then
        '--- 新しいバージョン(Acrobat.exe) ---
        acrobatPath = "C:\Program Files\Adobe\Acrobat DC\Acrobat\Acrobat.exe"
    Else
        MsgBox "Adobe Readerが見つかりません。パスを手動で指定してください。", vbExclamation
        Exit Sub
    End If

    MsgBox "使用するパス: " & acrobatPath

    '--- このパスを使って印刷を実行 ---
    Dim pdfPath As String
    pdfPath = "C:\PDF\sample.pdf"
    Shell """" & acrobatPath & """ /t """" & pdfPath & """"", vbHide
End Sub

また、64ビット版OfficeでDeclareステートメントを使ったAPI呼び出しをしている場合は、PtrSafeキーワードの追加が必要です。

'--- 32ビット版の記述 ---
Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
    (ByVal hwnd As Long, ByVal lpOperation As String, _
     ByVal lpFile As String, ByVal lpParameters As String, _
     ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

'--- 64ビット版の記述(PtrSafeを追加) ---
Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
    (ByVal hwnd As LongPtr, ByVal lpOperation As String, _
     ByVal lpFile As String, ByVal lpParameters As String, _
     ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPtr
64ビット対応のチェックリスト
  • AcroRd32.exeのパスが正しいか確認(新版はAcrobat.exeの場合あり)
  • Program Files と Program Files (x86) の両方をチェック
  • DeclareステートメントにPtrSafeキーワードを追加
  • Long型をLongPtr型に変更(ポインタ変数の場合)

PDF印刷後にAcrobatが閉じない場合の対処法

Shell方式でPDFを印刷した後、Adobe Readerのプロセスが残り続けてしまうことがあります。特に一括印刷でループ処理をしていると、Acrobatのプロセスが大量に残ってメモリを圧迫する原因になります。

Sub Acrobatプロセスを終了させる()
    Dim pdfPath As String
    Dim acrobatPath As String

    pdfPath = "C:\PDF\sample.pdf"
    acrobatPath = "C:\Program Files\Adobe\Acrobat DC\Reader\AcroRd32.exe"

    '--- 印刷実行 ---
    Shell """" & acrobatPath & """ /t """" & pdfPath & """"", vbHide

    '--- 印刷完了まで待機 ---
    Application.Wait Now + TimeValue("00:00:05")

    '--- taskkillコマンドでAcrobatプロセスを終了 ---
    Shell "taskkill /IM AcroRd32.exe /F", vbHide
End Sub
Sub 一括印刷でプロセス管理()
    Dim folderPath As String
    Dim pdfFile As String
    Dim acrobatPath As String
    Dim count As Long

    folderPath = "C:\PDF\印刷対象\"
    acrobatPath = "C:\Program Files\Adobe\Acrobat DC\Reader\AcroRd32.exe"
    count = 0

    pdfFile = Dir(folderPath & "*.pdf")

    Do While pdfFile <> ""
        Shell """" & acrobatPath & """ /t """" & folderPath & pdfFile & """"", vbHide
        count = count + 1
        Application.Wait Now + TimeValue("00:00:03")

        '--- 5件ごとにプロセスを整理 ---
        If count Mod 5 = 0 Then
            Shell "taskkill /IM AcroRd32.exe /F", vbHide
            Application.Wait Now + TimeValue("00:00:02")
        End If

        pdfFile = Dir()
    Loop

    '--- 最後にプロセスをクリーンアップ ---
    Application.Wait Now + TimeValue("00:00:03")
    Shell "taskkill /IM AcroRd32.exe /F", vbHide

    MsgBox count & "件のPDFを印刷しました"
End Sub

taskkillコマンドは強制終了のため、他の用途でAcrobat Readerを開いている場合はそちらも閉じてしまう点に注意してください。業務時間外のバッチ処理で使うのが安全です。

実務で使えるPDF印刷自動化の活用例

ここまでの知識を組み合わせて、実際の業務で活用できるマクロを2つ紹介します。そのままコピペして使うことも、自分の業務に合わせてカスタマイズすることもできます。

請求書を毎月一括PDF印刷するマクロ

毎月の請求書PDFを一括印刷するマクロです。「年月」フォルダから該当月の請求書を自動で検索して印刷します。

Sub 請求書を月次一括印刷()
    Dim basePath As String
    Dim yearMonth As String
    Dim folderPath As String
    Dim pdfFile As String
    Dim acrobatPath As String
    Dim printerName As String
    Dim count As Long
    Dim errorCount As Long

    '--- 設定値 ---
    basePath = "C:\請求書\"
    acrobatPath = "C:\Program Files\Adobe\Acrobat DC\Reader\AcroRd32.exe"
    printerName = "Brother MFC-J6583CDW"

    '--- 対象年月をInputBoxで指定(例: 202401) ---
    yearMonth = InputBox("印刷する年月を入力してください(例: 202401)", "年月指定", Format(Date, "yyyymm"))
    If yearMonth = "" Then Exit Sub

    folderPath = basePath & yearMonth & "\"

    '--- フォルダの存在確認 ---
    If Dir(folderPath, vbDirectory) = "" Then
        MsgBox "フォルダが見つかりません: " & folderPath, vbExclamation
        Exit Sub
    End If

    count = 0
    errorCount = 0

    pdfFile = Dir(folderPath & "*.pdf")

    Do While pdfFile <> ""
        On Error Resume Next
        Shell """" & acrobatPath & """ /t """" & folderPath & pdfFile & """ """" & printerName & """"", vbHide

        If Err.Number <> 0 Then
            errorCount = errorCount + 1
            Debug.Print "印刷エラー: " & pdfFile & " - " & Err.Description
            Err.Clear
        Else
            count = count + 1
        End If
        On Error GoTo 0

        Application.Wait Now + TimeValue("00:00:03")
        pdfFile = Dir()
    Loop

    '--- プロセスのクリーンアップ ---
    Application.Wait Now + TimeValue("00:00:05")
    Shell "taskkill /IM AcroRd32.exe /F", vbHide

    '--- 結果を表示 ---
    MsgBox yearMonth & "月の請求書印刷が完了しました" & vbCrLf & _
           "成功: " & count & "件" & vbCrLf & _
           "エラー: " & errorCount & "件"
End Sub

請求書の印刷は毎月の定型業務です。このマクロを使えば、フォルダを指定するだけで一括印刷できるので、月末の作業が大幅に効率化されます。

日次レポートを定時に自動印刷する仕組み

ExcelのWorkbook_Openイベントとタスクスケジューラを組み合わせることで、毎日決まった時間にレポートを自動印刷する仕組みを構築できます。

'--- 標準モジュールに記述 ---
Sub 日次レポートを印刷()
    Dim ws As Worksheet
    Dim savePath As String
    Dim printerName As String

    Set ws = ThisWorkbook.Worksheets("日次レポート")
    savePath = "C:\レポート\日次\日次レポート_" & Format(Date, "yyyymmdd") & ".pdf"
    printerName = "Brother MFC-J6583CDW"

    '--- レポートデータを更新(外部データの取り込みなど) ---
    ws.Range("B2").Value = Date
    ws.Calculate

    '--- PDF保存 ---
    ws.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=savePath, _
        Quality:=xlQualityStandard

    '--- 物理プリンタに印刷 ---
    Dim originalPrinter As String
    originalPrinter = Application.ActivePrinter

    On Error Resume Next
    Application.ActivePrinter = printerName
    On Error GoTo 0

    ws.PrintOut Copies:=1
    Application.ActivePrinter = originalPrinter

    '--- ログに記録 ---
    Dim logWs As Worksheet
    Set logWs = ThisWorkbook.Worksheets("印刷ログ")
    Dim lastRow As Long
    lastRow = logWs.Cells(logWs.Rows.count, 1).End(xlUp).Row + 1
    logWs.Cells(lastRow, 1).Value = Now
    logWs.Cells(lastRow, 2).Value = "日次レポート"
    logWs.Cells(lastRow, 3).Value = savePath
    logWs.Cells(lastRow, 4).Value = "成功"

    ThisWorkbook.Save
End Sub
'--- ThisWorkbookモジュールに記述 ---
Private Sub Workbook_Open()
    '--- ファイルを開いたら自動で日次レポートを印刷 ---
    Call 日次レポートを印刷

    '--- 印刷完了後にファイルを閉じる(バッチ処理用) ---
    Application.Wait Now + TimeValue("00:00:10")
    ThisWorkbook.Close SaveChanges:=True
End Sub

WindowsのタスクスケジューラでこのExcelファイルを毎朝自動で開くように設定すれば、出社前にレポートが印刷されている仕組みが完成します。タスクスケジューラの設定手順は以下のとおりです。

  • 「タスクスケジューラ」を開き、「基本タスクの作成」をクリック
  • トリガーで「毎日」を選択し、開始時刻を設定(例: 07:00)
  • 操作で「プログラムの開始」を選び、Excelファイルのフルパスを指定
  • PCの電源が入っている必要があるため、スリープ解除の設定も確認する

よくある質問(FAQ)

VBAでPDFを印刷するにはAdobe Acrobat Proが必須ですか?

いいえ、必須ではありません。無料のAdobe Readerでも Shell方式(AcroRd32.exe)を使えばPDF印刷が可能です。ただしAcrobat API方式(CreateObject(“AcroExch.App”))を使う場合はAcrobat Proが必要になります。コストを抑えたい場合はShell方式がおすすめです。

VBAでPDFを一括印刷するとき、印刷順序を制御できますか?

はい、可能です。Dir関数やFileSystemObjectでファイル一覧を取得した後、配列に格納してソート処理を加えることで任意の順序で印刷できます。ファイル名順、日付順、サイズ順など、業務に合った順序を指定できます。

64ビット版のWindows/OfficeでVBA PDF印刷が動きません。どうすれば良いですか?

64ビット版では従来のAcroRd32.exeではなくAcrobat.exeに変更されている場合があります。まずAdobe Readerのインストール先を確認し、実行ファイル名を変更してください。また、VBAのDeclareステートメントにPtrSafeキーワードの追加が必要な場合もあります。本記事の「64ビット環境で動かない場合の対処法」セクションで詳しく解説しています。

VBAでPDF印刷時に両面印刷や部数を指定できますか?

PrintOutメソッドのCopiesパラメータで部数指定が可能です。両面印刷はプリンタ側の設定に依存しますが、対応プリンタであればPageSetupオブジェクトのDuplexプロパティで制御できます。Shell方式の場合は、プリンタのデフォルト設定に依存します。

ExportAsFixedFormatとPrintOutの違いは何ですか?

ExportAsFixedFormatはExcelシートをPDFファイルとして保存するメソッドです。一方PrintOutは物理プリンタに印刷するメソッドで、Microsoft Print to PDFを指定すればPDFファイルとしても出力できます。既存のPDFファイルを印刷したい場合はShell方式またはAcrobat API方式を使用してください。

まとめ

本記事では、VBAでPDFを印刷する3つの方法と実務で使えるサンプルコードを紹介しました。最後に要点を整理します。

この記事のまとめ
  • Shell方式:無料のAdobe Readerで使える。既存PDFの印刷に最適。/tオプションで開かずに印刷が可能
  • Acrobat API方式:Acrobat Pro必須だが高度なPDF制御が可能。ページ単位の操作やメタ情報の取得もできる
  • ExportAsFixedFormat:ExcelシートをPDFに変換して保存。Adobe不要で使える
  • 一括印刷:Dir関数でフォルダ内のPDFを列挙し、ループ処理で順番に印刷する
  • エラー対策:ファイルパスの存在確認やエラーハンドリングを必ず入れる。64ビット環境ではパスとPtrSafeに注意
  • プロセス管理:一括印刷時はtaskkillでAcrobatプロセスを定期的にクリーンアップする

まずは自分の環境(Adobe Readerの有無、Acrobat Proの有無)に合った方法を選んで、サンプルコードをコピペして動作確認してみてください。Shell方式から始めれば、無料で今すぐPDF印刷の自動化を始められます。

VBAの基礎や関連するテクニックをもっと学びたい方は、以下の記事もあわせてご覧ください。

PDF印刷の自動化は、一度マクロを作ってしまえば毎月の定型業務が一瞬で終わるようになります。ぜひ今回のコードを活用してみてくださいね。

記事を取得できませんでした
記事を取得できませんでした
記事を取得できませんでした
記事を取得できませんでした
記事を取得できませんでした
記事を取得できませんでした
記事を取得できませんでした
記事を取得できませんでした
記事を取得できませんでした
記事を取得できませんでした
期間限定でChatGPT✖️Googleスプレットシートのコンテンツ配布中!

LINEでExcelを気軽に学べる

しんたろ。
しんたろ。
Excel歴10年以上 → アプリ開発者
Profile
大手メーカーに15年以上勤務。製造部門で海外拠点の立ち上げ支援や、現場責任者として採算管理・納期管理・設備オペレートを経験。 2023年にDX人材育成プログラム第1期生として活動後、現在は製造現場のスケジュール運用を支えるアプリの企画・開発をメインに活動中。工程表示表作成の内製化SaaSを構築し、年間1,300万円のコスト改善を実現。 Excelによる業務改善で年間240時間の残業削減を達成した経験を活かし、ブログやSNSでも情報発信しています。
プロフィールを読む
ABOUT ME
しんたろ。
しんたろ。
Excel歴10年以上 → アプリ開発者
大手メーカーに15年以上勤務。製造部門で海外拠点の立ち上げ支援や、現場責任者として採算管理・納期管理・設備オペレートを経験。 2023年にDX人材育成プログラム第1期生として活動後、現在は製造現場のスケジュール運用を支えるアプリの企画・開発をメインに活動中。工程表示表作成の内製化SaaSを構築し、年間1,300万円のコスト改善を実現。 Excelによる業務改善で年間240時間の残業削減を達成した経験を活かし、ブログやSNSでも情報発信しています。
記事URLをコピーしました