プロフェッショナルな現場において、「アドインの配布」は最大の障壁です。IT部門のセキュリティポリシー、ユーザーのインストールリテラシー……これらを突破するのは至難の業ですよね。
そこで今回は、「マクロ有効プレゼンテーション(.pptm)を開くだけで、システム全体のイベント監視を自動起動させる」という、堅牢かつエレガントな設計手法を伝授します。
これは、PowerPointの「アプリケーションイベント」という、少しだけ奥深い領域に足を踏み入れる技術です。準備はいいですか? 一緒に紐解いていきましょう。
—
なぜ「アドイン」なしでイベント監視ができるのか?
通常、PowerPointのイベント(スライド切り替えや保存など)を監視するには、アドイン(.ppam)で`Application`オブジェクトを監視するのが定石です。
しかし、私たちは「特定のファイルを開いた時だけ監視を開始する」という自己完結型の仕組みを作ります。その鍵を握るのが、「クラスモジュール」です。
必要な構成要素
1. クラスモジュール(`clsAppEvent`): アプリケーションイベントを定義・受診する窓口。
2. 標準モジュール(`modMain`): イベント監視の「スイッチ」を入れる司令塔。
—
ステップ1:イベントを受け取る窓口(クラスモジュール)を作る
まず、VBAエディタで「挿入」→「クラスモジュール」を選択し、名前を `clsAppEvent` に変更してください。ここにPowerPoint全体の動きを見張る「監視員」を配置します。
‘ クラスモジュール: clsAppEvent
‘ PowerPointのイベントを受け取るための「窓口」を作成します
Public WithEvents App As Application
‘ スライドが切り替わった瞬間に発火するイベント
Private Sub App_SlideShowNextSlide(ByVal Wn As SlideShowWindow)
Debug.Print “次のスライドへ移動しました: ” & Wn.View.Slide.SlideIndex
End Sub
‘ プレゼンテーションが保存される直前に発火するイベント
Private Sub App_PresentationBeforeSave(ByVal Pres As Presentation, Cancel As Boolean)
MsgBox “保存前にチェックを行います!”, vbInformation
End Sub
ここが重要!: `Public WithEvents App As Application` と宣言することで、PowerPointのApplicationオブジェクトが持つイベントが、このクラスで扱えるようになります。
—
ステップ2:監視を開始する司令塔(標準モジュール)を作る
次に、標準モジュールを作成し、監視を開始するための「スイッチ」を書きます。
‘ 標準モジュール: modMain
Dim myAppEvent As clsAppEvent ‘ クラスのインスタンスを保持するための変数
‘ 監視をスタートさせるプロシージャ
Public Sub StartMonitoring()
If myAppEvent Is Nothing Then
Set myAppEvent = New clsAppEvent
Set myAppEvent.App = Application
Debug.Print “監視を開始しました。”
End If
End Sub
—
ステップ3:自動起動の魔法「Auto_Open」
ユーザーに「マクロの実行ボタンを押してください」なんて言わせたくありませんよね。PowerPointには `Auto_Open` という魔法があります。ファイルが開かれた瞬間に自動実行される特殊なプロシージャです。
‘ 標準モジュール: modMain に追記
Sub Auto_Open()
‘ ファイルが開かれた瞬間に監視を自動起動する
Call StartMonitoring
End Sub
—
陥りやすい罠と「プロの知見」
1. 変数の寿命(スコープ)
`myAppEvent` をプロシージャ内で宣言してはいけません。プロシージャが終わると同時に変数は消滅し、監視も終了してしまいます。必ず標準モジュールの冒頭(宣言セクション)でモジュールレベル変数として宣言してください。
2. 「なぜか動かなくなる」時の対処法
VBAのコードでエラーが発生して強制終了すると、変数(`myAppEvent`)の中身が空(Nothing)になり、イベント監視が停止します。
現場では、以下のように「監視が生きているか確認する関数」を組み込むのがプロの流儀です。
Public Sub EnsureMonitoring()
If myAppEvent Is Nothing Then StartMonitoring
End Sub
—
まとめ:ここをクリアすれば、あなたはもう脱・初心者です
今回学んだのは、以下の3つのステップです。
1. `WithEvents`: イベントを捕捉するためのクラスを作成する。
2. モジュールレベル変数: インスタンスを「生かし続ける」ための場所を確保する。
3. `Auto_Open`: ユーザーの手を借りずに自動で初期化する。
このアーキテクチャを理解すれば、スライドの自動保存制御、操作ログの記録、あるいは特定条件での警告表示など、PowerPointを「ただのスライド作成ソフト」から「業務自動化プラットフォーム」へと進化させることができます。
「コードを書いて終わり」ではなく、「いかにユーザーの手を煩わせず、かつ安定して動かし続けるか」。これこそが、業務自動化エンジニアの誇りです。ぜひ、あなたのプレゼンテーションファイルで試してみてください!
