この記事を読むのに必要な時間は約 13 分です。
「Excelファイル500こをPDF化してね」とか言われたら、気が遠くなっちゃいますよね。
私なら10こくらいでギブアップしそうです(笑)
こんなメンドクサイ作業こそ、VBAが力を発揮する瞬間!!
今回は、指定したフォルダの中にあるExcelファイルを、全部PDFとして保存するマクロを作ります。
VBAで大量のExcelファイルをPDFに変換
この流れで作っていきます。
- マクロの記録で、ExcelファイルをエクスポートでPDFとして保存するソースコードを記録
- Excelファイルを開く部分は、以前作成したGrepマクロを流用
- 簡単なテスト
流用したGrepマクロの記事はこちらです。
マクロの記録でPDF化するソースコードを作成
まずはマクロの記録を使って、ExcelをPDFとしてエクスポートする処理を記録します。

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

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

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

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

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

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

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

(キャプチャが無いですが、ここで先ほど開いたExcelファイルを閉じています。)
「記録終了」ボタンを押して、マクロの記録を終わらせます。

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

先ほど記録したソースコードが表示されました。
「Excelファイルを開く」操作は記録されていなくて、すでに開いているExcelファイルのシート1つをPDF保存し、Excelファイルを閉じるだけのソースです。
この子を改良していきます。

注意したいのが、このオプションです。
OpenAfterPublish:= True
Trueのままだと、PDF化するたびに全部PDFファイルを表示してしまいます。
Falseにするか消してしまいましょう。
流用出来るモノは流用する
コーディングに際して使いまわし出来るモノがありまして、実は以前、ExcelファイルをGrepするマクロを作成しました。
特定のフォルダ配下に存在しているExcelファイルを、1つずつ開いて1シートずつキーワードが含まれるセルを検索するもの。
これを流用することで、PDF化のマクロがサクッとコーディング出来ました!!
※ソースコードは下のほうに貼っておきます

特定のフォルダ配下のExcelファイルを全部PDF化
ちょっと動かしてみたいと思います。
C4のセルには、PDF化したいExcelファイルが格納されているパス、
C5のセルはPDFを保存するパスです。

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

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

では、「ExcelPDF化」ボタンをポチッと。
量が少ないので、10秒もかからず完了しました。

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

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

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

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のボタンも付ければ動くと思います。
最後までお読みいただき、ありがとうございました。





