PowerPointの「自動運転」を極める:VBAによるスライドショー制御の深淵
PowerPointの自動再生機能は、GUIのダイアログから設定するものではない。それは、プレゼンテーションという枠組みを超えた「エッジコンピューティングのインターフェース」である。
展示会場のキオスク端末や、企業の受付ディスプレイにおいて、スライドショーが停止することは許されない。本稿では、`SlideShowSettings` オブジェクトを深層から掌握し、システム間連携やメモリ管理までを含めた「止めない自動運転」のためのアーキテクチャを提示する。
—
1. SlideShowSettings を制御する「真の作法」
多くの初心者は `SlideShowSettings` の各プロパティを場当たり的に変更するが、これは危険だ。プレゼンテーションの実行モードはグローバルな状態に強く依存するため、実行前後の「状態の確定(Commit)」を意識せねばならない。
キオスクモードの実装において最も重要なのは、`LoopUntilStopped` を True にしつつ、`AdvanceMode` を `ppSlideShowUseSlideTimings` に固定することだ。
‘ 堅牢なスライドショー設定の初期化
Public Sub ConfigureKioskMode(ByRef targetPres As Presentation)
With targetPres.SlideShowSettings
.LoopUntilStopped = msoTrue
.ShowType = ppShowTypeKiosk ‘ キオスクモード:ESCキー無効化等、排他的制御
.AdvanceMode = ppSlideShowUseSlideTimings
.RangeType = ppShowAll ‘ または ppShowNamedSlideShow でカスタムショー指定
‘ 重要なのは、設定変更後にメモリ上のオブジェクトを同期させること
‘ 冗長に見えるが、COMオブジェクトの整合性を保つための儀式である
End With
End Sub
—
2. メモリ最適化とオブジェクトのライフサイクル
VBAのガーベジコレクションは、非決定論的である。特にPowerPointのAPIにおいて、`SlideShowWindow` オブジェクトを放置することは、メモリリークの温床となる。
長時間稼働するシステムでは、スライドショーを終了させる際に必ず `SlideShowWindow` を明示的に破棄せよ。これを行わないと、プレゼンテーションプロセスがゾンビ化し、次回の起動に失敗する。
Public Sub ForceKillSlideShow()
Dim ssw As SlideShowWindow
‘ 実行中のスライドショーを検索して破棄
For Each ssw In Application.SlideWindows
ssw.View.Exit
Next ssw
‘ オブジェクトの明示的解放(VBAではNothing代入が基本だが、
‘ アプリケーションの参照を保持しすぎないことが長稼働のコツ)
Set ssw = Nothing
End Sub
—
3. Windows APIによる「強制全画面・最前面」維持
展示会環境では、Windowsのポップアップ通知や他アプリケーションの割り込みが最大の敵となる。VBA単体では制御しきれないウィンドウの階層制御には、`User32.dll` の力を借りるのがシニアの流儀だ。
`SetWindowPos` を使用して、スライドショーウィンドウを常に最前面(Topmost)に固定する。
If VBA7 Then
Private Declare PtrSafe Function SetWindowPos Lib “user32” _
(ByVal hwnd As LongPtr, ByVal hWndInsertAfter As LongPtr, _
ByVal x As Long, ByVal y As Long, ByVal cx As Long, _
ByVal cy As Long, ByVal wFlags As Long) As Long
End If
Private Const HWND_TOPMOST = -1
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
‘ スライドショーのウィンドウハンドルを取得し、最前面に固定する
Public Sub EnforceTopmost(ByVal hwnd As LongPtr)
Call SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE)
End Sub
—
4. システム間連携:外部信号によるコンテンツ切り替え
真の自動運転とは、スライドショー側から自律的に動くことではない。外部のMQTTブローカーやHTTP APIからのトリガーに応じて、特定の「カスタムショー」をロードし直すことだ。
`SlideShowSettings.SlideShowName` を動的に書き換えることで、再起動なしにコンテンツを差し替えることができる。
アーキテクチャの要点:
1. 監視スレッド/タイマー: `Application.OnTime` を使用し、一定間隔で外部データの変更をポーリング。
2. ホットスワップ: 新しい `CustomSlideShow` を指定し、`SlideShowSettings.Run` を再実行する。
3. エラーハンドリング: 再実行時の競合を避けるため、必ず前述の `ForceKillSlideShow` を挟む。
—
結論:コードに魂を宿らせよ
PowerPoint VBAによる自動化は、単なるマクロ記述ではない。それは、OSの挙動とCOMオブジェクトの挙動を深く理解した上での「舞台演出」である。
- 状態を信じるな: 常に `SlideShowSettings` のプロパティを再確認せよ。
- メモリを信じるな: 終了処理こそが、システムの寿命を決める。
- 環境を信じるな: Windows APIで制御権を奪い返せ。
これらを守れば、あなたのスライドショーは、何日でも、何ヶ月でも止まることなく、雄弁に語り続けるだろう。それが、我々エンジニアが構築すべき「静かなる最高品質」だ。
