【入門編】【上級者】プレゼンテーションの読み込み・処理・保存の全プロセスにおける例外(ディスク容量不足、アクセス権限喪失、ファイル破損)をキャッチし、Windowsイベントログへ直接書き出すエンタープライズ監視モジュール – PowerPoint VBA解析バイブル

スポンサーリンク

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` 関数などで保存先のパスが存在するか、または空き容量があるかを確認するチェック処理を挟むと、より「プロフェッショナル」なコードになります。

—

最後に:ここをクリアすれば、あなたはもう「中級者」

今回ご紹介した「ログを記録する」という発想は、単なるプログラミングを超えた「運用設計」の領域です。

ここをクリアすれば、あなたは「自分のパソコンで動けばいい」という段階を卒業し、「止まらないシステムを設計できるエンジニア」への切符を手に入れたことになります。

コードは道具です。大切なのは、道具が壊れたときに「なぜ壊れたか」を教えてくれる仕組みを作ること。ぜひ、あなたの自動化プロジェクトにこの監視モジュールを組み込んでみてください。応援しています!

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