ExcelのVBAで複数のWordファイルをPDF化する

今回は複数あるWordファイルを自動でPDF化する処理を実装してみます。
1つのファイルをPDFにする時はエクスポートするだけで済みますが、何十個もファイルがある時は大変です。

そこでVBAによって、PDF化を自動で行います。
シート上のボタン「Officeファイル取得」と「PDF出力先決定」を押して、PDFにするファイルとその出力先を決定後、ボタン「PDF化」を押して実行します。

実際に行うと以下のようになります。

①Wordファイルと出力先の指定
f:id:astrophysik928:20190227225749p:plain

②PDF処理前
f:id:astrophysik928:20190227231119p:plain

③PDF処理後
f:id:astrophysik928:20190227231212p:plain


事前準備

VBAでWordファイルを扱うので、事前に設定を行う必要があります。
次の二つを参照設定できるようにします。


Microsoft Word xx.x Object Library
Microsoft Scripting Runtime


Excel のVBEの「ツール」メニューの「参照設定」をクリックします。

表示された「参照設定 - Project」ダイアログの中から「Microsoft Word xx.x Object Library」(xx.x は14.0などバージョン番号)にチェックを入れて、「OK」ボタンをクリックします。
これで、ExcelからWordファイルを操作できるようになります。

また、今回はファイル類を操作するに便利なFileSystemObjectも使用するので、同様に「Microsoft Scripting Runtime」にもチェックを入れます。参照設定をすることでFileSystemObjectに関係するメソッド(GetAbsolutePathNameやGetParentFolderName)が入力中に自動で表示されるようになり、タイプミスを減らすことができます。以下のサイトに、詳しく記述があります。

FileSystemObjectの参照設定を行う:FSO・FileSystemObjectの使い方


ソースコード

では、次にソースコードを見てみます。


それぞれの関数について説明します。


Sub main()
ボタン「PDF化」を押すと、関数word2PDFを実行します。

●Sub word2PDF(documentsPath As Variant, outputPath As String)
引数にdocumentsPath(各Wordファイルのパスを格納した配列)とoutputPath(出力先パス)があります。各WordファイルをPDFにします。

●Sub writeOfficePath()
ボタン「Officeファイル取得」を押すと実行され、WordファイルのパスがExcelに書き込まれます。

●Sub writeOutputFolder()
ボタン「PDF出力先決定」を押すと実行され、PDFの出力先ファルダのパスがExcelに書き込まれます。

●Function getOutputPath() As String
PDF出力先のパスを取得し、戻り値として返します。

●Function getDocumentsPath() As Variant
各Wordファイルのパスを取得し配列に格納、戻り値として返します。



この中で特に、
■Sub word2PDF(documentsPath As Variant, outputPath As String)
■Sub writeOfficePath()


について詳しく説明していきます。

Sub word2PDF(documentsPath As Variant, outputPath As String)


Set fso = New Scripting.FileSystemObject
でファイルを操作するのに必要なFileSystemObjectインスタンスが作成されます。


Set wordApplication = CreateObject("Word.Application")
wordApplication.Visible = True

でWordのApplicationオブジェクトを作成後、VisbleをTrueにしてWordを表示します。


Set openDoc = wordApplication.Documents.Open(fileName:=filePath, ReadOnly:=True)
「fileName:=filePath」で開きたいWordのパスを指定します。
また「ReadOnly:=True」で読み取り専用でWordを開きます。既に他のWordが開いていた時に処理が複雑になるためです。


openDoc.ExportAsFixedFormat _
OutputFileName:=pdfName, _
ExportFormat:=wdExportFormatPDF, _
OpenAfterExport:=False, _
OptimizeFor:=wdExportOptimizeForPrint, _
Range:=wdExportAllDocument, _
Item:=wdExportDocumentContent, _
IncludeDocProps:=True, _
KeepIRM:=True, _
CreateBookmarks:=wdExportCreateHeadingBookmarks, _
DocStructureTags:=True, _
BitmapMissingFonts:=True, _
UseISO19005_1:=False

で、開いたWordをPDFに変換します。
重要と思われるプロパティのみ説明します。全てについては、以下のサイトに詳しく書いてあります。
Document.ExportAsFixedFormat(String, WdExportFormat, Boolean, WdExportOptimizeFor, WdExportRange, Int32, Int32, WdExportItem, Boolean, Boolean, WdExportCreateBookmarks, Boolean, Boolean, Boolean, Object) Method (Microsoft.Office.Tools.Word) | Microsoft Docs


・OutputFileName・・・新しい PDFファイルのパスとファイル名。
・ExportFormat・・・文書を PDF 形式または XPS 形式のどちらで保存するかを指定する 。
・OpenAfterExport・・・新しいファイルを自動で開くか否か。
・Range・・・エクスポート範囲が、文書全体か現在のページかなどの指定。



wordApplication.Visible = False
Set wordApplication = Nothing

で完全にWordを閉じます。Nothingを代入することで、Wordアプリケーションオブジェクトが破棄されます。
これをしないと、Wordアプリケーションオブジェクトに使っていたメモリが解放されません。

Sub writeOfficePath()


fileName = Application.GetOpenFilename(FileFilter:="word, *.doc? ; *.docx?", MultiSelect:=True)
で、PDFにしたいWordをファイル選択ウィンドウを表示しています。
「FileFilter」で選択するファイルを絞り込みます。「word」は任意の文字、「*.doc?」「*.docx?」は拡張子であり、いずれかの拡張子を持つWordのみがウィンドウで表示されます。

f:id:astrophysik928:20190302185506p:plain

「MultiSelect:=True」で複数ファイルを選択できるようにします。

これらのことについては以下のサイトが詳しいです。
Office TANAKA - ファイルの操作[名前を指定してブックを開く]


私のPCにはPowerPointがないためWordだけでしたが、今度はWordもPowerPointExcelもまとめて選択して一度にPDF化できる機能を実装したいです。