パソコンスキルの教科書

パソコンスキルの教科書

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

エクセルマクロVBAでフォルダ内のすべてのPDFを一括結合する方法|ファイル順に結合

f:id:gene320:20171229230554j:plain

複数のAcrobat PDFのファイルを一つに結合するとき、一つずつファイルを結合していては時間がかかります。

そこで、エクセルマクロを使って、複数のPDFを自動で一つのPDFに結合する方法を紹介します。

ただPDFを結合するだけではなく、フォルダ内のすべてのPDFを並んでいる順番に結合するコードを解説します。

VBAを使って、特定フォルダ内の複数のAcrobatPDFファイルを一つに結合

この記事で紹介するプログラムを使ってできることを説明します。

カンタンにいうと、以下のフォルダの赤枠で囲われたPDFファイルを一つのPDFファイルにまとめます。

f:id:gene320:20171229230900p:plain

そのとき、以下の4つのことも可能にします。

このプログラムの4つのポイント

[1] エクセルが保管されているフォルダ内のすべてのPDFファイルを結合

[2] フォルダ内で並んでいる順番にPDFファイルを結合

[3] フォルダ内のPDF以外のファイルがあっても、自動で除外(ワードやエクセルファイルがあってもエラーがでない)

[4] 結合したファイルは、同じファルダに保存

このマクロを使うと、以下のように結合したPDFがフォルダに保存されます。

f:id:gene320:20171229230909p: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 Standardでも可能だと思われますが、検証しておりません。

特定フォルダのPDFを一つにまとめるプログラム

ここから紹介するプログラムは、エクセルと同じ階層に保管されているPDFファイルを結合します。

そのとき、フォルダ内の上から順番に結合していきます。そのため、結合したい順番に並ぶように、事前にPDFファイルの名前を変更しておく必要があります。

それでは、プログラムを紹介します。

Option Explicit
'---コード1|フォルダ内のPDFファイルをファイル名称で取得するためのおまじない
Declare Function StrCmpLogicalW Lib "SHLWAPI.DLL" (ByVal lpStr1 As String, ByVal lpStr2 As String) As Long

'---コード2|フォルダ内のPDFファイルだけを抽出
Sub Combine_All_PDF()
    
    Dim i As Long
    Dim fs As FileSystemObject
    Dim basefolder As Scripting.Folder
    Dim filepath, savepath As String
    Dim st() As String
    Dim mysubfiles As Scripting.Files
    Dim mysubfile As Scripting.File
    
    Set fs = New Scripting.FileSystemObject
    
    filepath = ThisWorkbook.path
    
    Set basefolder = fs.GetFolder(filepath)
    Set mysubfiles = basefolder.Files
    
    i = 0
    
    For Each mysubfile In mysubfiles
        
        If fs.GetExtensionName(path:=mysubfile) = "pdf" Then
            ReDim Preserve st(i)
            st(i) = mysubfile.path
            Debug.Print st(i)
            i = i + 1
        End If

    Next

'---コード3|抽出したPDFファイルを配列を利用して、名前順に並び替える
    Dim j As Long
    Dim tmp As String
    
    For i = 0 To UBound(st)
        For j = i To UBound(st)
            Debug.Print st(i), st(j)
            If StrCmpLogicalW(StrConv(st(i), vbUnicode), StrConv(st(j), vbUnicode)) > 0 Then
                tmp = st(i)
                st(i) = st(j)
                st(j) = tmp
                Debug.Print tmp
                Debug.Print st(i)
                Debug.Print st(j)
            End If
        Next
    Next
    

'---コード4|名前順にPDFファイルを結合していく
    Dim AcroPDDocNew As New Acrobat.AcroPDDoc
    Dim AcroPDDocAdd As New Acrobat.AcroPDDoc
    Dim acroid As Long
    Dim acroGetPages As Long
    Dim acroPages As Long

    acroPages = 0
    acroid = AcroPDDocNew.Create()
    
    Dim f As Variant
    
    For Each f In st
        acroid = AcroPDDocAdd.Open(f)
        acroGetPages = AcroPDDocAdd.GetNumPages()
        acroid = AcroPDDocNew.InsertPages(acroPages - 1, AcroPDDocAdd, 0, acroGetPages, True)
        acroid = AcroPDDocAdd.Close()
        acroPages = acroPages + acroGetPages
    Next

    savepath = filepath & "\combined.pdf"

    '結合したPDFファイルを最後に保存する

    acroid = AcroPDDocNew.Save(1, savepath)
    acroid = AcroPDDocNew.Close()

    'オブジェクトを強制開放する

    Set AcroPDDocAdd = Nothing
    Set AcroPDDocNew = Nothing

End Sub

以下、プログラムの解説を行います。

コード1|フォルダ内のPDFファイルをファイル名称で取得するためのおまじない

Option Explicit
'---コード1|フォルダ内のPDFファイルをファイル名称で取得するためのおまじない
Declare Function StrCmpLogicalW Lib "SHLWAPI.DLL" (ByVal lpStr1 As String, ByVal lpStr2 As String) As Long

このプログラムは、フォルダ内のファイルを名前順に変更するときに使うコード2で使います。おまじないようなものです。

実は、FSOを使うと、フォルダ内のファイルを並んでいる順番で読みこんでくれるとは限りません。そのため、ファイルが並んでいる順番(名前順)で、処理できるように、このおまじないを利用します。

コード2|フォルダ内のPDFファイルだけを抽出

'---コード2|フォルダ内のPDFファイルだけを抽出
Sub Combine_All_PDF()
    
    Dim i As Long
    Dim fs As FileSystemObject
    Dim basefolder As Scripting.Folder
    Dim filepath, savepath As String
    Dim st() As String
    Dim mysubfiles As Scripting.Files
    Dim mysubfile As Scripting.File
    
    Set fs = New Scripting.FileSystemObject
    
    filepath = ThisWorkbook.path
    
    Set basefolder = fs.GetFolder(filepath)
    Set mysubfiles = basefolder.Files
    
    i = 0
    
    For Each mysubfile In mysubfiles
        
        If fs.GetExtensionName(path:=mysubfile) = "pdf" Then
            ReDim Preserve st(i)
            st(i) = mysubfile.path
            i = i + 1
        End If

    Next

このプログラムは、FSO(File System Object)を利用して、エクセルが保管されているフォルダ内のファイルをすべて処理するプログラムです。

すべてのファイルを処理し、If fs.GetExtensionName(path:=mysubfile) = "pdf" Then を使って、拡張子がpdfのものだけを配列に入れ込みます。

コード3|抽出したPDFファイルを配列を利用して、名前順に並び替える

'---コード3|抽出したPDFファイルを配列を利用して、名前順に並び替える
    Dim j As Long
    Dim tmp As String
    
    For i = 0 To UBound(st)
        For j = i To UBound(st)
            Debug.Print st(i), st(j)
            If StrCmpLogicalW(StrConv(st(i), vbUnicode), StrConv(st(j), vbUnicode)) > 0 Then
                tmp = st(i)
                st(i) = st(j)
                st(j) = tmp
            End If
        Next
    Next

コード2で配列にフォルダ内の拡張子がpdfのファイルを取得しました。コード3では、それらをファイル名の順番に入れ替えます。

なぜ、この処理が必要かというと、フォルダ内のすべてのファイルを処理するとき、並んでいる順番に処理してくれるワケではないからです。

そのため、このプログラムを入れ込んで、ファイルがフォルダ内に並んでいる順番に処理されるように一手間加えてやる必要があります。

このプログラムでやっていることは、ファイル名称を総当たりで比較して、ファイルの名前が上に来ているものを最初にもってくることです。

コード4|名前順にPDFファイルを結合していく

'---コード4|名前順にPDFファイルを結合していく
    Dim AcroPDDocNew As New Acrobat.AcroPDDoc
    Dim AcroPDDocAdd As New Acrobat.AcroPDDoc
    Dim acroid As Long
    Dim acroGetPages As Long
    Dim acroPages As Long

    acroPages = 0
    acroid = AcroPDDocNew.Create()
    
    Dim f As Variant
    
    For Each f In st
        acroid = AcroPDDocAdd.Open(f)
        acroGetPages = AcroPDDocAdd.GetNumPages()
        acroid = AcroPDDocNew.InsertPages(acroPages - 1, AcroPDDocAdd, 0, acroGetPages, True)
        acroid = AcroPDDocAdd.Close()
        acroPages = acroPages + acroGetPages
    Next

    savepath = filepath & "\combined.pdf"

    '結合したPDFファイルを最後に保存する

    acroid = AcroPDDocNew.Save(1, savepath)
    acroid = AcroPDDocNew.Close()

    'オブジェクトを強制開放する

    Set AcroPDDocAdd = Nothing
    Set AcroPDDocNew = Nothing

End Sub

PDFファイルを結合していきます。流れとしては、最初に空のPDFファイルを作成し、そのPDFファイルにコード3で並び替えたPDFファイルをつなげます。

ファイルは、combined.pdfという名前で、同じフォルダに保存されます。

savepath = filepath & "\combined.pdf"

のcombinedの部分を変更することで、保存名を変更できます。

VBAを使ったPDF操作について、もっと知りたいなら

エクセルVBAを使ったPDF操作する方法について、解説した記事を紹介します。

エクセルマクロVBAで指定したフォルダ内のPDFをすべて開く方法

PDF解析を習得より、基礎作りが先決

エクセルVBAを使ったPDFの一括結合の方法について、事例で紹介しました。今回の内容をぜひVBAの勉強に活かしてみてください。

ここで、紹介したコードを編集して利用すれば、VBAでPDFを解析することもできるでしょう。ぜひ、あなたがやりたいことに応用してください。

しかし、このコードを編集するといっても、「私にできるかな、、、」と感じている方もいるかもしれません。もし、そのように感じているなら、それはマクロの基本がまだできていません。

実際、エクセルVBA初心者がPDF操作でエラーを起こすと、一人で解決するのはムズカシイでしょう。その理由は、エクセルVBAの基本を理解していないからです。

もし、VBAの基本を知っておけば、PDFだけでなくアウトルックやIE操作も本当の意味で理解できるようになります。

そのため、PDF操作をきちんと学ぶなら、基礎作りが先決です。土台ができていない内に学ぶと、使いこなす前に挫折にしてしまいます。

もしきちんと学ぶなら、こちらの無料動画がオススメです。基礎を確実に学んでから、トライしてみてください。

この記事を読んだ方へのオススメ

「マクロの力を実感したい」と感じているなら、こちらの記事がオススメです。マクロが入ったエクセルファイルをダウンロードできるようにしています。もし詳細が知りたいなら、以下の記事で紹介していますので、合わせて読んでみてください。

サンプル1|月末処理の自動処理する
サンプル2|エクセルで在庫管理するマクロ
サンプル3|outlookのメールを自動送信する
サンプル4|outlookの受信メールをエクセルに一覧にして、添付ファイルも保管する
サンプル5|エクセルマクロVBAで大量データを比較・照合してマッチングする方法
サンプル6|ウェブの情報を自動取得して、エクセルに出力する
サンプル7|エクセルの情報をワードに差し込み、印刷まで行う

ぜひご活用ください。

エクセルマクロでできることを知りたいなら

www.fastclassinfo.com

エクセルマクロを独学で習得したいなら

www.fastclassinfo.com

エクセルマクロとは?もっと詳しく知りたいなら

www.fastclassinfo.com

エクセルマクロの難易度や習得までの期間を知りたいなら

www.fastclassinfo.com