VBA
PR

【Excel・VBA】ファイルを一括でPDF化する方法(サンプルコードあり)

works_0327
記事内に商品プロモーションを含む場合があります

 こんにちは!
 今回は、複数のファイルを一括でPDF化する方法をご紹介します。

この記事を読むと

VBAで、ファイルを一括でPDF化する方法が分かる

部長
部長

社会人くん、このフォルダに入っているExcelを全部PDFにしてくれるかな?

社会人くん
社会人くん

分かりました部長、、、、

って、ファイルが100個もあるじゃないですか!!

部長
部長

大変だと思うけど頑張ってね〜

社会人くん
社会人くん

全てPDF化するのにどれくらいかかるんだ、、、

スポンサー

はじめに

 普段の業務で、大量のファイルをPDF化する場面ってありますよね。
 手作業で処理することもできますが、ファイル数が増えてくると時間がかかります。特に、定期的にこのような業務が発生している場合には、「この作業が一瞬でできならな〜」と考えたことがあるのではないでしょうか。
 このような悩みは、VBAによる自動化で解決できます。次の章から、ファイルを一括でPDF化するコードを紹介します。

ファイルをPDF化するコード

 ファイルをPDF化するコードは下記のとおりです。

1Sub Convert_to_PDF()
2    Dim strDirPath As String
3    strDirPath = Search_Directory() 'フォルダの選択
4    If Len(strDirPath) = 0 Then Exit Sub
5    Call Make_Dir(strDirPath, "\PDF") 'フォルダ作成
6    Call Search_Files(strDirPath)
7    MsgBox ("pdfファイル作成が完了しました")
8End Sub
9
10Private Function Search_Directory() As String 'フォルダの選択
11    With Application.FileDialog(msoFileDialogFolderPicker)
12        If .Show = True Then Search_Directory = .SelectedItems(1)
13    End With
14End Function
15
16Private Sub Make_Dir(ByVal Path As String, ByVal Folder_name As String)
17    If Dir(Path & Folder_name, vbDirectory) = "" Then 'フォルダの存在確認
18        MkDir Path & Folder_name 'フォルダ作成
19    End If
20End Sub
21
22Private Sub Search_Files(ByVal Path As String)
23    Dim strFile As String, strET As String
24    strFile = Dir(Path & "\" & "*.*") 'ファイルの存在確認
25    Application.ScreenUpdating = False
26    Do Until strFile = ""
27        If ThisWorkbook.FullName <> Path & "\" & strFile Then
28            Call Conv_PDF(Path, "\" & strFile)
29        End If
30        strFile = Dir() '次のファイル確認
31    Loop
32    Application.ScreenUpdating = True
33End Sub
34
35Private Function Get_Extension(ByVal Path As String) As String '拡張子を取得
36    Dim i As Long
37    i = InStrRev(Path, ".", -1, vbTextCompare)
38    If i = 0 Then Exit Function
39    Get_Extension = Mid$(Path, i + 1)
40End Function
41
42Private Sub Conv_PDF(ByVal Path As String, ByVal Fn As String)
43    Dim filePath As String, objOffice As Object
44    filePath = Path & "\PDF" & Left$(Fn, InStrRev(Fn, ".")) & "pdf"
45    Path = Path & Fn
46    Select Case Get_Extension(Fn) 'ファイル名から拡張子を取得
47        Case "xls", "xlsx" 
48            Set objOffice = Excel.Application
49            With objOffice.Workbooks.Open(Path)
50                .ExportAsFixedFormat Type:=xlTypePDF, _
51                Filename:=filePath, Openafterpublish:=False
52                .Close
53            End With
54        Case "doc", "docx" 
55            Set objOffice = CreateObject("Word.Application")
56            With objOffice.Documents.Open(Path)
57                .ExportAsFixedFormat OutputFileName:=filePath, _
58                ExportFormat:=17
59                .Close
60            End With
61            objOffice.Quit
62        Case "ppt", "pptx"
63            Set objOffice = CreateObject("Powerpoint.Application")
64            With objOffice.Presentations.Open(Path)
65                .SaveAs Filename:=filePath, FileFormat:=32
66                .Close
67            End With
68            objOffice.Quit
69    End Select
70End Sub
71

PDF化コードの使い方

 ここでは、上記のコードの簡単な使い方を解説します。下記の要領で、特定のフォルダ内のすべてのファイルをPDF化します。

事前準備

新規フォルダを作成し、PDF化したいファイルだけをすべて格納してください。

マクロを起動します。

任意の方法でマクロを起動してください。

PDF化したいフォルダを選択

マクロを起動するとファイルダイアログが開くので、STEP1で生成したフォルダを選択してください。

PDF生成完了

選択したフォルダの下層に「PDF」フォルダが生成され、PDF化したファイルが格納されています。

PDF化コードの解説

さて、使い方も分かったところで、上記のコードの詳細について、各パーツごとに解説します。
 可能であれば、コード全体と見比べながら読み進めてください。

パーツ①メインのSubプロシージャ

 PDF化コードは、Subプロシージャである「Convert_to_PDF()」をメインに、他のプロシージャを呼び出す構造となっています。

1Sub Convert_to_PDF()
2    Dim strDirPath As String
3    strDirPath = Search_Directory() 'フォルダの選択
4    If Len(strDirPath) = 0 Then Exit Sub
5    Call Make_Dir(strDirPath, "\PDF") 'フォルダ作成
6    Call Search_Files(strDirPath)
7    MsgBox ("pdfファイル作成が完了しました")
8End Sub

大まかな流れとしては、下記のとおりです。

PDF化対象フォルダを指定

「Search_Directory()」でstrDirPathに、PDF化対象のフォルダパスを格納

指定したフォルダ内に出力用フォルダを生成

「Make_Dir()」で、PDF化したファイルを保存(出力)するためのフォルダを生成

指定したフォルダ内にあるファイルをPDF化

「Search_Files()」で、指定したフォルダ内にあるファイルをPDF化します

パーツ②フォルダ選択用のプロシージャ「Search_Directory()」

 この部分では、PDF化したいファイルが格納されているフォルダを指定し、フォルダパスを返します。
 ここで取得したフォルダパスを、「Convert_to_PDF()」のstrDirに格納します。

1Private Function Search_Directory() As String 'フォルダの選択
2    With Application.FileDialog(msoFileDialogFolderPicker)
3        If .Show = True Then Search_Directory = .SelectedItems(1)
4    End With
5End Function

パーツ③PDF化したファイル保存用のフォルダを生成「Make_Dir()」

 この部分では、「Search_Directory()」で指定したフォルダの下層に、PDF化した後のファイルを保存するためのフォルダを生成します。

1Private Sub Make_Dir(ByVal Path As String, ByVal Folder_name As String)
2    If Dir(Path & Folder_name, vbDirectory) = "" Then 'フォルダの存在確認
3        MkDir Path & Folder_name 'フォルダ作成
4    End If
5End Sub

パーツ④ファイルを検索してヒットすればPDF化「Search_Files()」

 この部分では、下記の手順で指定したフォルダ内のファイル全て検索し、PDF化します。

ファイルの存在確認

指定したフォルダ内に、自ファイル(Excel)以外のファイルがあるか確認

ファイルのPDF化

ファイルを発見したときには、「Conv_PDF()」でファイルをPDF化

次のファイルの存在確認

PDF化が終わったら、指定したフォルダ内に他のファイルがないか確認。

STEP1〜3を繰り返す

STEP3で他のファイルが見つからなくなるまで繰り返し

1Private Sub Search_Files(ByVal Path As String)
2    Dim strFile As String, strET As String
3    strFile = Dir(Path & "\" & "*.*") 'ファイルの存在確認
4    Application.ScreenUpdating = False
5    Do Until strFile = ""
6        If ThisWorkbook.FullName <> Path & "\" & strFile Then
7            Call Conv_PDF(Path, "\" & strFile)
8        End If
9        strFile = Dir() '次のファイル確認
10    Loop
11    Application.ScreenUpdating = True
12End Sub

パーツ⑤ファイルを1つ1つPDF化「Conv_PDF」

 この部分では、ファイルの拡張子によって条件分岐し、それぞれPDF化を行います。

1Private Sub Conv_PDF(ByVal Path As String, ByVal Fn As String)
2    Dim filePath As String, objOffice As Object
3    filePath = Path & "\PDF" & Left$(Fn, InStrRev(Fn, ".")) & "pdf"
4    Path = Path & Fn
5    Select Case Get_Extension(Fn) 'ファイル名から拡張子を取得
6        Case "xls", "xlsx" 
7            Set objOffice = Excel.Application
8            With objOffice.Workbooks.Open(Path)
9                .ExportAsFixedFormat Type:=xlTypePDF, _
10                Filename:=filePath, Openafterpublish:=False
11                .Close
12            End With
13        Case "doc", "docx" 
14            Set objOffice = CreateObject("Word.Application")
15            With objOffice.Documents.Open(Path)
16                .ExportAsFixedFormat OutputFileName:=filePath, _
17                ExportFormat:=17
18                .Close
19            End With
20            objOffice.Quit
21        Case "ppt", "pptx"
22            Set objOffice = CreateObject("Powerpoint.Application")
23            With objOffice.Presentations.Open(Path)
24                .SaveAs Filename:=filePath, FileFormat:=32
25                .Close
26            End With
27            objOffice.Quit
28    End Select
29End Sub

うまく動作しないときの対処法

 ここでは、上記のコードでうまく動作しなかったときの対処法を解説します。

FileDialog(msoFileDialogFolderPicker)が実行されない

 エラーメッセージが「実行時エラー’91’ オブジェクト変数またはWithブロック変数が設定されていません。」と表示されたときは、このエラーの可能性があります。原因は「動作環境がExcel for Mac」であることが考えられます。
 これは動作環境が問題なので、Windows環境で動作させるか、AppleScriptを実行する必要があります。

記事URLをコピーしました