複数のAcrobat PDFのファイルを印刷するとき、一つずつ印刷していると時間がかかります。しかし、マクロを使えば、ボタン一つでカンタンに印刷することができます。
そこで、エクセルマクロを使って、フォルダ内のPDFファイルを上から順番に自動で連続印刷する方法を紹介します。
- VBAを使って、特定フォルダ内のAcrobatPDFファイルを連続印刷する
- VBAのプログラムを作る前にAcrobat、FSO操作の参照設定を行う
- フォルダ内のPDFを一括で印刷するVBAプログラム
- VBAを使ったPDF操作について、もっと知りたいなら
- PDF操作を習得より、VBA基礎作りが先決
VBAを使って、特定フォルダ内のAcrobatPDFファイルを連続印刷する
この記事で紹介するプログラムを使ってできることを説明します。
VBAで特定のフォルダにある複数のPDFを自動で印刷する
具体的にいうと、以下のフォルダの赤枠で囲われたPDFファイルを印刷します。
そのとき、以下の3つのことも可能にします。
[1] エクセルが保管されているフォルダ内のすべてのPDFファイルを印刷
[2] フォルダ内で並んでいる順番に印刷
[3] フォルダ内のPDF以外のファイルがあっても、自動で除外(ワードやエクセルファイルがあってもエラーがでない)
なお、印刷条件としては、以下の2つです。
・手動でPDFを印刷するときに、設定されているプリンター
・全てのページを印刷
VBAのプログラムを作る前にAcrobat、FSO操作の参照設定を行う
エクセルVBAでPDFを操作するためのプログラミングに入る前に、準備することがあります。
それは、VBEの参照設定を変更することです。参照設定とは、機能拡張のことです。
このプログラムを使うのには、参照設定で以下の2つをライブラリに追加する必要があります。
1.VBEを開いて頂いて、「ツール」→「参照設定」
2.この二つのライブラリにチェックを入れて、OKをクリック
・Acrobat
・Microsoft Scripting Runtime
この設定を変更しないとマクロが動きません。忘れずに設定するようにしてください。
操作手順|VBEの参照設定でAcrobatとMicrosoft Scripting Runtimeを追加
VBAでPDFを操作できるようにするために、AcrobatとMicrosoft Scripting Runtimeにチェックを入れます。
具体的な設定方法は以下の通りです。
1.VBEを開いて、「ツール」→「参照設定」
2.以下の2項目にチェックを入れて、OKをクリック
・Acrobat
・Microsoft Scripting Runtime
Acrobatはこちら
MicroSoft Scripting Runtimeはこちら
なお、VBAでフォルダを操作できるようにするために、Microsoft Scripting Runtimeにチェックを入れます。
Microsoft Scripting Runtimeにチェックを入れる理由は、 この記事で紹介するプログラムが、特定フォルダ内のすべてのPDFファイルを読み込む際に、Microsoft Scripting Runtimeを利用するからです。
注意|Acrobat操作には、Acrobat Proを利用する必要がある
あなたが使っているパソコンにAcrobat Readerしか含まれていなかったとしたら、VBAでPDF操作はできません。
そのため、PDFを操作する場合は、Acrobat Proを購入しておく必要があります。参照設定で、Acrobatをチェックできないならば、Acrobat Proに登録されていないことを意味しています。
したがって、こちらからアクセスして試すことができます。なお、Acrobat Standardでも可能だと思われますが、検証しておりません。
フォルダ内のPDFを一括で印刷するVBAプログラム
ここから紹介するプログラムは、エクセルと同じ階層に保管されているPDFファイルを結合します。
そのとき、フォルダ内の上から順番に結合していきます。そのため、結合したい順に、PDFファイルの名前を変更しておく必要があります。
それでは、プログラムを紹介します。
Option Explicit '---コード1|フォルダ内のPDFファイルをファイル名称で取得するためのおまじない Declare Function StrCmpLogicalW Lib "SHLWAPI.DLL" (ByVal lpStr1 As String, ByVal lpStr2 As String) As Long '---コード2|フォルダ内のPDFファイルだけを抽出 Sub Print_PDFs() Dim i As Long Dim fs As FileSystemObject Dim basefolder As Scripting.Folder Dim filepath As String Dim st() As String Dim mysubfiles As Scripting.Files Dim mysubfile As Scripting.File Set fs = New Scripting.FileSystemObject filepath = ThisWorkbook.path Set basefolder = fs.GetFolder(filepath) Set mysubfiles = basefolder.Files i = 0 For Each mysubfile In mysubfiles If fs.GetExtensionName(path:=mysubfile) = "pdf" Then ReDim Preserve st(i) st(i) = mysubfile.path i = i + 1 End If Next '---コード3|抽出したPDFファイルを配列を利用して、名前順に並び替える Dim j As Long Dim tmp As String For i = 0 To UBound(st) For j = i To UBound(st) Debug.Print st(i), st(j) If StrCmpLogicalW(StrConv(st(i), vbUnicode), StrConv(st(j), vbUnicode)) > 0 Then tmp = st(i) st(i) = st(j) st(j) = tmp End If Next Next '---コード4|フォルダの名前順にPDFファイルを印刷していく Dim objAcroApp As New Acrobat.AcroApp Dim objAcroAVDoc As New Acrobat.AcroAVDoc Dim objAcroPDDoc As Acrobat.AcroPDDoc Dim Acroid As Long Acroid = objAcroApp.Show Dim f As Variant Dim str As String For Each f In st Acroid = objAcroAVDoc.Open(f, "") Set objAcroPDDoc = objAcroAVDoc.GetPDDoc() Dim Page As Long Page = objAcroPDDoc.GetNumPages Acroid = objAcroAVDoc.PrintPages(0, Page - 1, 2, 0, 0) If Acroid <> -1 Then str = str & vbCrLf & f Exit Sub End If Acroid = objAcroAVDoc.Close(False) Next Acroid = objAcroApp.Exit Set objAcroApp = Nothing Set objAcroPDDoc = Nothing Set objAcroAVDoc = Nothing '---コード5|印刷されなかったPDFファイルについてメッセージで知らせる If str <> "" Then MsgBox "以下のファイルは印刷できませんでした" & vbCrLf & str End If End Sub
以下、プログラムの解説を行います。
コード1|フォルダ内のPDFファイルをファイル名称で取得するためのおまじない
Option Explicit '---コード1|フォルダ内のPDFファイルをファイル名称で取得するためのおまじない Declare Function StrCmpLogicalW Lib "SHLWAPI.DLL" (ByVal lpStr1 As String, ByVal lpStr2 As String) As Long
このプログラムは、フォルダ内のファイルを名前順に変更するときに使うコード2で使います。おまじないようなものです。
実は、FSOを使うと、フォルダ内のファイルを並んでいる順番で読みこんでくれるとは限りません。そのため、ファイルが並んでいる順番(名前順)で、処理できるように、このおまじないを利用します。
コード2|フォルダ内のPDFファイルだけを抽出
'---コード2|フォルダ内のPDFファイルだけを抽出 Sub Combine_All_PDF() Dim i As Long Dim fs As FileSystemObject Dim basefolder As Scripting.Folder Dim filepath, savepath As String Dim st() As String Dim mysubfiles As Scripting.Files Dim mysubfile As Scripting.File Set fs = New Scripting.FileSystemObject filepath = ThisWorkbook.path Set basefolder = fs.GetFolder(filepath) Set mysubfiles = basefolder.Files i = 0 For Each mysubfile In mysubfiles If fs.GetExtensionName(path:=mysubfile) = "pdf" Then ReDim Preserve st(i) st(i) = mysubfile.path i = i + 1 End If Next
このプログラムは、FSO(File System Object)を利用して、エクセルが保管されているフォルダ内のファイルをすべて処理するプログラムです。
すべてのファイルを処理し、If fs.GetExtensionName(path:=mysubfile) = "pdf" Then を使って、拡張子がpdfのものだけを配列に入れ込みます。
コード3|抽出したPDFファイルを配列を利用して、名前順に並び替える
'---コード3|抽出したPDFファイルを配列を利用して、名前順に並び替える Dim j As Long Dim tmp As String For i = 0 To UBound(st) For j = i To UBound(st) Debug.Print st(i), st(j) If StrCmpLogicalW(StrConv(st(i), vbUnicode), StrConv(st(j), vbUnicode)) > 0 Then tmp = st(i) st(i) = st(j) st(j) = tmp End If Next Next
コード2で配列にフォルダ内の拡張子がpdfのファイルを取得しました。コード3では、それらをファイル名の順番に入れ替えます。
なぜ、この処理が必要かというと、フォルダ内のすべてのファイルを処理するとき、並んでいる順番に処理してくれるワケではないからです。
そのため、このプログラムを入れ込んで、ファイルがフォルダ内に並んでいる順番に処理されるように一手間加えてやる必要があります。
このプログラムでやっていることは、ファイル名称を総当たりで比較して、ファイルの名前が上に来ているものを最初にもってくることです。
コード4|フォルダの名前順にPDFファイルを印刷していく
'---コード4|フォルダの名前順にPDFファイルを印刷していく Dim objAcroApp As New Acrobat.AcroApp Dim objAcroAVDoc As New Acrobat.AcroAVDoc Dim objAcroPDDoc As Acrobat.AcroPDDoc Dim Acroid As Long Acroid = objAcroApp.Show Dim f As Variant Dim str As String For Each f In st Acroid = objAcroAVDoc.Open(f, "") Set objAcroPDDoc = objAcroAVDoc.GetPDDoc() Dim Page As Long Page = objAcroPDDoc.GetNumPages Acroid = objAcroAVDoc.PrintPages(0, Page - 1, 2, 0, 0) If Acroid <> -1 Then str = str & vbCrLf & f Exit Sub End If Acroid = objAcroAVDoc.Close(False) Next Acroid = objAcroApp.Exit Set objAcroApp = Nothing Set objAcroPDDoc = Nothing Set objAcroAVDoc = Nothing
PDFファイルを印刷します。流れは、コード3で並び替えたPDFファイル順に印刷していきます。
なお、うまく印刷されない場合があります。たとえば、パスワードロックがかかっていたり、ファイルが破損していたりする場合です。
そんなとき、印刷されていないファイルがどれか分かるように23行目~25行目で、印刷されなかったPDFのファイル名を拾うようにしています。
コード5|印刷されなかったPDFファイルについてメッセージで知らせる
'---コード5|印刷されなかったPDFファイルについてメッセージで知らせる If str <> "" Then MsgBox "以下のファイルは印刷できませんでした" & vbCrLf & str End If End Sub
コード4で印刷されなかったPDFのファイル名を拾いました。コード5では、そのファイルをメッセージとして知らせるようにしています。
印刷されなかったPDFファイルは、原因を探って、対処を考えます。
VBAを使ったPDF操作について、もっと知りたいなら
エクセルVBAを使ったPDF操作する方法について、解説した記事を紹介します。
エクセルマクロVBAで指定したフォルダ内のPDFをすべて開く方法
エクセルマクロVBAで指定したフォルダ内のPDFをすべて結合する方法
PDF操作を習得より、VBA基礎作りが先決
エクセルVBAを使ったPDFの一括印刷の方法について、事例で紹介しました。今回の内容をぜひVBAの勉強に活かしてみてください。
ここで、紹介したコードを編集して利用すれば、VBAでPDFを解析することもできるでしょう。ぜひ、あなたがやりたいことに応用してください。
しかし、PDF操作のプログラムを編集するといっても、「私にできるかな、、、」と感じている方もいるかもしれません。そのように感じているなら、それはマクロの基本がまだできていない証拠です。
実際、エクセルVBA初心者がPDF操作でエラーを起こすと、一人で解決するのはムズカシイでしょう。もし、このプログラムをみて、レベルが高いなと感じたら、VBAの基本から学びなおすことをオススメします。
VBAの基本が分かれば、PDFだけでなくアウトルックやIE操作も本当の意味で理解できるようになります。
きちんと学ぶなら、こちらの無料動画がオススメです。基礎を確実に学んでから、トライしてみてください。
「マクロの力を実感したい」と感じているなら、こちらの記事がオススメです。マクロが入ったエクセルファイルをダウンロードできるようにしています。もし詳細が知りたいなら、以下の記事で紹介していますので、合わせて読んでみてください。
サンプル1|月末処理の自動処理する
サンプル2|エクセルで在庫管理するマクロ
サンプル3|outlookのメールを自動送信する
サンプル4|outlookの受信メールをエクセルに一覧にして、添付ファイルも保管する
サンプル5|エクセルマクロVBAで大量データを比較・照合してマッチングする方法
サンプル6|ウェブの情報を自動取得して、エクセルに出力する
サンプル7|エクセルの情報をワードに差し込み、印刷まで行う
ぜひご活用ください。