Visioの「心臓」を掴む:DocumentEventとApplicationEventで図面を自動監視せよ
こんにちは。自動化の現場でVisioと格闘し続けてきた諸君。
「マクロの記録」ボタンを押して生成されたコードを眺めて満足する段階は、もう卒業しよう。
Visioというソフトウェアは、ただの「お絵かきツール」ではない。それは膨大なオブジェクトの集合体であり、常にイベント(出来事)を発生させ続けている生きたシステムだ。
今回は、その「イベント」をフックし、ユーザーが図面を触った瞬間に自動で処理を実行する「常駐型監視システム」の設計術を授ける。これをマスターすれば、君はVisioの操作をただの作業から、システムによる制御へと昇華させることができる。
—
1. なぜ「イベント」を監視するのか?
通常のマクロは「ボタンを押して実行」するものだ。しかし、これではユーザーが操作を忘れたり、誤った手順で保存したりするリスクが残る。
イベント監視(ApplicationEvent/DocumentEvent)を実装すると、以下のようなことが可能になる。
- 「保存」ボタンが押された瞬間、自動でメタデータを書き込む。
- 図形が追加された瞬間、自動的にルールに従って配置を修正する。
- ドキュメントが開かれた瞬間、必要なテンプレートや接続を検証する。
「ユーザーが何をしたか」ではなく、「Visioの中で何が起きたか」をトリガーにする。これが自動化の最前線だ。
—
2. 実装の要:クラスモジュールという「見張り番」
Visioでイベントを捉えるには、標準モジュールではなく「クラスモジュール」が必要だ。クラスモジュールは、特定のオブジェクトの振る舞いを監視する「特注のリスナー」のようなものだと考えてほしい。
手順:監視システムを構築する
ステップ1:クラスモジュールの作成
VBE(VBAエディタ)で「挿入」→「クラスモジュール」を選択。名前を`clsAppEvent`に変更する。
‘ — clsAppEvent クラスモジュール —
‘ Visioのアプリケーションイベントを受け取るための宣言
Public WithEvents vsoApp As Visio.Application
‘ 図形が追加された瞬間に発火するイベント
Private Sub vsoApp_ShapeAdded(ByVal Shape As IVShape)
Debug.Print “検知!新しい図形が追加されました: ” & Shape.Name
‘ ここに自動処理(例:レイヤーの自動付与など)を記述する
End Sub
‘ ドキュメントが保存される直前に発火するイベント
Private Sub vsoApp_DocumentSaved(ByVal doc As IVDocument)
MsgBox “ドキュメントが保存されました。整合性をチェックします。”
End Sub
ステップ2:監視を「起動」させる
クラスを作っただけでは動かない。Visioの起動時にこのクラスを「実体化(インスタンス化)」する必要がある。標準モジュールに以下のコードを書こう。
‘ — 標準モジュール —
Dim myMonitor As clsAppEvent
Public Sub StartMonitoring()
‘ 監視役のインスタンスを作成
Set myMonitor = New clsAppEvent
‘ Visio本体を監視対象に設定
Set myMonitor.vsoApp = Application
MsgBox “監視システムが起動しました。”
End Sub
—
3. 陥りやすい「罠」:オブジェクトの生存期間
ここが初学者が必ず躓くポイントだ。「監視を始めたはずなのに、いつの間にか動かなくなる」という現象。
原因は変数のスコープにある。`StartMonitoring`の中で宣言した`myMonitor`変数は、プロシージャが終わると同時にメモリから解放(破棄)されることが多い。すると、Visioとの接続が切れ、イベントが飛ばなくなってしまう。
解決策:モジュールレベル変数か、永続的な保持
イベント監視を常駐させるには、変数を標準モジュールの「一番上(宣言セクション)」に配置すること。そうすれば、Visioを閉じない限り変数は生き残り、見張り番として機能し続ける。
—
4. プロの流儀:エラーハンドリングとパフォーマンス
イベント監視は強力だが、「重い処理」をイベントの中に書くのは厳禁だ。
例えば、`ShapeAdded`の中で複雑なループ処理を行うと、図形を配置するたびにVisioがフリーズする。
- 鉄則1:イベント内は最小限に。
複雑なロジックは別のプロシージャに切り出し、イベント内では呼び出すだけにする。
- 鉄則2:予期せぬエラーで監視を止めない。
クラスモジュール内で`On Error Resume Next`を多用するのは危険だが、イベントの連鎖でアプリが落ちないよう、最低限の例外処理は必須だ。
Private Sub vsoApp_ShapeAdded(ByVal Shape As IVShape)
On Error GoTo ErrorHandler
‘ 複雑な処理は別プロシージャへ
Call MyAutoProcess(Shape)
Exit Sub
ErrorHandler:
Debug.Print “エラー発生: ” & Err.Description
End Sub
—
最後に:君のコードを「システム」へ
Visio VBAの真髄は、「手作業をマクロで代替する」ことではなく、「手作業が介在しない環境を作る」ことにある。
今日紹介したイベント監視は、そのための強力な武器だ。まずは`ShapeAdded`で「図形が増えたらメッセージを出す」という小さな一歩から始めてみてほしい。それができたら、君はもう単なるVBAユーザーではなく、設計者(アーキテクト)の視点に立っているはずだ。
次は、`DocumentEvent`を使って、ドキュメントごとの固有設定を管理する方法を深掘りしていこう。準備はいいか?自動化の旅は、ここからが本番だ。
