PowerPoint VBAの暗黒面を制御せよ:デッドロックを回避する「ウォッチドッグ」設計論
こんにちは。業務自動化の深淵へようこそ。
多くの人がPowerPoint VBAを「スライドを作るための道具」だと思っていますが、それは大きな誤解です。PowerPointはCOM(Component Object Model)という複雑な仕組みの上で動く「巨大なプロセス」であり、一度機嫌を損ねると、背後でプロセスがゾンビ化し、PCのメモリを喰らい尽くしてフリーズを引き起こします。
特に、大量のファイルを一括でPDF変換したり、複雑な処理を連続して行ったりする場合、「応答なし」の壁は必ずやってきます。今日は、そんな絶望的な状況を打開するための、上級エンジニアの処方箋――「ウォッチドッグ(番犬)型プロセス管理」を伝授します。
—
1. なぜPowerPoint VBAは「ハングアップ」するのか?
VBAで `Presentation.Open` を繰り返すと、バックグラウンドでPowerPointのインスタンスが解放されないまま蓄積されることがあります。これがメモリリークです。また、モーダルダイアログ(「保存しますか?」等の警告)が裏で出現し、処理が止まってしまうのも典型的な死因です。
これらを力技で解決するのが、「メイン処理」と「監視プロセス」の分離です。
—
2. 鋼の意志を持つ「ウォッチドッグ」の実装例
メインのVBAから直接制御するのではなく、別タスクから監視を行う手法が最も安全です。ここでは、VBAから呼び出せる「監視用VBScript」の概念コードを紹介します。
このスクリプトは、指定した時間内に処理が終わらない場合、PowerPointのプロセスを強制的にKillします。
‘ WatchDog.vbs
‘ 使い方: cscript WatchDog.vbs “PowerPoint.exe” 60
‘ 60秒以上応答がないプロセスを強制終了する番犬
Set objWMIService = GetObject(“winmgmts:\\.\root\cimv2”)
processName = WScript.Arguments(0)
timeout = WScript.Arguments(1)
Do
Set colProcesses = objWMIService.ExecQuery _
(“Select from Win32_Process Where Name = ‘” & processName & “‘”)
For Each objProcess in colProcesses
‘ ここでプロセスの稼働時間を監視
‘ 本来は CreationDate と現在時刻の差分をとる
‘ 応答がなければ objProcess.Terminate() で葬り去る
Next
WScript.Sleep 5000 ‘ 5秒おきに監視
Loop
—
3. VBA側:安全な「非同期風」シーケンス制御
VBAで最もやってはいけないのは、`DoEvents`を乱用して無理やりループを回すことです。代わりに、「処理を最小単位に分割し、再帰的に実行する」という設計思想を持ちましょう。
‘ メイン処理:安全なバッチ実行のテンプレート
Sub BatchProcess()
Dim targetFiles As Collection
‘ ファイルリストを取得する処理(省略)
For Each file In targetFiles
‘ 1. 毎回新しいインスタンスを生成せず、再利用する設計
‘ 2. On Error GoTo で例外を必ずキャッチする
On Error GoTo ErrorHandler
Call ProcessSingleFile(file)
Continue:
Next file
Exit Sub
ErrorHandler:
Debug.Print “エラー発生: ” & Err.Description
‘ ここでログを吐き出し、プロセスを再起動させる
Resume Continue
End Sub
ここがポイント:VBAの「死」を防ぐ3か条
1. DisplayAlerts = False を徹底せよ
処理中に「フォントがありません」「保存しますか?」という警告が出ると、プログラムは永遠に止まります。
`Application.DisplayAlerts = ppAlertsNone` を冒頭に必ず入れましょう。
2. Objectを明示的に解放せよ
`Set pptApp = Nothing` を忘れると、バックグラウンドに「見えないPowerPoint」が残り続けます。これが5個溜まると、PCのパフォーマンスは劇的に低下します。
3. 「待機」には Sleep API を使う
`Application.Wait` よりも、Windows APIの `Sleep` を使う方が、プロセスの占有率が低く安定します。
—
4. 最後に:自動化の先にあるもの
初心者のうちは「マクロが動いた!」で喜びますが、プロのエンジニアは「マクロが失敗した時に、どれだけ周囲に迷惑をかけずに復旧できるか」に心血を注ぎます。
今回紹介した「ウォッチドッグ」と「プロセス再利用設計」を身につければ、あなたの自動化ツールは、深夜に勝手に走り続け、朝には完璧なレポートが出来上がっている――そんな「自律的なシステム」へと進化するはずです。
もしコードが動かない、あるいは「プロセスがどうしても残る」という壁にぶつかったら、それはあなたがより深い階層に到達した証拠です。次は、COMインターフェースを直接操作する「Late Binding(遅延バインディング)」の世界でお会いしましょう。
さあ、あなたのコードに魂を込めてください。応援していますよ。
