複数のAcrobat PDFのファイルを一つに結合するとき、一つずつファイルを結合していては時間がかかります。
そこで、エクセルマクロを使って、複数のPDFを自動で一つのPDFに結合する方法を紹介します。
ただPDFを結合するだけではなく、フォルダ内のすべてのPDFを並んでいる順番に結合するコードを解説します。
目次
VBAを使って、特定フォルダ内の複数のAcrobatPDFファイルを一つに結合
この記事で紹介するプログラムを使ってできることを説明します。
カンタンにいうと、以下のフォルダの赤枠で囲われたPDFファイルを一つのPDFファイルにまとめます。
そのとき、以下の4つのことも可能にします。
[1] エクセルが保管されているフォルダ内のすべてのPDFファイルを結合
[2] フォルダ内で並んでいる順番にPDFファイルを結合
[3] フォルダ内のPDF以外のファイルがあっても、自動で除外(ワードやエクセルファイルがあってもエラーがでない)
[4] 結合したファイルは、同じファルダに保存
このマクロを使うと、以下のように結合した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を一つにまとめるプログラム
ここから紹介するプログラムは、エクセルと同じ階層に保管されているPDFファイルを結合します。
そのとき、フォルダ内の上から順番に結合していきます。そのため、結合したい順番に並ぶように、事前にPDFファイルの名前を変更しておく必要があります。
それでは、プログラムを紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
Option Explicit '---コード1|フォルダ内のPDFファイルをファイル名称で取得するためのおまじない Declare Function StrCmpLogicalW Lib SHLWAPI.DLL (ByVal lpStr1 As String, ByVal lpStr2 As String) As Long '---コード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 Debug.Print st(i) 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 Debug.Print tmp Debug.Print st(i) Debug.Print st(j) End If Next Next '---コード4|名前順にPDFファイルを結合していく Dim AcroPDDocNew As New Acrobat.AcroPDDoc Dim AcroPDDocAdd As New Acrobat.AcroPDDoc Dim acroid As Long Dim acroGetPages As Long Dim acroPages As Long acroPages = 0 acroid = AcroPDDocNew.Create() Dim f As Variant For Each f In st acroid = AcroPDDocAdd.Open(f) acroGetPages = AcroPDDocAdd.GetNumPages() acroid = AcroPDDocNew.InsertPages(acroPages - 1, AcroPDDocAdd, 0, acroGetPages, True) acroid = AcroPDDocAdd.Close() acroPages = acroPages + acroGetPages Next savepath = filepath ; \combined.pdf '結合したPDFファイルを最後に保存する acroid = AcroPDDocNew.Save(1, savepath) acroid = AcroPDDocNew.Close() 'オブジェクトを強制開放する Set AcroPDDocAdd = Nothing Set AcroPDDocNew = Nothing End Sub |
以下、プログラムの解説を行います。
コード1|フォルダ内のPDFファイルをファイル名称で取得するためのおまじない
1 2 3 |
Option Explicit '---コード1|フォルダ内のPDFファイルをファイル名称で取得するためのおまじない Declare Function StrCmpLogicalW Lib SHLWAPI.DLL (ByVal lpStr1 As String, ByVal lpStr2 As String) As Long |
このプログラムは、フォルダ内のファイルを名前順に変更するときに使うコード2で使います。おまじないようなものです。
実は、FSOを使うと、フォルダ内のファイルを並んでいる順番で読みこんでくれるとは限りません。そのため、ファイルが並んでいる順番(名前順)で、処理できるように、このおまじないを利用します。
コード2|フォルダ内のPDFファイルだけを抽出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
'---コード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 Debug.Print st(i) i = i + 1 End If Next |
このプログラムは、FSO(File System Object)を利用して、エクセルが保管されているフォルダ内のファイルをすべて処理するプログラムです。
すべてのファイルを処理し、If fs.GetExtensionName(path:=mysubfile) = “pdf” Then を使って、拡張子がpdfのものだけを配列に入れ込みます。
コード3|抽出したPDFファイルに配列を利用して、名前順に並び替える
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
'---コード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 Debug.Print tmp Debug.Print st(i) Debug.Print st(j) End If Next Next |
コード2で配列にフォルダ内の拡張子がpdfのファイルを取得しました。コード3では、それらをファイル名の順番に入れ替えます。
なぜ、この処理が必要かというと、フォルダ内のすべてのファイルを処理するとき、並んでいる順番に処理してくれるワケではないからです。
そのため、このプログラムを入れ込んで、ファイルがフォルダ内に並んでいる順番に処理されるように一手間加えてやる必要があります。
このプログラムでやっていることは、ファイル名称を総当たりで比較して、ファイルの名前が上に来ているものを最初にもってくることです。
コード4|名前順にPDFファイルを結合していく
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
'---コード4|名前順にPDFファイルを結合していく Dim AcroPDDocNew As New Acrobat.AcroPDDoc Dim AcroPDDocAdd As New Acrobat.AcroPDDoc Dim acroid As Long Dim acroGetPages As Long Dim acroPages As Long acroPages = 0 acroid = AcroPDDocNew.Create() Dim f As Variant For Each f In st acroid = AcroPDDocAdd.Open(f) acroGetPages = AcroPDDocAdd.GetNumPages() acroid = AcroPDDocNew.InsertPages(acroPages - 1, AcroPDDocAdd, 0, acroGetPages, True) acroid = AcroPDDocAdd.Close() acroPages = acroPages + acroGetPages Next savepath = filepath ; \combined.pdf '結合したPDFファイルを最後に保存する acroid = AcroPDDocNew.Save(1, savepath) acroid = AcroPDDocNew.Close() 'オブジェクトを強制開放する Set AcroPDDocAdd = Nothing Set AcroPDDocNew = Nothing End Sub |
PDFファイルを結合していきます。流れとしては、最初に空のPDFファイルを作成し、そのPDFファイルにコード3で並び替えたPDFファイルをつなげます。
ファイルは、combined.pdfという名前で、同じフォルダに保存されます。
savepath = filepath ; “\combined.pdf”
のcombinedの部分を変更することで、保存名を変更できます。
VBAを使ったPDF操作について、もっと知りたいなら
エクセルVBAを使ったPDF操作する方法について、解説した記事を紹介します。
エクセルマクロVBAで指定したフォルダ内のPDFをすべて開く方法
PDF解析を習得より、基礎作りが先決
エクセルVBAを使ったPDFの一括結合の方法について、事例で紹介しました。今回の内容をぜひVBAの勉強に活かしてみてください。
ここで、紹介したコードを編集して利用すれば、VBAでPDFを解析することもできるでしょう。ぜひ、あなたがやりたいことに応用してください。
しかし、このコードを編集するといっても、「私にできるかな、、、」と感じている方もいるかもしれません。もし、そのように感じているなら、それはマクロの基本がまだできていません。
実際、エクセルVBA初心者がPDF操作でエラーを起こすと、一人で解決するのはムズカシイでしょう。その理由は、エクセルVBAの基本を理解していないからです。
もし、VBAの基本を知っておけば、PDFだけでなくアウトルックやIE操作も本当の意味で理解できるようになります。
そのため、PDF操作をきちんと学ぶなら、基礎作りが先決です。土台ができていない内に学ぶと、使いこなす前に挫折にしてしまいます。
もしきちんと学ぶなら、こちらの無料動画がオススメです。基礎を確実に学んでから、トライしてみてください。
「マクロの力を実感したい」と感じているなら、こちらの記事がオススメです。マクロが入ったエクセルファイルをダウンロードできるようにしています。もし詳細が知りたいなら、以下の記事で紹介していますので、合わせて読んでみてください。
サンプル1|月末処理の自動処理する
サンプル2|エクセルで在庫管理するマクロ
サンプル3|outlookのメールを自動送信する
サンプル4|outlookの受信メールをエクセルに一覧にして、添付ファイルも保管する
サンプル5|エクセルマクロVBAで大量データを比較・照合してマッチングする方法
サンプル6|ウェブの情報を自動取得して、エクセルに出力する
サンプル7|エクセルの情報をワードに差し込み、印刷まで行う
ぜひご活用ください。