パソコンスキルの教科書

パソコンスキルの教科書

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

エクセルマクロVBAでフォルダ内のPDFを順番に連続で自動印刷する方法

f:id:gene320:20171231034403j:plain

複数のAcrobat PDFのファイルを印刷するとき、一つずつ印刷していると時間がかかります。しかし、マクロを使えば、ボタン一つでカンタンに印刷することができます。

そこで、エクセルマクロを使って、フォルダ内のPDFファイルを上から順番に自動で連続印刷する方法を紹介します。

VBAを使って、特定フォルダ内のAcrobatPDFファイルを連続印刷する

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

この記事で目指すこと

VBAで特定のフォルダにある複数のPDFを自動で印刷する

具体的にいうと、以下のフォルダの赤枠で囲われたPDFファイルを印刷します。

f:id:gene320:20171231034553p:plain

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

このプログラムでできること

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

[2] フォルダ内で並んでいる順番に印刷

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

なお、印刷条件としては、以下の2つです。
・手動でPDFを印刷するときに、設定されているプリンター
・全てのページを印刷

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を一括で印刷するVBAプログラム

ここから紹介するプログラムは、エクセルと同じ階層に保管されている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 Print_PDFs()
    
    Dim i As Long
    Dim fs As FileSystemObject
    Dim basefolder As Scripting.Folder
    Dim filepath 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

'---コード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

'---コード4|フォルダの名前順にPDFファイルを印刷していく
    Dim objAcroApp As New Acrobat.AcroApp
    Dim objAcroAVDoc As New Acrobat.AcroAVDoc
    Dim objAcroPDDoc As Acrobat.AcroPDDoc

    Dim Acroid As Long

    Acroid = objAcroApp.Show
    
    Dim f As Variant
    Dim str As String
    
    For Each f In st
        
        Acroid = objAcroAVDoc.Open(f, "")
        Set objAcroPDDoc = objAcroAVDoc.GetPDDoc()

        Dim Page As Long
            Page = objAcroPDDoc.GetNumPages
           
            Acroid = objAcroAVDoc.PrintPages(0, Page - 1, 2, 0, 0)
            
            If Acroid <> -1 Then
                str = str & vbCrLf & f
            Exit Sub
       
        End If
       
        Acroid = objAcroAVDoc.Close(False)
    
    Next

    Acroid = objAcroApp.Exit
    
    Set objAcroApp = Nothing
    Set objAcroPDDoc = Nothing
    Set objAcroAVDoc = Nothing

'---コード5|印刷されなかったPDFファイルについてメッセージで知らせる
    If str <> "" Then
        MsgBox "以下のファイルは印刷できませんでした" & vbCrLf & str
    End If
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 objAcroApp As New Acrobat.AcroApp
    Dim objAcroAVDoc As New Acrobat.AcroAVDoc
    Dim objAcroPDDoc As Acrobat.AcroPDDoc

    Dim Acroid As Long

    Acroid = objAcroApp.Show
    
    Dim f As Variant
    Dim str As String
    
    For Each f In st
        
        Acroid = objAcroAVDoc.Open(f, "")
        Set objAcroPDDoc = objAcroAVDoc.GetPDDoc()

        Dim Page As Long
            Page = objAcroPDDoc.GetNumPages
           
            Acroid = objAcroAVDoc.PrintPages(0, Page - 1, 2, 0, 0)
            
            If Acroid <> -1 Then
                str = str & vbCrLf & f
            Exit Sub
       
        End If
       
        Acroid = objAcroAVDoc.Close(False)
    
    Next

    Acroid = objAcroApp.Exit
    
    Set objAcroApp = Nothing
    Set objAcroPDDoc = Nothing
    Set objAcroAVDoc = Nothing

PDFファイルを印刷します。流れは、コード3で並び替えたPDFファイル順に印刷していきます。

なお、うまく印刷されない場合があります。たとえば、パスワードロックがかかっていたり、ファイルが破損していたりする場合です。

そんなとき、印刷されていないファイルがどれか分かるように23行目~25行目で、印刷されなかったPDFのファイル名を拾うようにしています。

コード5|印刷されなかったPDFファイルについてメッセージで知らせる

'---コード5|印刷されなかったPDFファイルについてメッセージで知らせる
    If str <> "" Then
        MsgBox "以下のファイルは印刷できませんでした" & vbCrLf & str
    End If
End Sub

コード4で印刷されなかったPDFのファイル名を拾いました。コード5では、そのファイルをメッセージとして知らせるようにしています。

印刷されなかったPDFファイルは、原因を探って、対処を考えます。

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

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

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

PDF操作を習得より、VBA基礎作りが先決

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

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

しかし、PDF操作のプログラムを編集するといっても、「私にできるかな、、、」と感じている方もいるかもしれません。そのように感じているなら、それはマクロの基本がまだできていない証拠です。

実際、エクセルVBA初心者がPDF操作でエラーを起こすと、一人で解決するのはムズカシイでしょう。もし、このプログラムをみて、レベルが高いなと感じたら、VBAの基本から学びなおすことをオススメします。

VBAの基本が分かれば、PDFだけでなくアウトルックやIE操作も本当の意味で理解できるようになります。

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

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

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

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

ぜひご活用ください。

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

www.fastclassinfo.com

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

www.fastclassinfo.com

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

www.fastclassinfo.com

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

www.fastclassinfo.com