【テクニカル・上級編】スライドショーの自動運転をVBAで制御:”SlideShowSettings”によるループ再生、キオスクモード、特定スライド範囲の指定 – PowerPoint VBA解析バイブル

スポンサーリンク

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で制御権を奪い返せ。

これらを守れば、あなたのスライドショーは、何日でも、何ヶ月でも止まることなく、雄弁に語り続けるだろう。それが、我々エンジニアが構築すべき「静かなる最高品質」だ。

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