PowerPoint VBAを「無人稼働」させるための極意:Windowsイベントログへのエラー吐き出し術
こんにちは。現場で「動いて当たり前」の自動化システムを構築し続けているエンジニアです。
皆さんが今、マクロの記録から一歩踏み出し、PowerPoint VBAを使って「自動で資料を作成・変換する」プログラムを書いているなら、一つだけ覚えておいてください。「プログラムは必ず失敗する」という前提です。
特に、サーバーやタスクスケジューラで無人稼働させる場合、画面を見ることができません。ファイルが壊れている、ディスクがいっぱい、権限がない……そんな時に「何が起きたか」を闇の中に隠してはいけません。
今回は、エラーをWindowsの標準機能である「イベントログ」に直接書き込み、プロの監視網に組み込むための「エンタープライズ級の防御術」を授けます。
—
1. なぜ「イベントログ」なのか?
VBAでエラーが起きたとき、`MsgBox`でエラーを表示させていませんか? 無人環境で`MsgBox`が出ると、プログラムはその画面を閉じるまで永遠にフリーズします。
Windowsには「イベントビューアー」という強力なログ管理機能があります。ここにエラーを送り込めば、IT管理者はシステム監視ツールを通じて「どこのサーバのどのマクロで何が起きたか」を一瞬で把握できます。
2. 実装の設計図
Windowsのイベントログを操作するために、VBAから「WScript.Shell」というWindowsの標準オブジェクトを呼び出します。これにより、コマンドライン経由で `eventcreate` コマンドを実行し、OSのログ領域に直接書き込みを行います。
必要なコード実装
以下のモジュールは、プレゼンテーションを開いてPDFに変換する処理を例に、堅牢なエラーハンドリングを実装したものです。
‘ ———————————————————
‘ プレゼンテーション変換・監視モジュール
‘ ———————————————————
Sub ExportPresentationWithLogging(pptPath As String, exportPath As String)
Dim pptApp As Object
Dim pres As Object
On Error GoTo ErrorHandler
‘ プロセスを確実に制御するためにCreateObjectを使用
Set pptApp = CreateObject(“PowerPoint.Application”)
Set pres = pptApp.Presentations.Open(pptPath, , , False) ‘ バックグラウンドで開く
‘ PDF出力処理
pres.SaveAs exportPath, 32 ‘ 32 = ppSaveAsPDF
pres.Close
pptApp.Quit
Exit Sub
ErrorHandler:
‘ 【重要】エラー発生時にOSイベントログへ書き込む
Call WriteToEventLog(“PowerPointAutomation”, Err.Description, Err.Number)
‘ 後始末
If Not pres Is Nothing Then pres.Close
If Not pptApp Is Nothing Then pptApp.Quit
MsgBox “致命的なエラーが発生しました。イベントログを確認してください。”, vbCritical
End Sub
‘ ———————————————————
‘ Windowsイベントログへの書き込み関数
‘ ———————————————————
Sub WriteToEventLog(sourceName As String, errorMessage As String, errorCode As Long)
Dim shell As Object
Dim cmd As String
Set shell = CreateObject(“WScript.Shell”)
‘ eventcreateコマンドでログを生成
‘ /T エラー種別, /ID イベントID, /D メッセージ
cmd = “eventcreate /T ERROR /ID 1001 /L APPLICATION /SO ” & sourceName & _
” /D “”VBA Error ” & errorCode & “: ” & errorMessage & “”””
‘ コマンドを実行(0はウィンドウ非表示)
shell.Run cmd, 0, True
End Sub
—
3. このコードの「プロのこだわり」
① `CreateObject` によるプロセス分離
`Application` を直接宣言するのではなく、`CreateObject` を使うことで、ExcelやWord等の他タスクとの競合や、ゾンビプロセスの発生を抑制します。
② バックグラウンド処理の鉄則
`Presentations.Open` の引数で `WithWindow:=False` を指定しています。これを行うことで、画面描画を省き、処理速度を向上させると同時に、無人環境での意図しないウィンドウ表示を防ぎます。
③ コマンドラインによる直接注入
`eventcreate` はWindows標準コマンドです。これを使うことで、複雑なAPI(Windows API)を直接VBAから叩くリスク(メモリリークやOS互換性問題)を避け、OSの作法に則ってログを記録できます。
—
4. 陥りやすい罠と解決策
- 権限の問題: `eventcreate` を実行するには、マクロを実行するユーザーに「管理者権限」が必要な場合があります。本番環境では、タスクスケジューラの設定で「最上位の権限で実行する」にチェックを入れてください。
- ファイル破損: `On Error GoTo` を使わずに処理を書くと、破損ファイルを開こうとした瞬間にExcelやPowerPoint自体が「応答なし」で固まります。必ず `Open` メソッドはエラーハンドリングの監視下においてください。
- ディスク容量: `SaveAs` の前に、あらかじめ `Dir` 関数などで保存先のパスが存在するか、または空き容量があるかを確認するチェック処理を挟むと、より「プロフェッショナル」なコードになります。
—
最後に:ここをクリアすれば、あなたはもう「中級者」
今回ご紹介した「ログを記録する」という発想は、単なるプログラミングを超えた「運用設計」の領域です。
ここをクリアすれば、あなたは「自分のパソコンで動けばいい」という段階を卒業し、「止まらないシステムを設計できるエンジニア」への切符を手に入れたことになります。
コードは道具です。大切なのは、道具が壊れたときに「なぜ壊れたか」を教えてくれる仕組みを作ること。ぜひ、あなたの自動化プロジェクトにこの監視モジュールを組み込んでみてください。応援しています!
