【入門編】【プロフェッショナル】WithEventsとPresentationオブジェクトのイベントを組み合わせた、スライドショー実行中の「ミリ秒単位」経過時間監視タイマー – PowerPoint VBA解析バイブル

スポンサーリンク

【プロフェッショナル】PowerPoint VBAで「ミリ秒」を支配する。イベント駆動型タイマー構築術

こんにちは。PowerPointの自動化という深淵な世界へようこそ。

多くのユーザーが「マクロの記録」で満足する中、君がここに辿り着いたということは、PowerPointの「標準機能の限界」に気づき、それを自らの手で突破したいと強く願っているからだろう。

今回は、プレゼンテーション中に「ミリ秒単位」で時間を監視し、特定のタイミングで魔法のような挙動を起こすための『イベント駆動型常駐監視システム』を構築する。これをマスターすれば、ただの資料作成ツールだったPowerPointが、高度なインタラクティブ・アプリケーションへと変貌する。

1. なぜ「WithEvents」なのか?

通常のVBAコードは、ボタンを押した時やマクロを実行した時にしか動きません。しかし、プロの世界では「プレゼンが始まった瞬間」「スライドが切り替わったその瞬間」に、システムが自律的に動き出す必要があります。

ここで登場するのが`WithEvents`です。これは、PowerPointが発する「イベント(合図)」を、君が書いたコードで「盗み聞き(トラップ)」するための強力な武器です。

必要なオブジェクトの役割

  • Applicationオブジェクト: PowerPointアプリ全体を監視する親玉。
  • Presentationオブジェクト: プレゼンファイルそのもの。
  • Class Module(クラスモジュール): イベントを待ち受けるための「専用の受け皿」。

2. 構築の手順:魂を込めた設計

このシステムは「クラスモジュール」と「標準モジュール」の二段構えで構成します。

ステップ1:クラスモジュールの作成

VBAエディタで「クラスモジュール」を挿入し、名前を `EventMonitor` に変更してください。ここにPowerPointのイベントを監視する「耳」を作ります。

‘ クラスモジュール: EventMonitor
Option Explicit

‘ PowerPointの全イベントを監視する宣言
Public WithEvents AppEvent As Application

‘ スライドショーが始まった瞬間に発火するイベント
Private Sub AppEvent_SlideShowBegin(ByVal Wn As SlideShowWindow)
Debug.Print “プレゼン開始!監視システムを起動します。”
‘ ここにタイマー開始のロジックを注入する
End Sub

‘ スライドが切り替わった瞬間に発火するイベント
Private Sub AppEvent_SlideShowNextSlide(ByVal Wn As SlideShowWindow)
Debug.Print “スライド移動検知。ミリ秒単位の計測を開始…”
End Sub

ステップ2:監視システムの起動(標準モジュール)

クラスは定義しただけでは動きません。インスタンス化(実体化)してメモリに常駐させる必要があります。

‘ 標準モジュール: MainModule
Option Explicit

‘ クラスモジュールを格納するグローバル変数
Public Monitor As EventMonitor

Public Sub StartMonitoring()
‘ クラスをインスタンス化して監視を開始
Set Monitor = New EventMonitor
Set Monitor.AppEvent = Application
MsgBox “監視システムがアクティブになりました。”
End Sub

3. ミリ秒を制御する「API」という禁じ手

PowerPoint標準の `Timer` 関数では精度が足りません。ミリ秒単位で厳密に制御するには、Windowsのカーネル(OSの心臓部)を直接叩く「API」を利用します。

クラスモジュールの先頭に以下を追加してください。

‘ Windows APIの呼び出し(高精度タイマー)
If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
Private Declare PtrSafe Function GetTickCount Lib “kernel32” () As Long
Else
Private Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
Private Declare Function GetTickCount Lib “kernel32” () As Long
End If

これで `GetTickCount` を使えば、OS起動時からのミリ秒単位の経過時間を取得できます。スライド開始時の時間を変数に保存し、現在時刻との差分を計算すれば、「あと何ミリ秒で強制終了するか」といった精密な制御が可能になるのです。

4. プロが教える「陥りやすい罠」

この仕組みを組む際、初心者が必ずと言っていいほどハマるポイントがあります。

1. オブジェクトの解放: 変数 `Monitor` が途中で消滅すると、監視も止まります。クラスのインスタンスは必ず「グローバル変数(どこからでも参照できる変数)」として保持してください。
2. 無限ループの恐怖: スライドショー中に重い処理を走らせると、PowerPointが「応答なし」になります。必ず `DoEvents` を挟み、OSに処理権限を譲り渡すことを忘れないでください。
3. イベントの連鎖: イベントプロシージャ内で「スライドを次へ送る」等の操作をすると、再び `SlideShowNextSlide` が走り、無限ループに陥ります。`Application.EnableEvents = False` を駆使して、一時的にイベントを無効化する防御策が必要です。

最後に:君へのメッセージ

「ミリ秒単位の監視」など、表向きの資料作成業務では不要かもしれません。しかし、「標準機能でできないことを、技術でねじ伏せる」というこのプロセスこそが、エンジニアとしての価値を何倍にも高めてくれます。

このコードをただコピペするだけでなく、「なぜここでインスタンス化が必要なのか?」「なぜAPIを使うのか?」という背景を噛み締めてください。

ここをクリアした君なら、もう「マクロの記録」に頼るだけのユーザーではありません。次は、プレゼンテーションをリアルタイムに操作する「制御システム」そのものを作ってみましょう。

君のエンジニアリングライフが、より創造的で刺激的なものになることを応援しています。質問があれば、いつでもここに書き込んでくださいね。

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