【PowerPoint VBA】プロの現場で生き残る!「絶対に止めない」堅牢なPDF一括変換アーキテクチャ
こんにちは。自動化の世界へようこそ。
マクロの記録で生成されたコードは、いわば「温室育ちの子供」です。しかし、私たちが挑むのは、数百ものファイルが飛び交う過酷なエンタープライズの現場。
「ディスクがいっぱいになった」「誰かがファイルを開きっぱなしにしている」「権限が足りない」。そんな日常的なトラブルで、深夜のバッチ処理がエラー終了し、翌朝の進捗確認で青ざめる……そんな経験は今日で終わりにしましょう。
今日は、「エラーを恐れず、エラーを記録し、システムを止めない」ための、プロの鉄則を伝授します。
—
1. なぜ「そのまま」ではいけないのか?
PowerPointの `ExportAsFixedFormat` メソッドは非常に強力ですが、ネットワークドライブの切断やファイルロックに対して非常に脆弱です。
もしエラーハンドリングを怠ると、VBAは「実行時エラー」を吐いて唐突に終了します。これでは、「どのファイルが変換できて、どれが失敗したのか」すら分からなくなります。
プロの自動化エンジニアにとって、プログラムが失敗することは「想定内」。「失敗したときに、いかにスマートに報告書を残すか」こそが、真の価値なのです。
—
2. 実装の極意:エラーログ管理のテンプレート
今回作成するのは、単なる変換コードではありません。「変換試行・成功・失敗」の全履歴をCSVに吐き出す堅牢な構造体です。
以下のコードは、モジュールとしてそのまま現場に導入できる品質で設計しています。
Option Explicit
‘ エラーをトラップし、CSVに記録する一括変換プロシージャ
Sub ExportPresentationsToPDF_WithLogging()
Dim pptApp As Object
Dim folderPath As String, targetFile As String
Dim logFilePath As String
Dim fso As Object
Dim logFile As Integer
‘ ログファイルの準備
logFilePath = ThisWorkbook.Path & “\ExportLog_” & Format(Now, “yyyymmdd_hhnnss”) & “.csv”
Set fso = CreateObject(“Scripting.FileSystemObject”)
logFile = FreeFile
Open logFilePath For Output As #logFile
Print #logFile, “FileName,Status,ErrorMessage,Timestamp”
‘ 対象フォルダの指定(適宜変更してください)
folderPath = “C:\TargetFolder\”
targetFile = Dir(folderPath & “.pptx”)
Do While targetFile <> “”
On Error Resume Next ‘ エラーを無視して記録フェーズへ
‘ 変換処理の実行
ExportSinglePresentation folderPath & targetFile
‘ エラー判定
If Err.Number <> 0 Then
Print #logFile, “””” & targetFile & “””,FAILED,””” & Err.Description & “””,” & Now
Else
Print #logFile, “””” & targetFile & “””,SUCCESS,None,” & Now
End If
On Error GoTo 0 ‘ エラー検知を通常に戻す
targetFile = Dir()
Loop
Close #logFile
MsgBox “処理完了。ログを確認してください: ” & logFilePath
End Sub
‘ 変換専用のサブプロシージャ
Sub ExportSinglePresentation(filePath As String)
Dim ppt As Presentation
Set ppt = Presentations.Open(filePath, WithWindow:=msoFalse)
‘ PDFエクスポート
ppt.ExportAsFixedFormat Replace(filePath, “.pptx”, “.pdf”), 2 ‘ 2はppFixedFormatTypePDF
ppt.Close
End Sub
—
3. このコードを読み解く「3つの重要ポイント」
① `On Error Resume Next` の正しい使い方
初心者は「エラーを隠すために使う」と考えがちですが、プロは違います。「あえて制御を止めず、エラー情報を変数 `Err` に確保するために使う」のが正解です。エラーが起きた瞬間にプログラムを止めるのではなく、その情報をCSVに書き出す時間を与えるのです。
② `WithWindow:=msoFalse` の魔法
プレゼンテーションを開く際、デフォルトでは画面にウィンドウが表示されます。これでは処理が遅くなる上に、PC操作の邪魔になります。`msoFalse` を指定することで、メモリ上の「幽霊(バックグラウンドプロセス)」として処理させ、圧倒的な高速化を実現します。
③ CSVによるログ出力
Excelでログを開けば、オートフィルター機能を使って「FAILED」の行だけを一瞬で抽出できます。運用担当者にとって、これほど管理しやすいログ形式はありません。
—
4. さあ、現場で試してみよう
このコードは「動く」だけでなく、「運用できる」レベルの設計です。
- ディスク満杯? → ログには「Disk Full」等のエラー内容が書き込まれます。
- ファイルロック? → ログには「Permission Denied」が残ります。
あとは、ログファイルをチェックする運用ルールを一つ決めるだけです。
「プログラムが止まらない」という安心感は、自動化エンジニアにとって最大の武器になります。
まずは、手元のテスト用フォルダでこのスクリプトを動かしてみてください。完璧な自動化の第一歩は、ここから始まります。
何か詰まったら、いつでも聞いてください。我々は「コードを書く人」ではなく、「現場の時間を創り出す人」なのですから。
