【入門編】【中級者】複数のPPTXファイルをPDF化する際、ファイル名に「作成者名」や「最終更新日」などのメタデータを自動付与してエクスポートするマクロ – PowerPoint VBA解析バイブル

スポンサーリンク

こんにちは!PowerPoint VBAの世界へようこそ。
「マクロの記録」ボタンを押して得られたコードを眺めるだけの日々は、もう終わりにしましょう。ここから先は、あなたの意のままにPowerPointを操る「自動化のエンジニア」への扉です。

今回は、実務で絶対に役立つ「複数PowerPointファイルをメタデータ(作成者や最終更新日)付きで自動PDF化するマクロ」を解説します。

ドキュメントの整理やアーカイブ業務で、こんな面倒な作業に悩まされたことはありませんか?

  • 「大量のPPTXファイルを開いて、プロパティを確認して、ファイル名をリネームして、PDFで保存して……って、何時間かかるんだ!」
  • 「ファイル名に日付や作成者を入れたいけれど、一つひとつ手作業でコピペするのはミスのもとだ」

ここをクリアすれば、ファイル操作とアプリケーション間連携の基本はバッチリです。
優しく、そして本質的なアプローチで一緒にマスターしていきましょう!

—

1. なぜ「メタデータ活用型PDF変換」なのか?

ファイル名に「誰が・いつ作った(更新した)か」という情報を含めることは、文書管理の鉄則です。しかし、それを人間が手動でやると、ヒューマンエラーが必ず発生します。

PowerPointには、各ファイルが内包する「組み込みドキュメントプロパティ(BuiltInDocumentProperties)」という強力なメタデータ領域があります。ここには、作成者、最終更新日時、タイトルなどの情報が自動的に記録されています。

VBAを使えば、「ファイルをバックグラウンドで開く $\rightarrow$ プロパティを安全に取得する $\rightarrow$ 規則正しいファイル名に整形してPDFとして書き出す」という一連の地獄のような手作業を、一瞬で、かつ完全にミスなく実行できるのです。

—

2. 開発の全体像と注意すべきポイント

今回のプログラムを構築するにあたり、PowerPoint VBA特有の「罠」を避けるための極限の知見を共有しておきます。

1. 画面描画の抑制(ScreenUpdating)はパワポに無い
Excel VBAと違い、PowerPoint VBAには`Application.ScreenUpdating`がありません。そのため、プレゼンテーションを開閉する際に見栄えを良くするために、ウィンドウを表示させない(`ReadOnly:=msoTrue` や `WithWindow:=msoFalse`)テクニックが必須になります。
2. エラーハンドリングの重要性
一括処理中に「パスワード付きファイル」や「破損したファイル」に出くわすと、マクロは容赦なくクラッシュします。`On Error Resume Next` を適切に使いこなすのがエンジニアの流儀です。

—

3. 実装コード:一括PDF変換マクロ

それでは、実際のコードを公開します。
開発タブの「Visual Basic」Editorを開き、標準モジュールに以下のコードを貼り付けてください。

(※実行前に、コード内の `targetFolderPath` をあなたの環境のフォルダパスに書き換えてください)

Sub ExportPptxToPdfWithMetadata()
Dim targetFolderPath As String
Dim fileName As String
Dim fso As Object
Dim targetFile As Object
Dim pptApp As PowerPoint.Application
Dim pptPres As PowerPoint.Presentation

‘ — 【設定】処理対象のフォルダパスを指定してください —
targetFolderPath = “C:\Your\Folder\Path\Here\” ‘ 最後に必ず「\」を入れてください

‘ フォルダの存在確認
Set fso = CreateObject(“Scripting.FileSystemObject”)
If Not fso.FolderExists(targetFolderPath) Then
MsgBox “指定されたフォルダが存在しません。” & vbCrLf & targetFolderPath, vbCritical, “パスエラー”
Exit Sub
End If

‘ FileSystemObjectでフォルダ内の全PPTXファイルを走査
Dim targetFolder As Object
Set targetFolder = fso.GetFolder(targetFolderPath)

Dim convertedCount As Long
convertedCount = 0

‘ 処理中の画面ちらつきを防ぐため、ステータスバーを活用
Application.DisplayStatusBar = True

For Each targetFile In targetFolder.Files
‘ 拡張子が .pptx または .ppt のファイルのみを対象とする
If LCase(fso.GetExtensionName(targetFile.Name)) Like “ppt” Then

‘ すでに一時ファイルやテンポラリファイル(~$で始まる)ならスキップ
If Left(targetFile.Name, 2) <> “~$” Then

On Error GoTo ErrorHandler

‘ プレゼンテーションをウィンドウ非表示でサイレントオープン
‘ Presentation.Openの引数: (Filename, ReadOnly, WithWindow)
Set pptPres = Presentations.Open(targetFile.Path, ReadOnly:=msoTrue, WithWindow:=msoFalse)

‘ — メタデータの取得 —
Dim authorName As String
Dim lastSaveDate As String
Dim cleanDate As String

‘ 作成者を取得(空欄の場合は “Unknown”)
On Error Resume Next
authorName = pptPres.BuiltInDocumentProperties(ppPropertyAuthor)
If Err.Number <> 0 Or authorName = “” Then authorName = “UnknownAuthor”
On Error GoTo ErrorHandler

‘ 最終更新日時を取得し、ファイル名に使えない記号(/や:)を置換する
On Error Resume Next
lastSaveDate = pptPres.BuiltInDocumentProperties(ppPropertyLastSaveTime)
If Err.Number <> 0 Then
cleanDate = Format(Date, “yyyymmdd”)
Else
cleanDate = Format(CDate(lastSaveDate), “yyyy-mm-dd”)
End If
On Error GoTo ErrorHandler

‘ — 保存ファイル名の組み立て —
‘ 元のファイル名(拡張子なし) + “_” + 最終更新日 + “_” + 作成者
Dim originalBaseName As String
originalBaseName = fso.GetBaseName(targetFile.Name)

Dim newPdfName As String
newPdfName = targetFolderPath & originalBaseName & “_” & cleanDate & “_” & authorName & “.pdf”

‘ — PDFとしてエクスポート —
pptPres.SaveAs newPdfName, ppSaveAsPDF

‘ プレゼンテーションを閉じる
pptPres.Close
Set pptPres = Nothing

convertedCount = convertedCount + 1
End If
End If
GoTo NextFile

ErrorHandler:
‘ 個別ファイルのエラーを捕捉し、全体を止めることなく次へ進む
MsgBox “ファイル「” & targetFile.Name & “」の処理中にエラーが発生しました。” & vbCrLf & _
“エラー内容: ” & Err.Description, vbExclamation, “個別エラー”
If Not pptPres Is Nothing Then
pptPres.Close
Set pptPres = Nothing
End If

NextFile:
On Error GoTo 0 ‘ エラーハンドラーをリセット
Next targetFile

‘ 後片付け
Set fso = Nothing

‘ 完了通知
MsgBox “処理が完了しました!” & vbCrLf & “変換成功ファイル数: ” & convertedCount & “件”, vbInformation, “完了”
End Sub

—

4. コードの核心を読み解く

初心者から中級者へステップアップするために、このコードの重要なポイントを3つに絞って解説します。

① `Presentations.Open` の引数の魔力

通常、PowerPointでファイルを開くと画面上にドキュメントがパッと表示され、処理が重くなります。しかし、ここでは以下のように記述しています。

Presentations.Open(targetFile.Path, ReadOnly:=msoTrue, WithWindow:=msoFalse)

  • `ReadOnly:=msoTrue`:元ファイルを誤って書き換えないための安全装置。
  • `WithWindow:=msoFalse`:これこそがプロの技。 ウィンドウを画面に描画させずにバックグラウンドで開くため、処理スピードが劇的に向上し、画面がパチパチ切り替わるストレスから解放されます。

② `BuiltInDocumentProperties` による情報の宝庫へのアクセス

PowerPointファイルには、OSが持つファイルの更新日だけでなく、ドキュメント内部にメタデータが保持されています。

authorName = pptPres.BuiltInDocumentProperties(ppPropertyAuthor)

定数 `ppPropertyAuthor` や `ppPropertyLastSaveTime` を使うことで、面倒なパース処理をすることなく、安全にプロパティの値を抽出できます。

③ ファイル名に使えない文字のサニタイジング(無害化)

最終更新日時(`ppPropertyLastSaveTime`)をそのまま文字列にすると、`2023/10/25 15:30:00` のようにスラッシュやコロンが含まれます。これらはWindowsのファイル名に使用できない文字(禁止文字)です。
コード内では `Format(CDate(lastSaveDate), “yyyy-mm-dd”)` と変換することで、ファイル名として安全な文字列に整形しています。

—

5. よくあるエラーとつまずきポイント

  • Q: 「型が一致しません」というエラーが出るのですが?
  • A: まれに古い形式の `.ppt` ファイルや、作成者が未設定のファイルが存在すると、プロパティの中身が空(Null)や予期せぬ型になっていることがあります。コード内に組み込んでいる `On Error Resume Next` とエラー回避のロジックが、その暴走を防いでくれます。
  • Q: 生成されたPDFのファイル名に謎のスペースや改行が入る
  • A: 作成者名(Author)に社内システムの都合でスペースや特殊文字が含まれている場合があります。実務で使う際は、さらに `Replace(authorName, ” “, “_”)` などの置換処理を加えると、より堅牢なシステムになります。

—

おわりに:ここをクリアすれば基本はバッチリ!

いかがでしたでしょうか?
今回は、ファイルの走査、オブジェクトの非表示オープン、組み込みプロパティの抽出、そしてファイル名の一括変換という、業務自動化に必須のエッセンスを凝縮して解説しました。

ここをクリアできれば、単なる「マクロの記録の継ぎ接ぎ」から脱却し、「自分の手で業務プロセスをデザインし、システムを構築できる中級エンジニア」の領域に足を踏み入れています。

ぜひ、ご自身の職場にあるファイル山積みのフォルダで試してみてください。一瞬で処理が終わる爽快感を味わえるはずです。
それでは、快適なVBAライフを!次回の応用編でお会いしましょう。

タイトルとURLをコピーしました