この記事を読むのに必要な時間は約 7 分です。
「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ファイルを閉じるだけのソースです。
この子を改良していきます。
注意したいのが、このオプションです。
1 |
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化」のボタン)
1 2 3 4 5 |
Option Explicit Private Sub CommandButton1_Click() Call xlsToPDF_Main End Sub |
PDF化の本体
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
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のボタンも付ければ動くと思います。
最後までお読みいただき、ありがとうございました。