【VBA】複数のPDFファイルを結合・ページ分割する方法(コピペOK)

VBA
スポンサーリンク

記事ID: 141
タイトル: 【VBA】複数のPDFファイルを結合・ページ分割する方法(コピペOK)
カテゴリ: ファイル操作
一次キーワード: VBA 複数PDF 結合 分割
想定読者: 月次報告書や請求書など、複数のPDFを1つにまとめたい実務担当者。手作業でPDFを結合している人
検索意図: VBAで複数のPDFファイルを結合したい。ページごとに分割もしたい
読者の悩み: 毎月の報告書PDFを手作業でAcrobatやオンラインツールで結合している。件数が多いと時間がかかる。自動化したい
読了後にできること: VBAで複数PDFの結合(Acrobat OLE/pdftk)、ExcelシートのPDF化→結合、ページ分割ができるようになる
前提条件:
  - Excel版: Excel 2016以降 / Microsoft 365
  - OS: Windows 10/11
  - 保存形式: .xlsm(マクロ有効ブック)
  - 貼り付け場所: 標準モジュール
  - 実行方法: Alt + F8 → マクロ実行
  - その他: 基本コード・実務版はAdobe Acrobat Standard/Pro(有料版)が必要。Acrobatなし環境向けの代替手段も解説
更新日: 2026-03-24

重要:この記事のPDF結合・分割コード(基本版・実務版)は、Adobe Acrobat Standard または Adobe Acrobat Pro(有料版)がインストールされている環境が前提です。 無料のAdobe Acrobat Readerでは動作しません。Acrobatがない場合の代替手段は記事後半で解説しています。

スポンサーリンク

この記事でできること

以前の自分は、毎月10個以上の部門別PDFを1つの報告書にまとめる作業をしていた。Acrobatで「ファイルを結合」を開いて、ドラッグ&ドロップして、順番を並べ替えて…を毎月やっていて、正直めんどくさかった。

この記事のVBAを使えば、フォルダ内の複数PDFを指定した順番で自動結合できる。ExcelシートをPDF化してから結合する方法もある。これを覚えてからは、月次報告書のPDF作成が5分で終わるようになった。

同じように「PDF結合を手作業でやるのが面倒」「毎月の定型作業を自動化したい」という人がラクになればうれしい。

  • 対象:複数PDFの結合・分割を自動化したい人。Acrobat Standard/Proを持っている人
  • 所要時間:コピペ → 実行まで約10分(目安)

どんな場面で使う?

  • 毎月の部門別PDFを1つの報告書にまとめたいとき
  • ExcelシートをPDF化してから複数ファイルを結合したいとき
  • フォルダ内のPDFファイルを指定順で自動結合したいとき
  • 大量のPDFをページごとに分割して個別配布したいとき

ExcelファイルをPDFに変換する方法は 【VBA】ExcelファイルをPDFに一括変換する方法 で解説している。本記事はその先のステップとしてPDF結合を扱う。

完成イメージ(Before / After)

Before(実行前)

フォルダ内に部門別のPDFが複数ある状態。


C:\報告書\
  ├── 01_営業部.pdf
  ├── 02_製造部.pdf
  ├── 03_品質管理部.pdf
  └── 04_総務部.pdf

After(実行後)

1つの結合PDFが自動生成される。


C:\報告書\
  ├── 01_営業部.pdf
  ├── 02_製造部.pdf
  ├── 03_品質管理部.pdf
  ├── 04_総務部.pdf
  └── 月次報告書_202603.pdf  ← 結合PDF(自動生成)

実行前の準備

バックアップを取る

対象フォルダ内のPDFをフォルダごとコピーしてバックアップを取ること。結合処理自体は元のPDFを変更しないが、万が一に備える。

Adobe Acrobatの確認

基本版・実務版のコードは Adobe Acrobat Standard または Pro(有料版) が必要。以下で確認する。

  1. Windowsの「設定」→「アプリ」→「インストールされているアプリ」
  2. 「Adobe Acrobat」 があればOK(「Adobe Acrobat Reader」だけではNG)

Acrobatがない場合は、記事後半の「Acrobatなし環境での代替手段」を参照。

Excelをマクロ有効ブック(.xlsm)で保存する

  1. 新しいExcelブックを開く
  2. 「ファイル」→「名前を付けて保存」
  3. ファイルの種類を 「Excel マクロ有効ブック (*.xlsm)」 に変更して保存

手順(コピペ → 実行まで約10分)

VBE(コードを書く画面)を開く

Excelで Alt + F11 を押す。

標準モジュールを挿入する

VBEの左側ツリーで自分のブック名を右クリック →「挿入」→「標準モジュール」。

コードを貼り付けて実行する

下のコードをコピーして、標準モジュールに貼り付ける。Alt + F8 でマクロ一覧を開き、実行する。

コード(基本版)– ExcelシートをPDF化して結合

まずこれで動く基本コード。現在のブックの複数シートを個別にPDF化し、Acrobat OLEで1つのPDFに結合する。


Sub シートPDF化して結合_基本()

    Dim ws As Worksheet
    Dim pdfFiles() As String
    Dim pdfCount As Long
    Dim outputFolder As String
    Dim mergedPath As String
    Dim i As Long

    ' ★ 出力先フォルダを書き換える(末尾に \ を付ける)
    outputFolder = "C:\出力先\"

    ' ★ 結合後のPDFファイル名
    mergedPath = outputFolder & "結合済み.pdf"

    ' --- フォルダ存在チェック ---
    If Dir(outputFolder, vbDirectory) = "" Then
        MkDir outputFolder
    End If

    ' --- 各シートをPDFに書き出し ---
    pdfCount = 0
    For Each ws In ThisWorkbook.Worksheets
        pdfCount = pdfCount + 1
        ReDim Preserve pdfFiles(1 To pdfCount)
        pdfFiles(pdfCount) = outputFolder & ws.Name & ".pdf"

        ws.ExportAsFixedFormat _
            Type:=xlTypePDF, _
            Filename:=pdfFiles(pdfCount), _
            Quality:=xlQualityStandard, _
            IncludeDocProperties:=False, _
            IgnorePrintAreas:=False, _
            OpenAfterPublish:=False
    Next ws

    If pdfCount < 2 Then
        MsgBox "シートが1つしかないため結合不要です。", vbInformation
        Exit Sub
    End If

    ' --- Acrobat OLE で PDF結合 ---
    Dim acroApp As Object
    Dim mainDoc As Object
    Dim tempDoc As Object

    Set acroApp = CreateObject("AcroExch.App")
    Set mainDoc = CreateObject("AcroExch.PDDoc")

    ' 1つ目のPDFを開く
    If Not mainDoc.Open(pdfFiles(1)) Then
        MsgBox "PDFを開けませんでした:" & pdfFiles(1), vbExclamation
        Exit Sub
    End If

    ' 2つ目以降を順番に結合
    For i = 2 To pdfCount
        Set tempDoc = CreateObject("AcroExch.PDDoc")
        If tempDoc.Open(pdfFiles(i)) Then
            ' mainDocの末尾にtempDocの全ページを挿入
            mainDoc.InsertPages _
                mainDoc.GetNumPages - 1, _
                tempDoc, _
                0, _
                tempDoc.GetNumPages, _
                0
            tempDoc.Close
        End If
        Set tempDoc = Nothing
    Next i

    ' 結合PDFを保存
    mainDoc.Save 1, mergedPath  ' 1 = PDSaveFull
    mainDoc.Close
    Set mainDoc = Nothing

    acroApp.Exit
    Set acroApp = Nothing

    ' --- 個別PDFを削除(不要な場合はコメントアウト) ---
    For i = 1 To pdfCount
        If Dir(pdfFiles(i)) <> "" Then Kill pdfFiles(i)
    Next i

    MsgBox "結合完了:" & mergedPath, vbInformation

End Sub

ポイント:

  • ExportAsFixedFormat で各シートを個別PDFに書き出し
  • AcroExch.PDDocInsertPages メソッドで結合
  • 結合後に個別PDFを削除(不要なら該当行をコメントアウト)
  • Adobe Acrobat Standard/Pro が必須(Readerでは CreateObject("AcroExch.App") がエラーになる)

ExcelをPDFに変換する詳細は 【VBA】ExcelファイルをPDFに一括変換する方法 を参照。

コード(実務版)– フォルダ内のPDFをAcrobat OLEで結合+ページ分割

自分はこの実務版を月次報告の仕組みに組み込んでいる。フォルダにPDFを入れてマクロを実行するだけで、ファイル名順に結合されて日付付きの報告書PDFが出来上がる。手作業でやっていた30分が1クリックになった。


Sub PDF結合_実務版()

    Dim fso As Object
    Dim folderPath As String
    Dim outputPath As String
    Dim fileName As String
    Dim fileList() As String
    Dim fileCount As Long
    Dim i As Long

    ' ★ PDF格納フォルダを書き換える(末尾に \ を付ける)
    folderPath = "C:\報告書\"

    ' ★ 結合後のPDFファイル名(日時付き)
    outputPath = folderPath & "月次報告書_" & Format(Now, "yyyyMM") & ".pdf"

    Set fso = CreateObject("Scripting.FileSystemObject")

    ' --- フォルダ存在チェック ---
    If Not fso.FolderExists(folderPath) Then
        MsgBox "フォルダが見つかりません:" & folderPath, vbExclamation
        Exit Sub
    End If

    ' --- PDFファイル一覧を取得(ファイル名順にソート済み前提) ---
    fileCount = 0
    fileName = Dir(folderPath & "*.pdf")
    Do While fileName <> ""
        ' 結合済みファイル自身は除外
        If InStr(1, fileName, "月次報告書_", vbTextCompare) = 0 Then
            fileCount = fileCount + 1
            ReDim Preserve fileList(1 To fileCount)
            fileList(fileCount) = folderPath & fileName
        End If
        fileName = Dir()
    Loop

    If fileCount < 2 Then
        MsgBox "結合対象のPDFが2つ以上必要です。" & vbCrLf & _
               "見つかったファイル数:" & fileCount, vbExclamation
        Exit Sub
    End If

    ' --- ファイル名で昇順ソート(バブルソート) ---
    Dim tmp As String
    Dim j As Long
    For i = 1 To fileCount - 1
        For j = i + 1 To fileCount
            If fileList(i) > fileList(j) Then
                tmp = fileList(i)
                fileList(i) = fileList(j)
                fileList(j) = tmp
            End If
        Next j
    Next i

    ' --- Acrobat OLE で PDF結合 ---
    Dim acroApp As Object
    Dim mainDoc As Object
    Dim tempDoc As Object

    On Error GoTo ErrHandler

    Set acroApp = CreateObject("AcroExch.App")
    Set mainDoc = CreateObject("AcroExch.PDDoc")

    ' 1つ目のPDFを開く
    If Not mainDoc.Open(fileList(1)) Then
        MsgBox "PDFを開けませんでした:" & fileList(1), vbExclamation
        GoTo CleanUp
    End If

    ' 2つ目以降を順番に結合
    For i = 2 To fileCount
        Set tempDoc = CreateObject("AcroExch.PDDoc")
        If tempDoc.Open(fileList(i)) Then
            mainDoc.InsertPages _
                mainDoc.GetNumPages - 1, _
                tempDoc, _
                0, _
                tempDoc.GetNumPages, _
                0
            tempDoc.Close
        Else
            Debug.Print "スキップ(開けない):" & fileList(i)
        End If
        Set tempDoc = Nothing
    Next i

    ' 結合PDFを保存
    mainDoc.Save 1, outputPath
    mainDoc.Close
    Set mainDoc = Nothing

    acroApp.Exit
    Set acroApp = Nothing

    MsgBox "結合完了(" & fileCount & "ファイル)" & vbCrLf & outputPath, vbInformation

    Set fso = Nothing
    Exit Sub

ErrHandler:
    MsgBox "エラーが発生しました:" & vbCrLf & Err.Description, vbExclamation

CleanUp:
    If Not mainDoc Is Nothing Then mainDoc.Close
    If Not acroApp Is Nothing Then acroApp.Exit
    Set mainDoc = Nothing
    Set acroApp = Nothing
    Set fso = Nothing

End Sub

ページ分割(1PDFを複数ページに分割)

結合の逆パターンとして、1つのPDFを1ページずつ別ファイルに分割するコード。


Sub PDFページ分割()

    Dim srcPath As String
    Dim outputFolder As String
    Dim acroApp As Object
    Dim srcDoc As Object
    Dim newDoc As Object
    Dim totalPages As Long
    Dim i As Long
    Dim outPath As String

    ' ★ 分割元のPDFパスを書き換える
    srcPath = "C:\報告書\月次報告書_202603.pdf"

    ' ★ 分割後の出力先フォルダ(末尾に \ を付ける)
    outputFolder = "C:\報告書\分割\"

    ' フォルダ作成
    If Dir(outputFolder, vbDirectory) = "" Then MkDir outputFolder

    On Error GoTo ErrHandler

    Set acroApp = CreateObject("AcroExch.App")
    Set srcDoc = CreateObject("AcroExch.PDDoc")

    If Not srcDoc.Open(srcPath) Then
        MsgBox "PDFを開けませんでした:" & srcPath, vbExclamation
        Exit Sub
    End If

    totalPages = srcDoc.GetNumPages

    For i = 0 To totalPages - 1
        Set newDoc = CreateObject("AcroExch.PDDoc")
        newDoc.Create

        ' 1ページだけ挿入
        newDoc.InsertPages -1, srcDoc, i, 1, 0

        outPath = outputFolder & "page_" & Format(i + 1, "000") & ".pdf"
        newDoc.Save 1, outPath
        newDoc.Close
        Set newDoc = Nothing
    Next i

    srcDoc.Close
    Set srcDoc = Nothing
    acroApp.Exit
    Set acroApp = Nothing

    MsgBox "分割完了(" & totalPages & "ページ)" & vbCrLf & outputFolder, vbInformation
    Exit Sub

ErrHandler:
    MsgBox "エラー:" & Err.Description, vbExclamation
    If Not srcDoc Is Nothing Then srcDoc.Close
    If Not acroApp Is Nothing Then acroApp.Exit
    Set srcDoc = Nothing
    Set acroApp = Nothing

End Sub

追加ポイント:

  • ファイル名でソートしてから結合するため、01_, 02_ 等のプレフィックスで順序制御できる
  • 結合済みファイル(月次報告書_)は自動でスキップ
  • エラーハンドリングで Acrobat オブジェクトを確実に解放
  • 分割コードは1ページずつ新しい PDDoc を作成して InsertPages で挿入

Acrobatなし環境での代替手段

Adobe Acrobat Standard/Proがない場合は、外部コマンドラインツールをVBAのShell関数から呼び出す方法がある。

pdftk(PDF Toolkit)を使う方法

pdftk は無料のコマンドラインPDF操作ツール。インストール後、VBAから呼び出せる。


Sub PDF結合_pdftk()

    Dim folderPath As String
    Dim outputPath As String
    Dim cmd As String

    ' ★ PDF格納フォルダを書き換える
    folderPath = "C:\報告書\"

    ' ★ 出力先パス
    outputPath = folderPath & "結合済み.pdf"

    ' pdftk コマンドを組み立て
    ' フォルダ内の全PDFをファイル名順に結合
    cmd = "cmd /c pdftk """ & folderPath & "*.pdf"" cat output """ & outputPath & """"

    ' Shell で実行(pdftk にPATHが通っている前提)
    Shell cmd, vbHide

    MsgBox "pdftk で結合を開始しました。" & vbCrLf & _
           "処理完了まで数秒お待ちください。" & vbCrLf & _
           outputPath, vbInformation

End Sub

注意点:

  • pdftk を事前にインストールし、PATHを通しておく必要がある
  • Shell は非同期実行のため、完了を待たずに次の処理に進む。完了を待ちたい場合は WScript.ShellRun メソッドを使う
  • pdftk 以外にも qpdf(無料)などのツールが使える

' WScript.Shell で完了を待つ場合
Dim wsh As Object
Set wsh = CreateObject("WScript.Shell")
wsh.Run cmd, 0, True  ' 第3引数 True で完了まで待機
Set wsh = Nothing

方法の比較

項目 Acrobat OLE pdftk(外部ツール)
必要なソフト Adobe Acrobat Standard/Pro(有料) pdftk(無料)
インストール Acrobatがあれば不要 別途インストール+PATH設定
VBAからの制御 OLE で細かく制御可能 Shell 経由。細かい制御は困難
ページ単位の操作 InsertPages で自由に操作可能 コマンドオプションで対応
安定性 高い(純正OLE) 環境依存あり
おすすめ場面 社内にAcrobatライセンスがある場合 Acrobatがない場合の代替

ファイルの圧縮・解凍が必要な場合は 【VBA】ファイルをZIP圧縮・解凍する方法 も参照。

よくある落とし穴5選

自分が最初にAcrobat OLEでPDF結合を試したとき、CreateObject("AcroExch.App") で「実行時エラー ‘429’」が出て30分悩んだ。原因はAcrobat Readerしか入っていなかったこと。OLE操作にはAcrobat Standard/Proが必須だと知らず、「Acrobatは入ってるのになぜ?」と混乱した。

# 症状 原因 対策
1 「実行時エラー ‘429’ ActiveXコンポーネントはオブジェクトを作成できません」 Adobe Acrobat Reader(無料版)しかインストールされていない。OLE操作にはAcrobat Standard/Proが必要 Acrobat Standard/Proをインストールする。またはpdftk等の代替ツールを使う
2 結合後のPDFのページ順序がおかしい Dir関数はファイルシステムの返す順序でファイルを取得するため、名前順とは限らない 実務版コードのようにファイル名でソートしてから結合する。ファイル名に 01_, 02_ 等のプレフィックスを付ける
3 結合処理が途中で止まる / Acrobatが応答しない Acrobatが別のPDFを開いている、または前回の処理でオブジェクトが解放されていない 実行前にAcrobatを閉じる。タスクマネージャーで Acrobat.exe が残っていれば終了させる
4 パスワード付きPDFが結合できない PDDoc.Open がパスワード付きPDFを開けない 事前にパスワードを解除するか、パスワードなしのPDFに変換してから結合する
5 pdftk が「コマンドが見つかりません」になる pdftk のインストール先にPATHが通っていない 環境変数PATHにpdftk のインストールフォルダを追加する。またはフルパスでコマンドを指定する

VBAでPDF結合ができないときの対処法

「Acrobat OLEでPDFを結合しようとするとエラーが出る」という場合、原因はAdobe Acrobat Standard/Proがインストールされていないこと。無料のAcrobat Readerでは動作しない。Acrobatがない場合はpdftkなどの外部ツールをShell関数で呼び出す方法が代替手段になる。

VBAでExcelシートのPDF化が途中で止まるときの対処法

「ExportAsFixedFormatでPDF化するとエラーになる」という場合、原因は印刷範囲の未設定やページ設定の不備だ。事前にPageSetupで印刷範囲と用紙サイズを設定してからExportAsFixedFormatを実行する。

FAQ

Q1: Acrobat Readerでは本当にOLE操作できない?

できない。AcroExch.AppAcroExch.PDDoc はAcrobat Standard/Proが提供するOLEオブジェクト。Readerにはこの機能がない。これはAdobe公式の仕様。Readerしかない場合はpdftk等の外部ツールを使う。

Q2: 結合するファイルの順番を自分で指定したい

Excelシートにファイル名を順番に書いて、そのリスト順に結合するのが確実。実務版コードの fileList 配列をシートから読み込むように変更すればよい。


' シートA列からファイルパスを読み込む例
For i = 1 To lastRow
    fileList(i) = ws.Cells(i, 1).Value
Next i

Q3: PDFの特定ページだけ抽出したい

分割コードの InsertPages の引数を変えれば特定ページだけ抽出できる。例えば3ページ目だけを抽出する場合:


newDoc.InsertPages -1, srcDoc, 2, 1, 0  ' 第3引数が0始まりのページ番号

Q4: ExcelからPDF化する段階で文字が切れる / レイアウトが崩れる

これはPDF結合ではなく、Excel → PDF変換時の問題。印刷設定(用紙サイズ・余白・倍率)を確認する。詳しくは 【VBA】ExcelファイルをPDFに一括変換する方法 の落とし穴セクションを参照。

Q5: Acrobatのバージョンによって動作が違う?

Acrobat OLEのAPIは基本的に下位互換性がある。ただし、Acrobat DCとAcrobat 2017以前では一部の挙動が異なる場合がある。一般的に、最新のAcrobat DCであれば問題ない。動作しない場合はAcrobatのアップデートを試す。

まとめ

この記事で、VBAから複数のPDFファイルを結合・ページ分割できるようになった。

  • 基本版:ExcelシートをPDF化 → Acrobat OLEで1つに結合
  • 実務版:フォルダ内のPDFをファイル名順に自動結合+ページ分割
  • 代替手段:Acrobatなし環境ではpdftk等の無料ツールをShellから呼び出し
  • 重要:Acrobat OLEには Acrobat Standard/Pro(有料版)が必須。Readerでは動作しない

関連記事

次にやりたくなること

セルフチェック

  • [x] 再現性:前提条件 → Acrobat確認 → 貼り付け → フォルダパス変更 → 実行 → 結果確認の流れが書かれている
  • [x] 安全性:バックアップ推奨あり。元PDFは変更しない旨を記載
  • [x] 落とし穴が5つある
  • [x] FAQが5つある
  • [x] コードがコピペで動く(フォルダパスの書き換え1箇所のみ)
  • [x] 機密情報なし(フォルダパスとファイル名はダミー)
  • [x] 断定なし(前提条件を明記。Acrobat必須を冒頭で明示)
  • [x] 筆者体験が導入(共感パート)と落とし穴(エラー429失敗談)に入っている
  • [x] 内部リンクが6本ある(/009, /075, /076, /107)
  • [x] 「次にやりたくなること」セクションに内部リンクが3本ある

コメント

タイトルとURLをコピーしました