PDFの情報を更新をしたとき、更新前後で何がどのように変更したかを比較一覧表にしたいときがあります。
実際、このような表は新旧対照表と呼ばれて変更点が一目でわかるように作成する必要があります。
このとき、変更前後の2つのPDFを比較しながらコピペで作成する人は多いです。
例えば、PDFのテキスト情報を目視しながら、一つずつエクセルにコピペしていくのです。
変更箇所が数か所であれば、1ヶ所ずつコピペしても煩わしさはありません。しかし変更点が20, 30と多くなると話は違います。
コピペ作業だけで、数時間かかる場合もありますし、何よりもその仕事があると思っただけで、仕事へのモチベーションが低下してしまいます。
しかし、この作業を自動化できればどうでしょうか。仕事が一気にラクになります。しかも、コピペによるミスも激減できます。
この記事では、エクセルマクロVBAを利用して、2つのPDFの変更点を比較して新旧対照表として出力する方法を紹介します。
目次
2つのPDFの変更点を比較して新旧対照表で出力する事例を動画で紹介
2つのPDFの比較してエクセルに一覧にする作業と書いても、イメージしづらい人も多いはずです。
そこで、2つのPDFの比較してエクセルに一覧にする作業を事例を用いて紹介します。
まずは、こちらの動画をご覧ください。
この動画で実行している内容は、所定のフォルダに保管した比較したPDF(*)を読み込み、新旧対象表をエクセルに一覧にします。
このような作業は、変更点が数か所であればマクロを使う必要はありません。しかし、変更点が数十個~数百個となると、一つずつコピペしていては仕事が終わりません。
2つのPDFを比較して変更点をエクセルに書き出すプログラムの流れ
それでは、マクロVBAを使ってPDFを読み込み、変更点をエクセルに一覧にする方法を紹介します。
具体的には、以下のような作業を行います。
[1] 2つのPDFを比較し、「レポートを比較したPDFファイル」を作成する
[2] 「レポートを比較したPDF」を所定のフォルダに移動する
[3] エクセルマクロのボタンを押す
●結果の出力(自動で出力されます)
所定のフォルダに一覧表のエクセルが保管される
詳しく紹介すると、以下のように流れです。
[1] 2つのPDFを比較し、「レポートを比較したPDFファイル」を作成する
変更前後のPDFを用意し、それをAdobe Acrobat Proの機能の一つである「ファイルを比較」で処理します。
「ファイルを比較」で処理すると比較ファイルが作られます。
なお、「ファイルを比較」を使うには、Adobe Acrobat Proの有料版を購入する必要があります。
こちらからAcrobat Proを試すことができます。なお、Acrobat Standardでも可能だと思われますが、検証しておりません。
[2] 「レポートを比較したPDF」を所定のフォルダに移動する
「ファイルを比較」で作成された比較ファイルを分析対象用フォルダに移動します。
[3] エクセルマクロのボタンを押す
エクセルマクロのボタンを押すと、分析対象用フォルダの全てのPDFが処理されます。
そのため、「ファイルを比較」で作成された比較ファイルが複数ある場合は、全てをフォルダに保管しておきます。
ただし、比較したファイル以外のPDFは保管しないでください。余計なファイルが作成されてしまいます。
Adobe Acrobat PDFの「ファイルを比較」の機能で処理されていないPDFがフォルダ内にあると、エラーが出る可能性があります。
所定のフォルダに一覧表のエクセルが保管される
レポートを比較したPDFと同じフォルダに新旧対照表がリストになったエクセルが出力されます。
ここまでの一連の流れは上記の動画で詳しく説明しています。
それでは、以下でこのマクロのプログラムと注意点について紹介します。
VBAのプログラムを作る前にAcrobat、FSO操作の参照設定を行う
エクセルVBAでPDFを操作するためのプログラミングに入る前に、準備することがあります。
それは、VBEの参照設定を変更することです。参照設定とは、機能拡張のことです。
このプログラムを使うのには、参照設定で以下の2つをライブラリに追加する必要があります。
1.VBEを開いて頂いて、「ツール」→「参照設定」
2.この二つのライブラリにチェックを入れて、OKをクリック
・Acrobat
・Microsoft Scripting Runtime
この設定を変更しないとマクロが動きません。忘れずに設定するようにしてください。
参照の設定手順|VBAの参照設定でAcrobatとMicrosoft Scripting Runtimeを追加
VBAでPDFを操作できるようにするために、AcrobatとMicrosoft Scripting Runtimeにチェックを入れます。
具体的な設定方法は以下の通りです。
1.VBAを開いて、「ツール」→「参照設定」
2.以下の2項目にチェックを入れて、OKをクリック
・Acrobat
・Microsoft Scripting Runtime
Acrobatはこちら
MicroSoft Scripting Runtimeはこちら
なお、VBAでフォルダを操作できるようにするために、Microsoft Scripting Runtimeにチェックを入れます。
Microsoft Scripting Runtimeにチェックを入れる理由は、この記事で紹介するプログラムが、特定フォルダ内のすべてのPDFファイルを読み込む際に、Microsoft Scripting Runtimeを利用するからです。
注意|Acrobat操作には、Acrobat Proを利用する必要がある
あなたが使っているパソコンにAcrobat Readerしか含まれていなかったとしたら、VBAでPDF操作はできません。
そのため、PDFを操作する場合は、Acrobat Proを購入しておく必要があります。参照設定で、Acrobatをチェックできないならば、Acrobat Proに登録されていないことを意味しています。
したがって、こちらからAcrobat Proを試すことができます。なお、Acrobat Standardでも可能だと思われますが、検証しておりません。
PDFのテキストを読み込み、エクセルに一覧にするプログラム
プログラムは以下のとおりです。少しカスタムする必要がありますが、基本はコピペして使えます。
なおこのプログラムは、こちらのサイト(http://pdf-file.nnn2.com/)の情報を参考に作成させていただきました。
この場を借りて感謝を申し上げます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
Option Explicit Sub filecheck() Dim cmax As Long Dim ws1 As Worksheet Set ws1 = Worksheets(データ一覧) Dim fs As FileSystemObject Dim basefolder As Scripting.Folder Dim destifolder, filepath As String Dim mysubfiles As Scripting.Files Dim mysubfile As Scripting.File cmax = ws1.Range(A1048576).End(xlUp).Row Set fs = New Scripting.FileSystemObject filepath = ThisWorkbook.path ; \Analysis Set basefolder = fs.GetFolder(filepath) Set mysubfiles = basefolder.Files For Each mysubfile In mysubfiles If fs.GetExtensionName(path:=mysubfile) = pdf Then Call AcroExch_PDAnnot_Contents(mysubfile.path, ws1) End If Next End Sub Sub AcroExch_PDAnnot_Contents(path, ws1) Dim objAcroApp As New Acrobat.AcroApp Dim objAcroAVDoc As New Acrobat.AcroAVDoc Dim objAcroPDDoc As Acrobat.AcroPDDoc Dim objAcroPDPage As Acrobat.AcroPDPage Dim objAcroPDAnnot As Acrobat.AcroPDAnnot Dim objAcroAVPageView As Acrobat.AcroAVPageView Dim Ret As Long, AnnotsCnt As Long, Cnt As Long, pagecnt As Long Dim j As Long, id As Long, i As Long, k As Long Dim kugiri1 As Long, kugiri2 As Long Dim str As Variant, filename As String 'Acrobatアプリケーションを起動する。 id = objAcroApp.Show id = objAcroAVDoc.Open(path, ) Cnt = 0 'PDFドキュメントを開いて表示する Set objAcroAVPageView = objAcroAVDoc.GetAVPageView() Set objAcroPDDoc = objAcroAVDoc.GetPDDoc() 'ページ数を全て得る pagecnt = objAcroPDDoc.GetNumPages - 1 Dim annc As String, annt As String Dim myArray1() As Long Dim myArray2() As String, myArray3() As String, myArray4() As String, myArray5() As String k = 0 '1ページずつ解析する For i = 0 To pagecnt Ret = objAcroAVPageView.Goto(i) Set objAcroPDPage = objAcroAVPageView.GetPage() AnnotsCnt = objAcroPDPage.GetNumAnnots() - 1 '注釈を1ページずつ解析する For j = 0 To AnnotsCnt Set objAcroPDAnnot = objAcroPDPage.GetAnnot(j) annc = objAcroPDAnnot.GetContents annt = objAcroPDAnnot.GetTitle If annc <> Then str = Split(annc, [新] :) ReDim Preserve myArray1(k) ReDim Preserve myArray2(k) ReDim Preserve myArray3(k) ReDim Preserve myArray4(k) ReDim Preserve myArray5(k) myArray1(k) = k + 1 myArray2(k) = i + 1 kugiri1 = InStr(annt, が) kugiri2 = InStr(annt, されました) myArray3(k) = Mid(annt, kugiri2 - 2, 2) If kugiri2 = 8 Then If myArray3(k) = 置換 Then myArray4(k) = Right(str(0), Len(str(0)) - 6) myArray5(k) = Right(str(1), Len(str(1))) ElseIf myArray3(k) = 挿入 Then myArray4(k) = - myArray5(k) = str(0) ElseIf myArray3(k) = 削除 Then myArray4(k) = str(0) myArray5(k) = - End If Else If myArray3(k) = 変更 Then myArray4(k) = Left(annt, kugiri1 - 1) myArray5(k) = Left(annt, kugiri1 - 1) ElseIf myArray3(k) = 挿入 Then myArray4(k) = - myArray5(k) = Left(annt, kugiri1 - 1) ElseIf myArray3(k) = 削除 Then myArray4(k) = Left(annt, kugiri1 - 1) myArray5(k) = - End If End If k = k + 1 End If Cnt = Cnt + 1 Next j Next 'PDFファイルを保存しないで閉じる Ret = objAcroAVDoc.Close(1) 'オブジェクトを強制解放する Set objAcroAVDoc = Nothing Set objAcroPDAnnot = Nothing Set objAcroPDPage = Nothing Set objAcroPDDoc = Nothing Set objAcroApp = Nothing For j = 0 To UBound(myArray1) ws1.Range(A2).Offset(j, 0).Value = myArray1(j) ws1.Range(B2).Offset(j, 0).Value = myArray2(j) ws1.Range(C2).Offset(j, 0).Value = myArray3(j) ws1.Range(D2).Offset(j, 0).Value = myArray4(j) ws1.Range(E2).Offset(j, 0).Value = myArray5(j) Call gyo_seikei(j) Next 'エクセルファイルを名前を変更して保存する filename = Replace(path, .pdf, .xlsm) filename = Replace(filename, [, ) filename = Replace(filename, ], ) Debug.Print filename ThisWorkbook.SaveAs filename 'ThisWorkbook.Close End Sub Sub gyo_seikei(j) With Range(A ; j + 2 ; :F ; j + 2) .WrapText = True .Borders.LineStyle = xlContinuous End With End Sub |
プログラムの解説は要望があれば行います。
ただ、ここで紹介している内容は簡単な内容ではありません。
配列を使ったり、フォルダ操作をしたりして、新旧対照表を作成しています。
もし、詳しく知りたい人は問い合わせから質問してみてください。
VBAを使ったPDF操作について、もっと知りたいなら
エクセルVBAを使ったPDF操作する方法について、解説した記事を紹介します。
PDF操作を習得より、VBA基礎作りが先決
エクセルVBAを活用して2つのPDFからの新旧対照表を作成する方法について事例で紹介しました。
今回の内容をぜひVBAの勉強に活かしてみてください。
ここで紹介したコードを編集して利用すれば、VBAでPDFを解析することができるはずです。
しかし、PDF操作のプログラムを編集するといっても、「私にできるかな、、、」と感じている方もいるかもしれません。
もし、そのように感じているなら、それはマクロの基本がまだできていない証拠です。
実際、エクセルVBA初心者がPDF操作でエラーを起こすと、一人で解決するのは難しいでしょう。
もし、このプログラムをみて、レベルが高いなと感じたら、VBAの基本から学びなおすことをオススメします。
VBAの基本が分かれば、PDFだけでなくアウトルックやIE操作も本当の意味で理解できるようになります。
きちんと学ぶなら、こちらの無料動画がオススメです。基礎を確実に学んでから、トライしてみてください。
この記事を読んだ方へのオススメ
「マクロの力を実感したい」と感じているなら、こちらの記事がオススメです。
もし詳細が知りたいなら、以下の記事で紹介していますので、合わせて読んでみてください。
マクロの入ったエクセルを使って今すぐ仕事に使いたい
サンプル1|月末処理の自動処理する
サンプル2|エクセルで在庫管理するマクロ
サンプル3|outlookのメールを自動送信する
サンプル4|outlookの受信メールをエクセルに一覧にして、添付ファイルも保管する
サンプル5|エクセルマクロVBAで大量データを比較・照合してマッチングする方法
サンプル6|ウェブの情報を自動取得して、エクセルに出力する
サンプル7|エクセルの情報をワードに差し込み、印刷まで行う
ぜひご活用ください。以下の記事もお勧めです。
個人スキルを高める
仕事で使える個人スキルを高めるのに役立つ記事は以下です。
●パソコン操作を早くして効率的して資料作成を早める
●正しいパソコンの使い方について詳しく知りたいなら
●事務職に必要なパソコンスキルについて知りたいなら
●独学でパソコンスキルを学ぶなら何かから学ぶべきか?
●エクセルマクロで仕事の評価が上がる理由
エクセルを使った仕事の自動化や仕組み化を行う
業務自動化(エクセルマクロVBA)に関連する情報は、こちらの記事で解説しています。ぜひ合わせて読んでみてください。
●エクセルで仕事の流れを改善した事例
●エクセルマクロVBAを習得した人の体験談
●エクセルマクロVBAで在庫管理する方法
●エクセルマクロVBAとは何か? メリットや意味
●エクセルマクロVBAで出来ること
●エクセル関数よりエクセルマクロVBAを習得した方がいい理由
●今すぐ使えるマクロVBA入りのエクセルをダウンロード