パソコンスキルの教科書

パソコンスキルの教科書

東京大学大学院卒。博士課程に進学を志すも、担当教授と折が合わず、無職になる。医者を目指すも結局断念。田舎で派遣社員として働く。「スキルがなければ、仕事ももらえない」と悟り、ビジネススキルを学ぶ。プログラミング、英語を学び、一部上場企業へ転職。年間100時間以上の業務効率化を行い、社内講師に抜擢。海外の案件を担当し、数億円のプロジェクトに携わる。個人の事業でも、月売上100万を達成。現在は、自分の価値を高めるためのスキル向上支援を行う

2つのPDFの変更点を比較して新旧対照表で出力する方法|マクロVBAを使って解決

f:id:gene320:20181111010021j:plain

PDFの情報を更新をしたとき、更新前後で何がどのように変更したかを比較一覧表にしたいときがあります。

実際、このような表は新旧対照表と呼ばれて変更点が一目でわかるように作成する必要があります。

このとき、変更前後の2つのPDFを比較しながらコピペで作成する人は多いです。

例えば、PDFのテキスト情報を目視しながら、一つずつエクセルにコピペしていくのです。

変更箇所が数か所であれば、1ヶ所ずつコピペしても煩わしさはありません。しかし変更点が20, 30と多くなると話は違います。

コピペ作業だけで、数時間かかる場合もありますし、何よりもその仕事があると思っただけで、仕事へのモチベーションが低下してしまいます。

しかし、この作業を自動化できればどうでしょうか。仕事が一気にラクになります。しかも、コピペによるミスも激減できます。

この記事では、エクセルマクロVBAを利用して、2つのPDFの変更点を比較して新旧対照表として出力する方法を紹介します。

2つのPDFの変更点を比較して新旧対照表で出力する方法|マクロVBAを使って解決

2つのPDFの変更点を比較して新旧対照表で出力する事例を動画で紹介

2つのPDFの比較してエクセルに一覧にする作業と書いても、イメージしづらい人も多いはずです。

そこで、2つのPDFの比較してエクセルに一覧にする作業を事例を用いて紹介します。

まずは、こちらの動画をご覧ください。


2つのPDFの変更点を比較して新旧対照表で出力する方法|マクロVBAを使って解決

この動画で実行している内容は、所定のフォルダに保管した比較した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でも可能だと思われますが、検証しておりません。

f:id:gene320:20181111010952j:plain

f:id:gene320:20181111010956j:plain

[2] 「レポートを比較したPDF」を所定のフォルダに移動する

「ファイルを比較」で作成された比較ファイルを分析対象用フォルダに移動します。

f:id:gene320:20181111011005j:plain

[3] エクセルマクロのボタンを押す

エクセルマクロのボタンを押すと、分析対象用フォルダの全てのPDFが処理されます。

f:id:gene320:20181111011021j:plain

そのため、「ファイルを比較」で作成された比較ファイルが複数ある場合は、全てをフォルダに保管しておきます。

ただし、比較したファイル以外のPDFは保管しないでください。余計なファイルが作成されてしまいます。

Adobe Acrobat PDFの「ファイルを比較」の機能で処理されていないPDFがフォルダ内にあると、エラーが出る可能性があります。

所定のフォルダに一覧表のエクセルが保管される

レポートを比較したPDFと同じフォルダに新旧対照表がリストになったエクセルが出力されます。

f:id:gene320:20181111011031j:plain

ここまでの一連の流れは上記の動画で詳しく説明しています。

それでは、以下でこのマクロのプログラムと注意点について紹介します。

VBAのプログラムを作る前にAcrobat、FSO操作の参照設定を行う

エクセルVBAでPDFを操作するためのプログラミングに入る前に、準備することがあります。

それは、VBEの参照設定を変更することです。参照設定とは、機能拡張のことです。

このプログラムを使うのには、参照設定で以下の2つをライブラリに追加する必要があります。

設定方法

1.VBEを開いて頂いて、「ツール」→「参照設定」
2.この二つのライブラリにチェックを入れて、OKをクリック
・Acrobat
・Microsoft Scripting Runtime

この設定を変更しないとマクロが動きません。忘れずに設定するようにしてください。

参照の設定手順|VBEの参照設定でAcrobatとMicrosoft Scripting Runtimeを追加

VBAでPDFを操作できるようにするために、AcrobatとMicrosoft Scripting Runtimeにチェックを入れます。

具体的な設定方法は以下の通りです。

1.VBEを開いて、「ツール」→「参照設定」

f:id:gene320:20170613213650p:plain

2.以下の2項目にチェックを入れて、OKをクリック
・Acrobat
・Microsoft Scripting Runtime

Acrobatはこちら

f:id:gene320:20171229230846p:plain

MicroSoft Scripting Runtimeはこちら

f:id:gene320:20171229013436p:plain

なお、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/)の情報を参考に作成させていただきました。

この場を借りて感謝を申し上げます。

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操作する方法について、解説した記事を紹介します。

www.fastclassinfo.com

www.fastclassinfo.com

www.fastclassinfo.com

www.fastclassinfo.com

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入りのエクセルをダウンロード