VBAでPDFファイルを読み込む方法を徹底解説!


VBAでPDFのデータを読み込む方法を知りたい・・・
具体的な手順やサンプルコードがあると嬉しいな・・・

PDFのデータをExcelに転記するような作業をしている場合、いちいちPDFを開いて入力するのはめんどくさいですよね。PDFを直接Excelで開いて、もっと効率的にデータ転記したいと思っている方もいるのではないでしょうか。

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

この記事では、VBAでPDFを読み込む方法について解説します。

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

  • VBAからPDFを読み込む方法を知りたい人
  • PDFのデータ転記作業を効率化したい人

目次

VBAでPDFを読み込む方法とは?

はじめに、VBAでPDFを読み込む方法について解説します。

VBAでPDFを読み込む方法はいくつかあります。フリーツールを使ってPDFを読み込む方法なども探せば出てきますが、動かなくなった時のサポートがなく対応ができなくなる可能性もあるため、AdobeのAcrobat Pro経由で処理を作ることがおすすめです!

Acrobat Proは有料ですが、

  • 参照設定を追加して処理を書くことができる
  • ネットに情報が多いため困った時に対処しやすい

という理由から、とてもおすすめです。

無料体験期間もあるため、まずはインストールしてVBAで処理を作ってみることがおすすめです。

Acrobat Pro DCのサイトはこちら → https://acrobat.adobe.com/jp/ja/acrobat/acrobat-pro.html

VBAでPDFを読み込む具体的な手順

ここからは、VBAでPDFを読み込む処理を作るための具体的な手順を解説します。

事前準備、VBAでPDFを読み込む処理を作る方法の流れで解説していきますね。

事前準備

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

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

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

参照設定を開く

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

「Acrobat」を追加


「Microsoft Scripting Runtime」を追加

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

次に、具体的にPDFを読み込む処理を解説していきますね。

VBAでPDFを読み込む処理を作る方法

次に、VBAでPDFを読み込む処理を作る方法について解説します。

PDFのデータを読み込むときは、PDFのデータをテキストデータに変換する必要があります。具体的には、次の手順で処理を作っていきます。


■PDFのデータを読み込む処理を作る手順

  • 手順1:PDFファイルをAcrobatの機能を使ってテキストファイルに変換
  • 手順2:テキストファイルに変換したデータをインポート

具体的なサンプルコードを使って解説します。以下はC:UsersSamuraiDesktop部分一致テストにある【請求書】A00001.pdfを読み込むサンプルです。

メイン処理:

'PDFのデータをExcelに読み込むメイン処理
Sub Main()
    
    'PDFファイルをテキストに変換するための定数を用意
    Const fileName = "【請求書】A00001"
    Const folderPath = "C:UsersSamuraiDesktop部分一致テスト"
    Const pdfFilePath = folderPath & fileName & ".pdf"
    Const txtFilePath = folderPath & fileName & ".txt"
    
    'PDFファイルをテキストに変換
    Call convPDFtoText(fileName, folderPath, pdfFilePath, txtFilePath)
    
    'テキストデータをExcelに読み込む
    Call importTxtData(txtFilePath)
    
End Sub

まず、メインの処理ではPDFファイルをテキストに変換するための「convPDFtoText」プロシージャと、テキストデータをExcelに読み込む「importTxtData」プロシージャを実行しています。

PDFファイルをテキストに変換する処理は、次のように書いています。

PDFをテキストに変換する処理:

'PDFファイルをテキスト変換する処理
Sub convPDFtoText(fileName As String, folderPath As String, pdfFilePath As String, txtFilePath As String)
    'Acrobat操作用の変数を宣言
    Dim objAcrobatApp      As New Acrobat.AcroApp
    Dim objAcrobatAVDoc    As New Acrobat.AcroAVDoc
    Dim objAcrobatPDDoc    As Acrobat.AcroPDDoc
    Dim AcrobatId            As Long
    Dim objJs             As Object

    'Acrobatアプリを起動
    AcrobatId = objAcrobatApp.Show
    'PDFファイルを開く
    AcrobatId = objAcrobatAVDoc.Open(pdfFilePath, "")
    'PDDocオブジェクトを取得
    Set objAcrobatPDDoc = objAcrobatAVDoc.GetPDDoc()
    'Acrobat JavaScriptオブジェクトを作成
    Set objJs = objAcrobatPDDoc.GetJSObject

    'PDFをテキストで保存
    objJs.SaveAs txtFilePath, "com.adobe.acrobat.plain-text"

    'PDFファイルを閉じます。
    AcrobatId = objAcrobatAVDoc.Close(1)
    'Acrobatアプリケーションを終了する。
    AcrobatId = objAcrobatApp.Hide
    AcrobatId = objAcrobatApp.Exit
    
    'オブジェクトを強制開放
    Set objAcrobatPDDoc = Nothing
    Set objAcrobatAVDoc = Nothing
    Set objAcrobatApp = Nothing
       
End Sub

「Acrobatを起動 → ファイルを指定して開く → テキストを指定して保存」の流れで処理を作っています。Acrobatを操作する時は、「Acrobat起動 → ファイルを指定して開く」の流れは必ず行うので、テンプレとして覚えてしまってOKです!

ちなみに、ファイル名やパスは変わる可能性が高いため、引数に入れて変更しやすいようにしています。

Excelにテキストファイルをインポートする処理は、次のように書いています。

テキストをExcelにインポートする処理:

'テキストファイルをExcelにインポートする処理
Sub importTxtData(imortFilePath As String)
  Dim wsImport As Worksheet
  Set wsImport = Worksheets("PDF読み込み") 'CSVデータを取り込み用シート
 
  Dim queryTb As QueryTable
  Set queryTb = wsImport.QueryTables.Add(Connection:="TEXT;" & imortFilePath, _
                                         Destination:=wsImport.Range("A1")) ' CSV を開く
  With queryTb
      .TextFilePlatform = 932               ' 文字コードを指定
      .TextFileParseType = xlDelimited  ' 区切り文字の形式
      .TextFileSpaceDelimiter = True     'スペース区切り
      .RefreshStyle = xlOverwriteCells   ' セルに書き込む方式
      .Refresh                                     ' データを表示
      .Delete                                       ' CSVファイルとの接続を解除
  End With
End Sub

テキストファイルのデータをインポートする方法はいくつかありますが、QueryTableが最も速くインポートできるので、QueryTableを使っています。QueryTableの使い方は以下で詳しく解説しているので、使ったことがない方は見てみてくださいね!

作ったサンプルを実行すると、次のようになります。

PDFのデータ:

PDFのデータ

処理実行前 – フォルダ:

処理実行前 – フォルダ

処理実行前 – Excel:

処理実行前 – Excel

処理実行後 – フォルダ:

処理実行後 – フォルダ

処理実行後 – Excel:

処理実行後 – Excel

PDFのデータをインポートすることができました。

VBAでPDFを読み込む処理の使いどころ

ここまで、VBAでPDFを読み込む方法について解説してきました。

PDFのデータを1件インポートするだけであれば、VBAを作るよりも直接見てコピペしたほうが早いですよね。ただ、1件のデータのみインポートしたいケースはほとんどなく、大量のデータをインポートしたい・・・ということが多いのではないでしょうか。

そのため、複数ファイルを一括でインポートする方法も覚えておくと便利です。詳しく解説しますね。

複数ファイル一括読込み

次に、複数ファイル一括読込み方法について解説します。

先ほど解説したサンプルを以下のように変更し、一括インポートできる処理を作っていきます。


■変更点

  • 手順1:メイン処理を複数ファイル分実行する処理に変更
  • 手順2:新規シートを作ってインポートする方法に変更
  • 手順3:新規シートのシート名は、PDFのファイル名を設定

メイン処理:

'PDFのデータをExcelに読み込むメイン処理
Sub Main()
    
    '処理の実行結果を保存する変数を用意
    Dim resultMessage As String
    
    'PDFファイルをテキストに変換するための定数を用意
    Dim fileNameList(3) As String
    fileNameList(0) = "【請求書】A00001"
    fileNameList(1) = "【請求書】A00002"
    fileNameList(2) = "【請求書】A00003"
    Const folderPath = "C:UsersSamuraiDesktop部分一致テスト"
    Dim pdfFilePath As String
    Dim txtFilePath As String
        
    'リストの数分処理をループ
    Dim i As Integer
    For i = 0 To 2
        'PDFファイル、テキストファイルのパスをセット
        pdfFilePath = folderPath & fileNameList(i) & ".pdf"
        txtFilePath = folderPath & fileNameList(i) & ".txt"
        
        'PDFファイルをテキストに変換
        Call convPDFtoText(fileNameList(i), folderPath, pdfFilePath, txtFilePath)
        
        'テキストデータをExcelに読み込む
        Call importTxtData(fileNameList(i), txtFilePath)
    Next i

End Sub

fileNameListという文字列型の配列を用意し、3つのファイル名をセットしてループ処理を作っています。フォルダ内のファイルを一括で読み込むような処理を作りたいときは、Dir関数を使うこともおすすめです!

以下で詳しく解説しているので、興味がある方は見てみてくださいね!

テキストファイルをインポートする処理は、次のように変更しています。

テキストをExcelにインポートする処理:

'テキストファイルをExcelにインポートする処理
Sub importTxtData(strFileName As String, imortFilePath As String)
  
  'シートの追加
  Worksheets.Add
  ActiveSheet.Name = strFileName
  
  '取り込んだデータを書き込むシートの指定
  Dim wsImport As Worksheet
  Set wsImport = Worksheets(strFileName) 'データを取り込み用シート
 
  Dim queryTb As QueryTable
  Set queryTb = wsImport.QueryTables.Add(Connection:="TEXT;" & imortFilePath, _
                                         Destination:=wsImport.Range("A1")) ' CSV を開く
  With queryTb
      .TextFilePlatform = 932               ' 文字コードを指定
      .TextFileParseType = xlDelimited  ' 区切り文字の形式
      .TextFileSpaceDelimiter = True     'スペース区切り
      .RefreshStyle = xlOverwriteCells   ' セルに書き込む方式
      .Refresh                                     ' データを表示
      .Delete                                       ' CSVファイルとの接続を解除
  End With
End Sub

「Worksheets.Add」でシートを追加し、「ActiveSheet.Name = strFileName」を追加して追加したシートの名前を、PDFファイルの名前と一致させています。このように、新規シートを作ってから読み込む処理に変更するだけで、簡単に複数ファイルを一括で読み込む処理を作ることができます。

実行すると、次のようにデータをインポートすることができました。


実行結果

「複数ファイルを一括でインポートする処理」をいきなり作ろうとすると少し大変ですが、1つのファイルをインポートする処理を作ってから複数ファイルを考えたので、ちょっとした変更で簡単に作ることができましたね。

Acrobat Proの購入が難しい方へ

ここまで、Acrobat Proを使ったPDF読み込み処理の作り方について解説してきました。

ただ、、、Acrobat Proは有料なので、有料ツールが導入できない環境だと今回のサンプルを使うことができません。そんなときは、PDFを作成するタイミングを考えてみてください。

請求データを使ってExcelでPDFを作成しているのであれば、そのタイミングでテキストデータさえ作っておけば、今回と同じような処理を作ることもできますよね。

また、PDFの読込みができなくても、PDFを開く作業を自動化することで少しだけ作業を楽にすることもできます。完全に自動化する方が楽にはなりますが、実現が難しい場合は別の方法を考えたり、規模をもう少し狭めて少しでも楽にできる方法がないか考えるのも一つの手です。

VBAからPDFを開く方法は以下で解説しているので、ぜひ見てみてくださいね!

まとめ

今回は、VBAでPDFを読み込む方法を解説しました。

PDFのデータが一括で読み込みできれば、作業が圧倒的に効率化することができます。

データ転記作業を定期的にしている方は、ぜひVBAでPDF自動読込機能を作ってみてくださいね!

この記事を書いた人

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

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

目次