記事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(有料版) が必要。以下で確認する。
- Windowsの「設定」→「アプリ」→「インストールされているアプリ」
- 「Adobe Acrobat」 があればOK(「Adobe Acrobat Reader」だけではNG)
Acrobatがない場合は、記事後半の「Acrobatなし環境での代替手段」を参照。
Excelをマクロ有効ブック(.xlsm)で保存する
- 新しいExcelブックを開く
- 「ファイル」→「名前を付けて保存」
- ファイルの種類を 「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.PDDocのInsertPagesメソッドで結合- 結合後に個別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.ShellのRunメソッドを使う- 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.App や AcroExch.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では動作しない
関連記事
- 【VBA】ExcelファイルをPDFに一括変換する方法 — Excel → PDF変換の基本。本記事の前段ステップとして必読
- 【VBA】FileSystemObjectでサブフォルダを再帰検索してファイル一覧を取得する方法 — サブフォルダ内のPDFも対象にしたい場合に便利
- 【VBA】ファイルをZIP圧縮・解凍する方法 — 結合したPDFをZIPで圧縮して共有したい場合
次にやりたくなること
- 日付やセル値でファイル名を付けて自動保存する方法: PDF出力時に日付付きのファイル名を自動設定したい場合
- ShellでExcelから外部プログラム・コマンドを実行する方法: pdftkなど外部ツールをVBAから呼び出したい場合
- フォルダ内ファイル一覧を自動取得する方法: 結合対象のPDFファイル一覧を自動取得したい場合
- 【VBA】ExcelファイルをPDFに一括変換する方法 — ExcelからPDFを作成する段階から自動化したい場合はこちら
- 【VBA】Excelファイルをメールに自動添付して送信する方法 — 結合したPDFをメールに添付して自動送信したい場合はこちら
- 【VBA】ファイルをZIP圧縮・解凍する方法 — 結合PDFが大きい場合にZIP圧縮して送りたい場合はこちら
—
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "VBAでPDF結合するのにAdobe Acrobat Readerでは動作しない?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Acrobat Readerでは動作しません。AcroExch.AppやAcroExch.PDDocはAcrobat Standard/Proが提供するOLEオブジェクトで、Readerにはこの機能がありません。Readerしかない場合はpdftk等の外部ツールを使ってください。"
}
},
{
"@type": "Question",
"name": "VBAでPDFを結合するときにファイルの順番を指定するには?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Excelシートにファイル名を順番に書いて、そのリスト順に結合するのが確実です。ファイル名に01_、02_等のプレフィックスを付けて名前順にソートする方法もあります。"
}
},
{
"@type": "Question",
"name": "VBAでPDFの特定ページだけ抽出する方法は?",
"acceptedAnswer": {
"@type": "Answer",
"text": "AcroExch.PDDocのInsertPagesメソッドの引数を変えれば特定ページだけ抽出できます。例えば3ページ目だけを抽出する場合は、newDoc.InsertPages -1, srcDoc, 2, 1, 0 とします(第3引数が0始まりのページ番号)。"
}
},
{
"@type": "Question",
"name": "Adobe AcrobatなしでVBAからPDFを結合する方法はある?",
"acceptedAnswer": {
"@type": "Answer",
"text": "pdftk(PDF Toolkit)やqpdfなどの無料コマンドラインツールをインストールし、VBAのShell関数から呼び出す方法があります。ただし、事前にツールのインストールとPATH設定が必要です。"
}
},
{
"@type": "Question",
"name": "PDF結合時にAcrobatが応答しなくなる原因は?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Acrobatが別のPDFを開いている場合や、前回の処理でOLEオブジェクトが解放されていない場合に発生します。実行前にAcrobatを閉じ、タスクマネージャーでAcrobat.exeが残っていないか確認してください。"
}
}
]
}
—
セルフチェック
- [x] 再現性:前提条件 → Acrobat確認 → 貼り付け → フォルダパス変更 → 実行 → 結果確認の流れが書かれている
- [x] 安全性:バックアップ推奨あり。元PDFは変更しない旨を記載
- [x] 落とし穴が5つある
- [x] FAQが5つある
- [x] コードがコピペで動く(フォルダパスの書き換え1箇所のみ)
- [x] 機密情報なし(フォルダパスとファイル名はダミー)
- [x] 断定なし(前提条件を明記。Acrobat必須を冒頭で明示)
- [x] 筆者体験が導入(共感パート)と落とし穴(エラー429失敗談)に入っている
- [x] 内部リンクが6本ある(/009, /075, /076, /107)
- [x] 「次にやりたくなること」セクションに内部リンクが3本ある


コメント