こんにちは!PowerPoint VBAの世界へようこそ。
マクロの記録ボタンを押して生成されるコードを眺める段階は、もう卒業しましたか?
「スライドが切り替わった瞬間にログを残したい」
「保存する前に、特定の入力漏れがないかチェックさせたい」
そんな、ワンランク上の自動化を実現したいと思ったときに出会うのが、今回解説する「イベントハンドリング」です。
一見すると難しそうに見えますが、本質を掴めば怖くありません。ここをクリアすれば、あなたのPowerPoint VBAスキルは一気にプロの領域へと踏み出すことになります。一緒に、その扉を開いていきましょう!
—
1. なぜ「イベント」を捕捉するのか?(マクロの記録との違い)
通常のVBAマクロは、「あなたがボタンを押したとき」や「あなたが手動で実行したとき」にしか動きません。いわば、こちらが指示を出さないと動かない「指示待ちの部下」です。
しかし、イベントを使えば話が変わります。
- ユーザーが「保存」ボタンを押した瞬間
- スライドショーが次のページに進んだ瞬間
- 新しいプレゼンテーションが開かれた瞬間
こうしたPowerPoint側の「状態の変化(イベント)」をトリガーにして、プログラム側から自動的に割り込み処理を実行させることができます。これがイベントハンドリングの真骨頂です。
—
2. 魔法のキーワード `WithEvents` とクラスモジュール
PowerPointのアプリケーション全体を見張るためには、通常の標準モジュール(Module1など)だけでは力不足です。ここで登場するのが「クラスモジュール」と、主役である`WithEvents`というキーワードです。
全体の仕組み(イメージ図)
[ PowerPointアプリ ]
│
▼ (イベント発生:保存、スライド切り替えなど)
[ クラスモジュール (WithEventsで監視) ] ──> 自動でコードが割り込む!
│
▼
[ 独自の処理(ログ出力・チェック等) ]
クラスモジュールとは、いわば「自分専用の監視員ロボット」を作るための設計図です。その監視員に`WithEvents`という特殊なメガネをかけさせることで、PowerPointの動きを監視させます。
—
3. 実践!「スライド切り替え」と「保存時」を捕捉するコード
それでは、実際に手を動かして実装してみましょう。
今回は、以下の2つのミッションをクリアするコードを作ります。
1. スライドショー中に次のスライドへ進んだ時に、現在のスライド番号をイミディエイトウィンドウにログ出力する。
2. プレゼンテーションを保存する時に、特定の未入力チェック(今回はダミー)を行い、必要に応じて保存を制御する。
手順1:クラスモジュールを作成する
1. VBAエディタ(Alt + F11)を開きます。
2. メニューの [挿入] > [クラス モジュール] をクリックします。
3. プロパティウィンドウで、このクラスの名前を `EventClass` に変更します。
4. 以下のコードを貼り付けます。
‘ ==========================================
‘ クラスモジュール名: EventClass
‘ ==========================================
Option Explicit
‘ PowerPointのアプリケーションイベントを捕捉するための宣言
Public WithEvents AppEvents As Application
‘ ① スライドショーで次のスライドに進んだ時に発生するイベント
Private Sub AppEvents_SlideShowNextSlide(ByVal Wn As SlideShowWindow)
Dim currentSlide As Long
currentSlide = Wn.View.CurrentSlide
‘ ここに独自の処理(ログ出力など)を書く
Debug.Print “【ログ】現在のスライド番号: ” & currentSlide & ” に切り替わりました。”
End Sub
‘ ② プレゼンテーションが保存される直前に発生するイベント
Private Sub AppEvents_PresentationSave(ByVal Pres As Presentation)
‘ ここで保存前のチェック処理を実行
Debug.Print “【チェック】” & Pres.Name & ” の保存処理を検知しました。”
‘ 例:特定の条件(今回は簡易的にメッセージ表示)
‘ If MsgBox(“本当に上書き保存しますか?”, vbYesNo + vbQuestion) = vbNo Then
‘ ‘ 保存をキャンセルさせたい場合の高度な制御もここで行えます
‘ End If
End Sub
手順2:標準モジュールでイベントを「起動」する
クラスの設計図ができただけでは、監視員は動きません。PowerPoint起動時に、この監視員をスタンバイさせるコードを標準モジュールに記述します。
1. メニューの [挿入] > [標準モジュール] をクリックします。
2. 以下のコードを貼り付けます。
‘ ==========================================
‘ 標準モジュール (Module1など)
‘ ==========================================
Option Explicit
‘ グローバル変数として監視員(クラスのインスタンス)を保持する
Public MyListener As EventClass
‘ PowerPoint起動時(または手動実行時)に監視をスタートさせるマクロ
Sub StartPowerPointEventMonitoring()
‘ すでにインスタンスが存在していなければ生成する
If MyListener Is Nothing Then
Set MyListener = New EventClass
‘ アプリケーションオブジェクトを紐付ける
Set MyListener.AppEvents = Application
MsgBox “PowerPointのイベント監視を開始しました!”, vbInformation, “初期化完了”
Else
MsgBox “すでに監視は稼働中です。”, vbInformation, “通知”
End Sub
End Sub
手順3:動作確認をしてみよう!
1. まず、標準モジュールの `StartPowerPointEventMonitoring` を一度だけ手動で実行(F5キーなど)してください。「監視を開始しました」とメッセージが出ればOKです。
2. その後、スライドショーを実行して次のページに進んでみてください。VBAエディタの「イミディエイトウィンドウ(Ctrl + G)」に、「【ログ】現在のスライド番号:〜」と出力されます!
3. 同様に、適当なタイミングでファイルを上書き保存してみてください。「【チェック】〜の保存処理を検知しました」と出力されます。
—
4. 陥りやすい罠とプロの知見(ここが重要!)
イベントハンドリングを実装した初学者が、必ずと言っていいほどハマる「罠」があります。それは、「気づいたらイベントが反応しなくなっている(コードが消える)」という現象です。
罠の正体:オブジェクトのライフサイクル
先ほど標準モジュールで宣言した `Public MyListener As EventClass` は、VBAの実行環境がリセットされたり、エラーでコードが停止したりすると、メモリ上から消滅してしまいます(これを「変数の初期化・解放」と呼びます)。
監視員(インスタンス)が消えてしまうのですから、当然イベントも捕捉できなくなります。
プロの回避策
- エラーハンドリングを徹底する: クラス内のコードで予期せぬエラー(実行時エラー)が発生して処理が止まると、イベントの紐付けが切れることがあります。`On Error Resume Next` などを適切に使い、監視が途切れないように設計します。
- アドイン(.ppam)化を検討する: 本格的な業務ツールとして運用する場合は、通常の `.pptm` ファイルではなく、PowerPointのアドイン形式として保存し、PowerPoint起動時に自動で `StartPowerPointEventMonitoring` が走る仕組み(Auto_Openなど)を組み合わせるのが、実務における鉄則です。
—
おわりに:ここをクリアすれば、あなたはもう初心者ではない!
お疲れ様でした!今回は `WithEvents` を使ったイベントハンドリングの基本と、クラスモジュールの活用法について解説しました。
「ボタンを押したら動くマクロ」から、「PowerPointの動きに連動して自律的に動くプログラム」へ。このステップを越えたあなたなら、業務効率化のアイデアを形にするための強力な武器を手に入れたも同然です。
ぜひ、自分の業務に合わせて「スライド切り替え時に文字数をカウントする」「保存時に特定のワードが入っていないかチェックする」など、アレンジを加えて遊んでみてくださいね。
それでは、快適なPowerPoint自動化ライフを!
