ExcelのVBAで複数のWordファイルをPDF化する
今回は複数あるWordファイルを自動でPDF化する処理を実装してみます。
1つのファイルをPDFにする時はエクスポートするだけで済みますが、何十個もファイルがある時は大変です。
そこでVBAによって、PDF化を自動で行います。
シート上のボタン「Officeファイル取得」と「PDF出力先決定」を押して、PDFにするファイルとその出力先を決定後、ボタン「PDF化」を押して実行します。
実際に行うと以下のようになります。
①Wordファイルと出力先の指定
②PDF処理前
③PDF処理後
事前準備
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のみがウィンドウで表示されます。
「MultiSelect:=True」で複数ファイルを選択できるようにします。
これらのことについては以下のサイトが詳しいです。
Office TANAKA - ファイルの操作[名前を指定してブックを開く]
私のPCにはPowerPointがないためWordだけでしたが、今度はWordもPowerPointもExcelもまとめて選択して一度にPDF化できる機能を実装したいです。