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
/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関数の引数(ダブルクォーテーションのエスケープ)を見直す |
| 429 | ActiveXコンポーネントはオブジェクトを作成できない | 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
- 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)
いいえ、必須ではありません。無料のAdobe Readerでも Shell方式(AcroRd32.exe)を使えばPDF印刷が可能です。ただしAcrobat API方式(CreateObject(“AcroExch.App”))を使う場合はAcrobat Proが必要になります。コストを抑えたい場合はShell方式がおすすめです。
はい、可能です。Dir関数やFileSystemObjectでファイル一覧を取得した後、配列に格納してソート処理を加えることで任意の順序で印刷できます。ファイル名順、日付順、サイズ順など、業務に合った順序を指定できます。
64ビット版では従来のAcroRd32.exeではなくAcrobat.exeに変更されている場合があります。まずAdobe Readerのインストール先を確認し、実行ファイル名を変更してください。また、VBAのDeclareステートメントにPtrSafeキーワードの追加が必要な場合もあります。本記事の「64ビット環境で動かない場合の対処法」セクションで詳しく解説しています。
PrintOutメソッドのCopiesパラメータで部数指定が可能です。両面印刷はプリンタ側の設定に依存しますが、対応プリンタであればPageSetupオブジェクトのDuplexプロパティで制御できます。Shell方式の場合は、プリンタのデフォルト設定に依存します。
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印刷の自動化は、一度マクロを作ってしまえば毎月の定型業務が一瞬で終わるようになります。ぜひ今回のコードを活用してみてくださいね。





LINEでExcelを気軽に学べる
