VBAでPDFを分割する方法とは?高速に分割する方法も解説!


VBAでPDFを分割する方法がわからない・・・
PDFを手作業で分割する作業を自動化したい・・・

事務作業をしていると、PDFにまとめた資料を分割したいケースはありますよね。PDF専用の有料ツールをつかって手作業で分割することもできますが、数が多いとその作業だけで日が暮れてしまいますよね。できれば、VBAで自動化して作業効率化を図りたい・・・と思っている人もいるのではないでしょうか。

こんにちは!フリーランスエンジニア兼テックライターのワキザカです。

この記事では、VBAでPDFを分割する方法を解説します!

この記事はこんな人のために書きました。

  • VBAでPDFを分割する方法を知りたい人
  • PDFの分割作業を効率化したい人

目次

VBAでPDFを分割する方法とは?

はじめに、PDFを分割する方法について解説します。

VBAでPDFを分割する場合は、Acrobat Proと連携した分割方法がおすすめです。Acrobat Proは有料ツールですが、VBAで参照設定を追加してPDF操作ができるようになりますし、信頼のあるAdobe社が出しているPDFツールなので、動作も安定しています。

有料ですが無料体験期間もあるため、まずは無料で登録してからツールを作ってみて運用のしやすさで導入検討をしてみると良いかもしれませんね。

Acroabt Proのページはコチラ → https://acrobat.adobe.com/jp/ja/acrobat/acrobat-pro.html

無料で機能を作る方法もありますが、動作の保証がないためあまりおすすめはしません。ただ、個人で使う場合や有料ツールを導入できない場合は、以下がおすすめです!

引用:VBAでPDFファイルのページを分割(抽出)する[ExcelのTIPS]

※今回はAcrobat Proを導入していることを前提で話しを進めるので、パソコンに入っていない方は無料お試し期間中にツールを作り、社内で相談してみてくださいね。

VBAでPDFを分割する処理を作る手順

次に、VBAでPDFを分割する方法を解説します。

手順1:Acrobatを使うための参照設定追加

まずは、VBAからAcrobatの処理を書くための参照設定を追加します。

手順は、次のとおりです。

1. VBEのツールタブから参照設定を開く

参照設定を開く

2. 「Acrobat」「Microsoft Scripting Runtime」の2つを追加

「Acrobat」を追加


「Microsoft Scripting Runtime」を追加

選択したら、OKボタンをクリックして設定完了です。これで、VBAからAcrobatを操作する準備ができました。

次に、VBAでPDFを分割する処理を書いていきます。

手順2:PDFを分割する処理を作る

次に、VBAでPDFを分割する処理を作る方法について解説します。

処理を作る手順は、大きく分けて次の流れになります。


■PDFを分割する処理を作る手順
以下をページの数分ループ処理する

  • 手順1:分割元のPDFファイルを開く
  • 手順2:不要なページを削除
  • 手順3:別名でPDFを保存
  • 手順4:分割元のPDFファイルを閉じる

サンプルコードを元に解説しますね。以下はC:UsersSamuraiDesktopPDF分割にある請求書PDF_3ページ.pdfのファイルを、請求書PDF_1.pdf、請求書PDF_2.pdf、請求書PDF_3.pdfに分割するサンプルです。

実行前のフォルダ構成:

実行前のフォルダ構成

サンプルコード:

Sub Test()
    'ファイル出力用の定数用意
    Const folderPath = "C:UsersSamuraiDesktopPDF分割" 'フォルダパス
    Const inputFileName = "請求書PDF_3ページ.pdf"                 '分割元のPDFファイル名
    Const inputFilePath = folderPath & inputFileName               '分割元のファイルパス
    Dim outputFileName(3) As String                                      '出力するPDFファイル名のリスト
    outputFileName(0) = "請求書PDF_1.pdf"
    outputFileName(1) = "請求書PDF_2.pdf"
    outputFileName(2) = "請求書PDF_3.pdf"
    Dim outputFilePath As String                                            '出力するファイルパス
    
    'Acrobaの操作準備
    Dim acrobatPDDocObj As New Acrobat.AcroPDDoc             'Acrobatオブジェクト
    Dim PDF_ID            As Long                                            'PDFのIDを管理するための変数
    
    'ファイル名のリスト数分、PDF分割処理をループ
    Dim i As Integer
    For i = 0 To UBound(outputFileName) - 1

        '①PDFファイルを開いて表示する
        PDF_ID = acrobatPDDocObj.Open(inputFilePath)
         
        '②ループ回数に応じて不要なページを削除する
        If i = 0 Then
            PDF_ID = acrobatPDDocObj.DeletePages(2, 2)
            PDF_ID = acrobatPDDocObj.DeletePages(1, 1)
        ElseIf i = 1 Then
            PDF_ID = acrobatPDDocObj.DeletePages(2, 2)
            PDF_ID = acrobatPDDocObj.DeletePages(0, 0)
        ElseIf i = 2 Then
            PDF_ID = acrobatPDDocObj.DeletePages(1, 1)
            PDF_ID = acrobatPDDocObj.DeletePages(0, 0)
        End If
         
        'アウトプットファイルパスの設定
        outputFilePath = folderPath & outputFileName(i)
        
        '③別名でPDFファイルを保存する
        PDF_ID = acrobatPDDocObj.Save(PDSaveFull, outputFilePath)
         
        '④PDFファイルを閉じる
        PDF_ID = acrobatPDDocObj.Close
         
    Next i

    'オブジェクトを強制開放する
    Set acrobatPDDocObj = Nothing

End Sub

実行結果:

実行後のフォルダ構成

outputFileNameという名前の文字列型の配列を用意し、分割後のファイル名を3つリストに用意しています。リストの数分ループ処理をすることで、PDFを分割しています。

ループ処理の中では、それぞれ以下のように書くことで① ~ ④の処理をしています。

1. 分割元のPDFファイルを開く

'①PDFファイルを開いて表示する
PDF_ID = acrobatPDDocObj.Open(inputFilePath)

まずは、Open処理でPDFを開き、開いたPDFをPDF_IDに入れて以降の処理を行っています。

2. 不要なページを削除

'②ループ回数に応じて不要なページを削除する
If i = 0 Then
    PDF_ID = acrobatPDDocObj.DeletePages(2, 2)
    PDF_ID = acrobatPDDocObj.DeletePages(1, 1)
ElseIf i = 1 Then
    PDF_ID = acrobatPDDocObj.DeletePages(2, 2)
    PDF_ID = acrobatPDDocObj.DeletePages(0, 0)
ElseIf i = 2 Then
    PDF_ID = acrobatPDDocObj.DeletePages(1, 1)
    PDF_ID = acrobatPDDocObj.DeletePages(0, 0)
End If

この処理では、ループ処理の回数に応じて不要なページを削除しています。1回目は3ページ目、2ページ目が不要なのでそれぞれDeletePagesの引数に「2」「1」を入れています。1ページ目は0から始まることに注意が必要ですね。

また、後ろのページから削除しないと削除する位置がずれてしまうので、そこも注意が必要です。具体的に言うと、先に2ページ目を削除してしまうと、3ページ目だったページが2ページ目になってしまうため、次削除するページ番号がズレてしまうのです。

3. 別名でPDFを保存

'③別名でPDFファイルを保存する
PDF_ID = acrobatPDDocObj.Save(PDSaveFull, outputFilePath)

この処理では、outputFilePathに入れたファイルパスに別名で保存しています。

4. 分割元のPDFファイルを閉じる

'④PDFファイルを閉じる
PDF_ID = acrobatPDDocObj.Close

最後に、分割元のPDFファイルを保存せずに閉じています。

慣れるまでは少し大変かもしれませんが、サンプルを動かしながら使い方を学んでいけばOKです!

ちなみに、複数のPDFファイルを結合する方法を以下で解説しています。合わせて覚えておくと汎用性が高まるので、おすすめです!

PDFを分割することが目的な方へ

ここまで、VBAでPDFを分割する処理を作る方法を解説してきました。

ただ、Acrobat Proの導入が難しい場合や、フリーツールを使ってVBAの処理を作るのが難しい・・・という方もいますよね。「PDFを分割すること」が目的であれば、フリーツール「pdftk」がおすすめです!

引用:pdftkの簡単な使い方とPDFの操作 https://jidouka.work/?p=304

以下のようなコマンドを、Windowsのコマンドプロンプト上で打つことでPDFを分割することができます。

pdftk コピー元ファイル.pdf cat 開始ページ - 終了ページ output 出力ファイル.pdf

また、コマンドプロンプトで実行するのではなく、拡張子が「.bat」形式のバッチファイルを作成し、上記のコマンドをファイルの数分実行するコードを書くことで、複数ファイルを一括で分割することもできます。

PDFを分割することが目的であれば、このように「別ツール + 別の言語」の組み合わせを考えるのも一つの手です。VBAでどうしてもツール化する必要がないのであれば、この方法もおすすめです!

ちなみに、VBAからコマンドプロンプトの処理を実行することもできます。興味がある方は、以下を見てみてくださいね!

まとめ

今回は、VBAでPDFを分割する方法について解説しました。

Acrobat Proの無料体験期間を利用すれば、すぐにPDFファイルの分割処理を作ることができます。

ぜひ、作ってみてくださいね!

この記事を書いた人

北海道出身の30歳で、フリーランスエンジニア兼テックライターとして活動中。新卒入社したメーカー系のIT企業で、システムエンジニアとして約5年勤務。

Webアプリ、業務アプリ開発において、要件定義 ~ 運用保守まで様々な経験あり。また3歳の娘がいる1児のパパで、日々娘との時間を確保するために仕事を頑張っています!
侍エンジニアでは、【誰でもわかるレベルのわかりやすさ】を意識して、記事を執筆中。

目次