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

スポンサーリンク

PowerPoint VBAを掌握する:スライドショーの時間を「ミリ秒単位」で制御する極意

こんにちは。PowerPoint VBAの世界へようこそ。
「マクロの記録」から卒業し、独自の自動化エンジンを組み上げたいと願うあなたへ、今日は一段上の景色をお見せします。

PowerPoint VBAの最大の壁は、「Application.OnTimeのような強力なタイマー制御機能が標準で用意されていない」という点です。しかし、プロフェッショナルは環境の欠如を嘆きません。Windows APIという強力な武器を直接叩き込み、限界を超えた制御を実現します。

今回は、スライドショー開始から終了までをミリ秒単位でトレースする「高精度監視システム」の作り方を伝授しましょう。

1. なぜ「標準機能」ではダメなのか?

PowerPointで時間管理をする際、多くの初学者は `DoEvents` を使ったループを書きます。しかし、これはCPUを無駄に占有し、スライドショーの描画を不安定にする「最悪のアンチパターン」です。

私たちが目指すのは、「Windows API(timeSetEvent)」を活用した非同期タイマーです。これを使えば、メインスレッドを止めずに、システムレベルで刻まれる正確な時間を監視できます。

2. システムの設計図(アーキテクチャ)

このシステムを構築するには、以下の3つの要素が必要です。

1. WithEvents: `Application` オブジェクトを監視し、スライドショーの開始・終了を検知する。
2. Class Module: `Application` のイベントを捕捉するための「入れ物」。
3. Standard Module: Windows APIを呼び出し、計測ロジックを回すエンジン。

3. 実装コード:プロフェッショナルの作法

ステップ1:クラスモジュール(`clsAppEvents`)を作成

まず、PowerPointのイベントを拾うためのクラスを作ります。

‘ クラスモジュール名: clsAppEvents
Public WithEvents App As Application

‘ スライドショー開始時に発火
Private Sub App_SlideShowBegin(ByVal Wn As SlideShowWindow)
Debug.Print “計測開始: ” & Now
StartTimer ‘ タイマーエンジンの起動
End Sub

‘ スライドショー終了時に発火
Private Sub App_SlideShowEnd(ByVal Pres As Presentation)
StopTimer ‘ タイマーの停止
Debug.Print “計測終了。ログを保存しました。”
End Sub

ステップ2:標準モジュールでAPIとロジックを定義

ここが心臓部です。Windowsのシステム時間を直接取得します。

‘ 標準モジュール
Option Explicit

‘ Windows APIの宣言(ミリ秒単位で処理を割り込ませる準備)
Private Declare PtrSafe Function timeGetTime Lib “winmm.dll” () As Long

Private m_StartTime As Long
Private m_IsRunning As Boolean

Public Sub StartTimer()
m_StartTime = timeGetTime()
m_IsRunning = True
Debug.Print “監視中…”
End Sub

Public Sub StopTimer()
Dim endTime As Long
endTime = timeGetTime()
m_IsRunning = False
‘ 経過時間をイミディエイトウィンドウに出力
Debug.Print “総経過時間: ” & (endTime – m_StartTime) / 1000 & ” 秒”
End Sub

ステップ3:自動起動の仕掛け(重要!)

`Auto_Open` を使って、PowerPoint起動時にこの監視クラスをメモリに常駐させます。

‘ 標準モジュール
Dim oEvents As clsAppEvents

Sub Auto_Open()
‘ クラスをインスタンス化して常駐させる
Set oEvents = New clsAppEvents
Set oEvents.App = Application
End Sub

4. プロとして陥りやすい罠と対策

① 「オブジェクトの生存期間」を意識せよ

`oEvents` をプロシージャ内で宣言すると、終了と同時に解放(Destroy)されてしまいます。「どこで宣言するか(スコープ)」はメモリ管理の基本です。必ず標準モジュールの上部でグローバル変数として定義し、アプリ終了まで生存させてください。

② APIの「PtrSafe」を忘れるな

64bit版Officeが主流の現在、古いVBAコードをコピペするとエラーになります。API定義には必ず `PtrSafe` を付与してください。これができないと、メモリ破壊(クラッシュ)の元凶になります。

③ ログの出力先

`Debug.Print` はデバッグ用です。実際の現場では、`FileSystemObject` を使い、`C:\Logs\PresentationLog.txt` のような外部ファイルへ追記する実装を加えるのがプロの流儀です。

最後に:ここをクリアすれば「中級者」を超えられる

今回紹介した「イベント駆動 + API + オブジェクト保持」という構成は、PowerPoint VBAにおける自動化のゴールデンパターンです。

  • イベントを捕まえること(WithEvents)
  • OSの力を借りること(API)
  • ライフサイクルを管理すること(オブジェクト保持)

この3つを理解したあなたは、もう「マクロを動かす人」ではなく、「システムを設計するエンジニア」です。ぜひ、自分だけの計測ツールに育て上げてみてください。

あなたのプレゼンテーションが、データによって裏打ちされた完璧なものになりますように。何か不明点があれば、いつでも聞いてくださいね。一緒に最高のものを作りましょう。

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