【VBA】大量のExcelファイルをまとめてPDFに変換するマクロ

この記事を読むのに必要な時間は約 13 分です。

 

「Excelファイル500こをPDF化してね」とか言われたら、気が遠くなっちゃいますよね。

 

私なら10こくらいでギブアップしそうです(笑)

 

こんなメンドクサイ作業こそ、VBAが力を発揮する瞬間!!

 

今回は、指定したフォルダの中にあるExcelファイルを、全部PDFとして保存するマクロを作ります。

スポンサーリンク

VBAで大量のExcelファイルをPDFに変換

この流れで作っていきます。

 

  1. マクロの記録で、ExcelファイルをエクスポートでPDFとして保存するソースコードを記録
  2. Excelファイルを開く部分は、以前作成したGrepマクロを流用
  3. 簡単なテスト

 

流用したGrepマクロの記事はこちらです。

 

マクロの記録でPDF化するソースコードを作成

まずはマクロの記録を使って、ExcelをPDFとしてエクスポートする処理を記録します。

ExcelファイルをPDFで保存

 

開発タブの中にある「マクロの記録」ボタンを押すと、マクロの記録のダイアログが表示されるので、OKをクリック。

ExcelをPDF保存のマクロを記録

 

とりあえずPDFにしてみたいExcelファイルを開きます。

ExcelをPDF保存のマクロを記録

 

ファイルタブの中に、エクスポートの機能があるんです。

ExcelをPDF保存のマクロを記録

 

エクスポートをクリックして、

ExcelをPDF保存のマクロを記録

 

「PDF/XPSの作成」をクリック。

ExcelをPDF保存のマクロを記録

 

出力先のフォルダと、PDFファイルの名前を決めて「発行」です。

ExcelをPDF保存のマクロを記録

 

この通りPDFファイルが保存されました。

ExcelをPDF保存のマクロを記録

 

(キャプチャが無いですが、ここで先ほど開いたExcelファイルを閉じています。)

 

「記録終了」ボタンを押して、マクロの記録を終わらせます。

ExcelをPDF保存のマクロを記録

 

「Visual Basic」ボタンをクリックし、VBのエディターを表示します。

 

通常はAlt + F11でも表示されるんですが、なぜか私のPCだと表示されません・・・。
しかたないので「Visual Basic」をクリックしてます。

ExcelをPDF保存のマクロを記録

 

先ほど記録したソースコードが表示されました。

 

「Excelファイルを開く」操作は記録されていなくて、すでに開いているExcelファイルのシート1つをPDF保存し、Excelファイルを閉じるだけのソースです。

 

この子を改良していきます。

ExcelをPDF保存するVBA

注意したいのが、このオプションです。

OpenAfterPublish:= True

 

Trueのままだと、PDF化するたびに全部PDFファイルを表示してしまいます。
Falseにするか消してしまいましょう。

 

流用出来るモノは流用する

コーディングに際して使いまわし出来るモノがありまして、実は以前、ExcelファイルをGrepするマクロを作成しました。

 

特定のフォルダ配下に存在しているExcelファイルを、1つずつ開いて1シートずつキーワードが含まれるセルを検索するもの。

 

これを流用することで、PDF化のマクロがサクッとコーディング出来ました!!

 

※ソースコードは下のほうに貼っておきます

ExcelをPDF保存するVBAのソースコード

特定のフォルダ配下のExcelファイルを全部PDF化

ちょっと動かしてみたいと思います。

 

C4のセルには、PDF化したいExcelファイルが格納されているパス、
C5のセルはPDFを保存するパスです。

 

ExcelをPDF保存するVBAのソースコード

 

試しなので、とりあえずファイル3つだけ置いています。

ExcelをPDF保存するVBAのソースコード

 

こちらは格納先。
まだこのフォルダ直下にPDFファイルは無いです。

ExcelをPDF保存するVBAのソースコード

 

では、「ExcelPDF化」ボタンをポチッと。

 

量が少ないので、10秒もかからず完了しました。

ExcelをPDF保存するVBA

 

先ほどは存在しなかったPDFファイルが格納されています。

ExcelをPDF保存するVBA

 

もともとのExcelファイルはこんな感じ、

ExcelをPDF保存するVBA

 

これがPDFファイルになってます。

ExcelをPDF保存するVBA

 

PDF化のソースコード

こちらがソースコードです。

 

シートのボタン(「ExcelPDF化」のボタン)

Option Explicit

Private Sub CommandButton1_Click()
    Call xlsToPDF_Main
End Sub

 

PDF化の本体

Option Explicit

Public Const STR_MAIN_SHEET_NAME As String = "Excel_PDF化"
Public sFilePathRoot As String
Public sPDFSavePath As String
Public sMsgString As String

'ExcelのPDF化メイン
Public Sub xlsToPDF_Main()
    
    sFilePathRoot = ThisWorkbook.Sheets(STR_MAIN_SHEET_NAME).Cells(4, 3).Value
    sPDFSavePath = ThisWorkbook.Sheets(STR_MAIN_SHEET_NAME).Cells(5, 3).Value
    
    If Right(sPDFSavePath, 1) <> "\" Then sPDFSavePath = sPDFSavePath & "\"

    '描画をいったんオフ
    Application.ScreenUpdating = False
    
    Call openExcelFiles(sFilePathRoot)

    '描画をオン
    Application.ScreenUpdating = True
    
    sMsgString = "PDF化が完了しました!!"
    
    MsgBox sMsgString
               
End Sub


'指定したフォルダ内のエクセルファイルを全検索
Private Sub openExcelFiles(ByVal sFilePath As String)
    
    Dim lSheetNo As Long
    Dim sTmpPath As String
    Dim oFSO As Object
    
    If Right(sFilePath, 1) <> "\" Then
        sFilePath = sFilePath & "\"
    End If
    
    'Dirで見つかったファイル名を取得
    sTmpPath = Dir(sFilePath & "*.xls")
    
    '同じフォルダ内でエクセルファイルが見つかる限り検索
    Do While sTmpPath <> ""
        
        '読み取り専用、更新なしで開く
        Workbooks.Open sFilePath & sTmpPath, UpdateLinks:=0, ReadOnly:=1
        
            '全シートループ
            For lSheetNo = 1 To Worksheets.Count
            
                'シート内をPDF化
                Call xlsToPDF(sTmpPath, lSheetNo)
                
            Next lSheetNo
        
        Workbooks(sTmpPath).Close
        
        sTmpPath = Dir()
    
    Loop
    
    'この関数自身を呼び出して、サブフォルダも再帰的に検索
    With CreateObject("Scripting.FileSystemObject")
        For Each oFSO In .GetFolder(sFilePath).SubFolders
            Call openExcelFiles(oFSO.Path)
        Next oFSO
    End With
    
    Set oFSO = Nothing

End Sub


'PDF化
Private Sub xlsToPDF(ByVal sTmpPath As String, ByVal lSheetNo As Long)

    Dim sPDFName As String
    
    sPDFName = sTmpPath & Workbooks(sTmpPath).Sheets(lSheetNo).Name & ".pdf"
    
    'シートをPDF化
    Workbooks(sTmpPath).Sheets(lSheetNo).ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
        sPDFSavePath & sPDFName, Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
        False

End Sub

 

少々課題あり

とりあえず作ってみた、やっつけ仕事な感じなので、いくつか課題があったりします。

  • PDFのファイル名は、[Excelファイル名][シート名].pdf
  • ファイル名に、Excelの拡張子が無駄に入る
  • ファイル名の重複は考慮していない
  • パスのチェックもしていない
  • 印刷範囲はあらかじめ整っている想定

 

気を付けて使ってあげればちゃんと動きますが、親切設計ではないんです。

 

この辺り対応すれば、VBAの練習になるかもしれません。

スポンサーリンク

まとめ:VBAで大量のExcelファイルをまとめてPDF化

大量のExcelファイルを一気にPDF保存するVBAの説明でした。

 

Excelファイルの1シートだけPDFにする記事はよく見ますが、まとめてやっちゃうのはあまりなかったので書きました。

 

ご自分の環境に、ソースをコピペしてActiveXのボタンも付ければ動くと思います。

 

最後までお読みいただき、ありがとうございました。