Django Girls and Boys 備忘録

Python、Selenium、Django、java、iPhoneアプリ、Excelマクロなどで気付いたこと、覚えておきたいことなどを載せていきます。

【Excel VBA】PDFを結合する方法(マクロで複数PDFを1つにまとめる)

Excel VBAで作業していると、

  • 複数のPDFを1つにまとめたい
  • シートごとに出力したPDFを結合したい
  • 月次レポートを1つのPDFにしたい

という場面があります。

例えば、

 
売上.pdf
在庫.pdf
集計.pdf

 

を、

 
まとめ.pdf
 
のようにしたいケースです。

この記事では、Excel VBAでPDFを結合する方法を例を挙げて説明します。


まず結論:VBAだけではPDF結合できない

ここが重要です。

Excel VBAには、

 
複数のPDFを結合する標準機能
 

がありません。

そのため、PDF結合をするには次のどちらかを使います。


方法① Adobe Acrobatを使う(本格的)

Adobe Acrobat(有料版)が入っていれば、
VBAからPDF結合ができます。

Adobe Readerではできません


方法② 最初からExcelでまとめてPDF化する(おすすめ)

もし元データがExcelなら、

 
PDFを後から結合する
 

よりも、

 
最初からまとめてPDF化する
 

方が簡単です。

この記事では両方紹介します。


方法① Adobe Acrobatを使ってPDFを結合する

サンプルコード

そのまま貼り付けて使えます。

 
Sub MergePDFs()
    Dim AcroApp As Object
    Dim MainPDF As Object
    Dim TempPDF As Object
    Dim files As Variant
    Dim i As Long

    ' 結合するPDF一覧
    files = Array( _
        "C:\Test\1.pdf", _
        "C:\Test\2.pdf", _
        "C:\Test\3.pdf" _
    )

    ' Acrobat起動
    Set AcroApp = CreateObject("AcroExch.App")
    Set MainPDF = CreateObject("AcroExch.PDDoc")

    ' 最初のPDFを開く
    MainPDF.Open files(0)

    ' 2つ目以降を追加
    For i = 1 To UBound(files)
        Set TempPDF = CreateObject("AcroExch.PDDoc")
        TempPDF.Open files(i)
        MainPDF.InsertPages _
            MainPDF.GetNumPages - 1, _
            TempPDF, _
            0, _
            TempPDF.GetNumPages, _
            True
        TempPDF.Close
    Next i

    ' 保存
    MainPDF.Save 1, "C:\Test\merged.pdf"
    ' 終了
    MainPDF.Close
    AcroApp.Exit

End Sub

 


実行結果

次のPDFが

 
1.pdf
2.pdf
3.pdf

 

 
merged.pdf

 

として結合されます。


コードのポイント

PDF一覧を指定

 
files = Array(
    "C:\Test\1.pdf",
    "C:\Test\2.pdf"
)

 

ここに結合したいPDFを並べます。


ページを追加

 
MainPDF.InsertPages

 

これがPDFを結合している部分です。


最後に保存

 
MainPDF.Save

 

これで1つのPDFになります。


注意点

Adobe Acrobat(有料)が必要

これは必須です。

 
Adobe Acrobat Reader では不可
 

です。


PDFファイルが開いていると失敗することがある

事前に閉じておきましょう。


方法② Excelで最初からまとめてPDF化する(おすすめ)

もし元データがExcelでそれをPDF化したいならこちらが簡単です。


コード例

 
Sub ExportAllSheetsToOnePDF()

    Dim folderPath As String

    folderPath = "C:\Test\"
    Worksheets.Select
    ActiveSheet.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=folderPath & "all.pdf"

End Sub

 


実行結果

複数シートが

 
all.pdf

 

として1つにまとまります。


どちらを使うべき?

方法 おすすめ
既にPDFがある Acrobatで結合
Excelデータから作る まとめてPDF化

まとめ

Excel VBA単体では、

 
PDFを直接結合できない
 

ので、

  • Adobe Acrobatを使う
    または
  • 最初からまとめてPDF化する

のどちらかを使います。