VBAでPDFを結合する方法がわからない・・・
PDFを結合する作業を自動化したい・・・
事務作業をしていると、いくつかのPDFをまとめて1つの資料にしたいケースはよくありますよね。PDF専用の有料ツールをつかって結合することもできますが、数が多いと時間がかかってしまいますよね。できれば、VBAで自動化して作業効率化をはかりたい・・・と思っている人もいるのではないでしょうか。
こんにちは!フリーランスエンジニア兼テックライターのワキザカです。
この記事では、VBAでPDFを結合する方法について解説します!
ただVBAでPDFを結合する方法を解説するだけでなく、汎用性の高いツールにするテクニックも解説しているので、ぜひ最後まで見てみてくださいね!
この記事はこんな人のために書きました。
- VBAでPDFを結合する方法を知りたい人
- PDFの結合作業を効率化したい人
VBAでPDFを結合する方法とは?
はじめに、VBAでPDFを結合する方法について解説します。
PDFを結合する方法はいくつかありますが、おすすめはAdobeのAcrobat Proを使う方法です。信頼のおけるAdobe社が作ったツールですし、参照設定を追加すれば機能を簡単に使うことができます。
有料ですが無料体験期間もあるため、まずは無料で登録してからツールを作ってみて運用のしやすさで導入検討をしてみると良いかもしれませんね。
Acroabt Proのページはコチラ → https://acrobat.adobe.com/jp/ja/acrobat/acrobat-pro.html
無料で機能を作る方法もありますが、動作の保証がないためあまりおすすめはしません。個人で使う場合や、有料ツールを導入できない場合は、以下を使ってみると良いかもしれませんね。
引用:VBAでPDFファイルのページを分割(抽出)する[ExcelのTIPS]
※今回はAcrobat Proを導入していることを前提に、PDFの結合方法を解説します。
VBAでPDFを結合する処理を作る手順
次に、VBAでPDFを結合する処理を作る手順について解説します。
手順1:Acrobatを使うための参照設定追加
まずは、VBAからAcrobatの処理を書くための参照設定を追加します。
手順は、次のとおりです。
1. VBEのツールタブから参照設定を開く
2. 「Acrobat」「Microsoft Scripting Runtime」の2つを追加
選択したら、OKボタンをクリックして設定完了です。これで、VBAからAcrobatを操作する準備ができました。
次に、VBAでPDFを結合する処理を書いていきます。
手順2:PDFを結合する処理を作る
次に、VBAでPDFを結合する処理を作る方法について解説します。
処理を作る手順は、大きく分けて次の流れになります。
■PDFを結合する処理を作る手順
- 手順1:空のPDFファイルを作る
- 手順2:結合するPDFファイルを開く
- 手順3:結合するPDFファイルのページを空のPDFファイルに挿入
- 手順4:結合するPDFファイルを閉じる
- 手順5:結合したPDFファイルを保存して閉じる
※手順2 ~ 手順4を結合するファイルの数分ループ処理する
サンプルコードを元に解説しますね。
実行前のフォルダ:
サンプルコード:
Sub Test2() 'ファイル結合用の定数用意 Const folderPath = "C:UsersSiroDesktopPDF結合" 'フォルダパス Const outputFileName = "請求書PDF_結合版.pdf" '分割元のPDFファイル名 Const outputFilePath = folderPath & outputFileName '分割元のファイルパス Dim inputFileName(3) As String '出力するPDFファイル名のリスト inputFileName(0) = "請求書PDF_1.pdf" inputFileName(1) = "請求書PDF_2.pdf" inputFileName(2) = "請求書PDF_3.pdf" Dim inputFilePath As String '出力するファイルパス 'Acrobaの操作準備 Dim acrobatObjUnion As New Acrobat.AcroPDDoc '結合用に使うAcrobatオブジェクト Dim acrobatObjInsert As New Acrobat.AcroPDDoc '追加用に使うAcrobatオブジェクト Dim pdfID_Union As Long '結合用PDFのID Dim pdfID_Insert As Long '挿入用PDFのID Dim UniPageNum As Long: UniPageNum = 0 '結合PDFのページ数 Dim InsPageNum As Long: '挿入するページ数 '①空のPDFファイルを作成 pdfID_Union = acrobatObjUnion.Create() 'ファイル名のリスト数分、PDF結合処理をループ Dim i As Integer For i = 0 To UBound(inputFileName) - 1 '結合するファイルパスの計算 inputFilePath = folderPath & inputFileName(i) '②PDFファイルを開く pdfID_Insert = acrobatObjInsert.Open(inputFilePath) 'ページ数を取得 InsPageNum = acrobatObjInsert.GetNumPages() '③PDFファイルを結合 pdfID_Union = acrobatObjUnion.InsertPages(UniPageNum - 1, acrobatObjInsert, 0, InsPageNum, True) '④結合用に開いたPDFファイルを閉じる pdfID_Insert = acrobatObjInsert.Close() '結合ページ数に挿入したページ数を足す UniPageNum = UniPageNum + InsPageNum Next i '⑤別名でPDFファイルを保存し、ファイルを閉じる pdfID_Union = acrobatObjUnion.Save(PDSaveFull, outputFilePath) pdfID_Union = acrobatObjUnion.Close 'オブジェクトを強制開放する Set acrobatObjInsert = Nothing Set acrobatObjUnion = Nothing End Sub
実行後のフォルダ:
inputFileNameという名前の文字列型の配列を用意し、結合するファイル名を3つリストに用意しています。リストの数分ループ処理をすることで、PDFを結合しています。
ループ処理の中では、それぞれ以下のように書くことで① ~ ⑤の処理をしています。
1. 空のPDFファイルを作る
'①空のPDFファイルを作成 pdfID_Union = acrobatObjUnion.Create()
まず、「acrobatObjUnion.Create()」の処理で空のPDFファイルを作成しています。結合するための箱となるPDFファイルを用意しているイメージですね。以降の処理で、このファイルに結合するPDFのページを挿入していきます。
2. 結合するPDFファイルを開く
'②PDFファイルを開く pdfID_Insert = acrobatObjInsert.Open(inputFilePath)
次に、Openメソッドを使って上記のように結合するPDFファイルを開きます。
3. 結合するPDFファイルのページを空のPDFファイルに挿入
'③PDFファイルを結合 pdfID_Union = acrobatObjUnion.InsertPages(UniPageNum - 1, acrobatObjInsert, 0, InsPageNum, True)
その後、InsertPagesメソッドを使って結合ファイルのページを空のPDFファイルに挿入します。InsertPagesの引数の意味は以下のとおりです。
■InsertPages(引数1 , 引数2 , 引数3 , 引数4 , 引数5)の引数の意味
- 引数1:結合するPDFの開始ページ
- 引数2:挿入するPDFのオブジェクト
- 引数3:挿入するPDFの開始ページ
- 引数4:挿入するPDFのページ数
- 引数5:しおりの追加有無
結合するPDFの開始ページのみループ処理ごとに変わってくるので、直後に次のように再計算をしています。
'結合ページ数に挿入したページ数を足す UniPageNum = UniPageNum + InsPageNum
4. 結合するPDFファイルを閉じる
'④結合用に開いたPDFファイルを閉じる pdfID_Insert = acrobatObjInsert.Close()
ループ処理の最後に挿入するPDFファイルを閉じる処理を入れています。
5. 結合したPDFファイルを保存して閉じる
'⑤別名でPDFファイルを保存し、ファイルを閉じる pdfID_Union = acrobatObjUnion.Save(PDSaveFull, outputFilePath) pdfID_Union = acrobatObjUnion.Close
最後までループ処理が終わったら、最後に結合したPDFファイルを保存して閉じる処理を入れています。
このように、InsertPagesメソッドの引数の意味と使い方さえ覚えれば、簡単に結合処理を作ることができます。慣れるまでは大変かもしれませんが、ぜひ使ってみてくださいね!
ちなみに、結合したPDFファイルを分割する方法も以下で解説しています。合わせて覚えておくと汎用性が高まるので、おすすめです!
PDF結合処理を汎用性の高いツールにする方法
ここまで解説した方法を使えば、PDFの結合処理を作れます。ただ、このままだとVBAがわかる人しか使うことができないですよね。そのため、よりツールとして使いやすくするテクニックをご紹介します!
方法1:シートにボタンを設置して汎用性を高める
1つ目は、シートにボタンを設置する方法です。
VBAの処理は、次のようにボタンを設置して実行することができます。
こちらは請求書を登録・PDF出力するツールの例ですが、シートにボタンを設置して動かせるようになると、誰でも使えるツールにできるので作り方を覚えておくと便利です。以下で詳しく解説しているので、ぜひ使ってみてくださいね!
方法2:設定シートを利用して汎用性を高める
2つ目が、設定シートを利用する方法です。
結合するファイルの数や、結合するページの数などの結合ルールが変わることもありますよね。そのたびにVBAを使える人が修正するしか道がないと・・・開発者に負担がかかってしまいます。そのため、設定シートを用意して変更できるようにしておくのがおすすめです!
たとえば、上記のように設定シートの行数文結合処理が動くように作っておけば、設定シートを変更して実行するだけでルールを変更できますよね。このように、利用者が使いやすいようなシートを用意しておくのも一つの手です。
「データの最終行を取得する方法」+「For文でループ処理する方法」を使って、簡単に作ることができます。それぞれ以下で詳しく解説しているので、ぜひ見てみてくださいね!
方法3:ユーザーフォームで画面をつくって汎用性を高める
3つ目が、ユーザーフォームで画面をつくる方法です。
結合するデータが毎回変わるような場合は、設定シートを作っても毎回変更しないといけないので使い勝手が悪いですよね。そんな時は、画面を作って実行時にファイルを選べるようにするのがおすすめです!
上記の画面は請求書を出力するときに使うツールのイメージですが、一覧データから一番左のチェックボックスを選択し、選択したデータを使って処理を作ることができる画面です。これを使えば、結合するファイルを選択して処理を実行することができますよね。
毎回データが変わるようなケースでは、画面を用意したほうが使いやすさが上がります。
ユーザーフォームで画面を作る基礎的な使い方、上記のような一覧データをつかった画面を作るListViewの使い方はそれぞれ以下で解説しているので、ぜひ見て作ってみてくださいね!
まとめ
今回は、VBAでPDFを結合する方法を解説しました。
PDFの結合が自動化できれば、作業工数を削減することができます。
サンプルコードを使って使い方を覚えるだけでなく、応用テクニックも覚えてぜひ使いやすいツールを作ってみてくださいね!