【入門編】【プロフェッショナル】Application.WindowSelectionChangeイベントによるリアルタイム校正:選択された「TextRange」の文字数や禁則処理を監視しステータスバーで警告する編集アシスタント – PowerPoint VBA解析バイブル

スポンサーリンク

こんにちは!PowerPoint VBAの世界へようこそ。
マクロの記録ボタンを押して「動いたはいいけれど、中身がさっぱり分からない……」そんな時期を通り越し、そろそろ自分の手で本格的な自動化ツールや、気の利いたアドインを作ってみたいと思っていませんか?

今回は、PowerPoint VBAの真骨頂とも言える「イベント駆動プログラミング」を使って、プロ顔負けのリアルタイム編集アシスタントを作ってみましょう。

テーマは「Application.WindowSelectionChangeイベントによるリアルタイム校正」です。
ユーザーがテキストを選んだり入力したりする動きをVBAが裏で監視し、文字数オーバーや「使ってはいけないNGワード」を見つけたら、画面一番下のステータスバーに即座に警告を出すシステムを構築します。

ここをクリアすれば、単なる「手順の自動再生」ではない、「生きたアプリケーションの拡張」の扉が開きます。さあ、一緒に深淵の世界へ足を踏み入れましょう!

1. なぜ「イベント」なのか?:マクロの記録の先にある世界

通常のVBAマクロは、あなたがボタンを押したときや、プログラムを実行したときにしか動きません。いわば「呼ばないと来ない職人」です。

しかし、イベント(Event)とは、PowerPoint側で何か特定のことが起きたとき(スライドを切り替えた、図形を選択した、文字を入力したなど)に、PowerPointが勝手にあなたの書いたコードを呼び出してくれる仕組みです。

今回使う `Application.WindowSelectionChange` は、「ユーザーがマウスやキーボードで何かを選択し直した瞬間」に発火します。これを利用すれば、ユーザーがテキストボックスの中身をイジっている状態を、まるで背後から見守るように監視できるのです。

2. 実装の全体像とアーキテクチャ

PowerPointのイベントを捕捉するためには、通常の標準モジュール(Module1など)だけでは足りません。少しだけ特別な仕掛けが必要です。

必要なパーツは以下の2つです。

1. クラスモジュール(Class Module): イベントを受け取る「専用のリスナー(耳を澄ませる人)」を作ります。ここでは名前を `CEventClass` としましょう。
2. 標準モジュール(Standard Module): クラスを起動し、PowerPointのApplicationに「このリスナーをセットして!」と登録するスイッチ役です。

「クラス?難しそう……」と思いましたか? 大丈夫です。コピペから始めて、少しずつ構造を紐解いていけば、すぐに「なるほど!」と腑に落ちる瞬間がやってきます。

3. 実際のコードを書いてみよう

それでは、実際に手を動かして実装していきましょう。

ステップ1:イベントを受け取る「クラスモジュール」の作成

VBAのVBE画面(Alt + F11)を開き、メニューの [挿入] > [クラス モジュール] をクリックしてください。
プロパティウィンドウで、このモジュールの名前を `CEventClass` に変更します。

そこに、以下のコードを貼り付けます。

‘ =================================================================
‘ クラスモジュール名: CEventClass
‘ 役割: PowerPointのイベントをフックし、選択されたテキストを監視する
‘ =================================================================

‘ WithEventsキーワードを使い、PowerPointのアプリケーションイベントを監視できるようにします
Public WithEvents AppEvent As PowerPoint.Application

‘ ユーザーが選択範囲を変更したときに自動で呼び出されるイベントプロシージャ
Private Sub AppEvent_WindowSelectionChange(ByVal Sel As PowerPoint.Selection)
On Error Resume Next ‘ エラーで止まらないようにする防衛策

‘ 選択されているのが「テキスト」であるかチェック
If Sel.Type = ppSelectionText Then
Dim txtRange As PowerPoint.TextRange
Set txtRange = Sel.TextRange

‘ 1. 文字数制限のチェック(例: 50文字以内)
Dim maxLimit As Long
maxLimit = 50

If Len(txtRange.Text) > maxLimit Then
‘ ステータスバーに赤信号の警告を表示!
Application.StatusBar = “【警告】文字数が制限(” & maxLimit & “文字)を超えています! 現在: ” & Len(txtRange.Text) & “文字”
Exit Sub
End If

‘ 2. NGワードのチェック(例: 「絶対」「必ず」などの強い断定表現をNGとする場合)
Dim ngWord As String
ngWord = “絶対”

If InStr(txtRange.Text, ngWord) > 0 Then
Application.StatusBar = “【警告】不適切な表現「” & ngWord & “」が含まれています!”
Exit Sub
End If

‘ 問題なければステータスバーをクリア、または現在の文字数を優しく表示
Application.StatusBar = “選択中の文字数: ” & Len(txtRange.Text) & “文字 (正常)”
Else
‘ テキスト以外が選択されている場合はステータスバーをクリア
Application.StatusBar = “”
End If

On Error GoTo 0
End Sub

ステップ2:イベントを起動する「標準モジュール」の作成

次に、メニューの [挿入] > [標準モジュール] をクリックし、`Module1` を作成します。
ここには、イベント監視を「ON」にするためのマクロを記述します。

‘ =================================================================
‘ 標準モジュール: Module1
‘ 役割: イベント監視クラスのインスタンスを生成し、有効化する
‘ =================================================================

‘ アプリケーション全体でイベントクラスを生かし続けるためのグローバル変数
Public Monitor As CEventClass

Sub StartRealtimeChecker()
‘ すでに起動していれば二重起動を防ぐ
If Monitor Is Nothing Then
Set Monitor = New CEventClass
‘ PowerPointのApplicationをクラスに紐付ける
Set Monitor.AppEvent = Application
MsgBox “リアルタイム校正アシスタントを起動しました!”, vbInformation, “監視開始”
Else
MsgBox “すでに監視システムは稼働中です。”, vbInformation, “通知”
End If
End Sub

Sub StopRealtimeChecker()
‘ 監視を終了し、メモリを解放する
Set Monitor = Nothing
Application.StatusBar = “”
MsgBox “リアルタイム校正アシスタントを停止しました。”, vbInformation, “監視終了”
End Sub

4. 実際に動かしてみよう!

1. 標準モジュールにある `StartRealtimeChecker` マクロを実行します(F5キーなど)。「起動しました!」というメッセージが出れば成功です。
2. スライドに適当なテキストボックスを作り、文字をたくさん入力してみてください。
3. 文字数が 50文字 を超えた瞬間、あるいは「絶対」という言葉を入れた瞬間に、PowerPointの一番下のステータスバーに赤字の警告がリアルタイムで表示されます!

どうですか?まるで専用の編集ソフトのような挙動が、VBAのわずかこれだけのコードで実現できてしまいました。

5. 現場で陥りやすい罠とプロの知見(Hacks)

このレベルのプログラムを組むようになると、いくつかの「VBA特有の罠」にぶつかります。プロのエンジニアとして、知っておくべき重要事項を伝授しておきます。

罠1:コードを修正したらイベントが動かなくなった?

クラスモジュールを使ったイベント監視中に、VBAのコードを書き直したり、エラーでプログラムが強制終了したりすると、`Monitor` 変数の紐付け(インスタンス)がプツリと切れてしまいます。
対策: そんなときは慌てず騒がず、もう一度 `StartRealtimeChecker` マクロを手動で実行し直せば復活します。

罠2:パフォーマンスと無限ループへの恐怖

`WindowSelectionChange` は、ユーザーがマウスをカチカチ動かすたびに高頻度で呼び出されます。ここに重い処理(例えば、スライド全体をループして図形を検索するような処理)を書いてしまうと、PowerPoint全体がカクカクになり、最悪の場合はフリーズします。
対策: 今回のコードのように、`If Sel.Type = ppSelectionText Then` で文字選択時だけに処理を限定し、さらに処理を極限まで軽量に保つことが、プログラマの優しさであり腕の見せどころです。

おわりに:ここをクリアすれば、PowerPoint VBAは怖くない

今回は、`Application.WindowSelectionChange` イベントを用いたリアルタイム校正アシスタントを通して、イベント駆動型プログラミングのエッセンスをお伝えしました。

「マクロの記録」の枠を超え、PowerPointという巨大なアプリケーションの鼓動(イベント)に合わせて自分のコードを動かす――。この感覚が掴めれば、あなたのVBAスキルは初心者レベルを完全に脱却し、プロフェッショナルの領域に足を踏み入れています。

業務効率化の枠を超えた、あなただけの「スマートなプレゼン支援ツール」をぜひ日々の業務や開発に応用してみてください。それでは、次回の高度な知見でお会いしましょう!

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