【入門編】【上級者向け】Visioのページイベントを監視し、ページ追加時に自動で標準テンプレートを適用するイベントハンドラ – Visio VBA解析バイブル

スポンサーリンク

こんにちは!Visio VBAの自動化の世界へようこそ。
マクロの記録ボタンを押して図形をポチポチ動かすだけのステージから、一歩先へ進みたいあなたへ。

今回は、Visio VBAの真骨頂である「イベント駆動型プログラミング(Classモジュール)」を使いこなす、ちょっとアツいテーマをお届けします。

テーマはずばり、「ユーザーが新しいページを追加した瞬間を捕捉し、一瞬で自社専用の標準テンプレート(レイヤー・グリッド設定)を強制適用するイベントハンドラ」の構築です。

「新しいページを追加するたびに、毎回グリッド線を調整して、レイヤーを作り直して……」なんて、エンジニアのすることじゃありません。Visioに仕事をさせましょう。ここをクリアすれば、あなたのVisio自動化スキルは間違いなく一段階上のステージに到達します。一緒にマスターしていきましょう!

—

なぜ「ページ追加イベント」の自動化が必要なのか?

Visioでドキュメントを作成するとき、複数ページにわたる設計図やフローチャートを描くことはよくありますよね。その際、ページごとにレイヤー構成がバラバラだったり、グリッドの設定が初期値のままだったりすると、ドキュメント全体の一貫性が失われてしまいます。

しかし、人間は忘れる生き物です。「新しいページを追加したら、あれを設定して、これを作って…」というルーティンワークは、必ずヒューマンエラーを生みます。

これを解決するのが、「Visioのイベント監視」です。Visioアプリ側で「ページが追加されたな」というイベント(シグナル)を常時監視させ、検知した瞬間にVBA側で自動的に所定の設定を流し込む。この仕組みを作れば、ユーザーは意識することなく、常に完璧に統制されたフォーマットで作業を始めることができます。

—

3つのステップで実装するイベント駆動型VBA

Visioでイベントを捕捉するためには、通常の標準モジュール(`Module1`など)だけでなく、「クラスモジュール」という特殊なパーツを使用します。

全体の流れは以下の3ステップです。

1. クラスモジュールの作成(Visioのイベントをキャッチする専用の「耳」を作る)
2. 初期化コードの記述(「どのドキュメントを監視するか」をクラスに教える)
3. イベントプロシージャの実装(ページが追加されたときに実行する処理を書く)

それでは、実際にコードを書いていきましょう!

—

ステップ1:イベントを監視するクラスモジュールを作る

まずは、VBAのプロジェクトウィンドウで `[挿入]` > `[クラス モジュール]` を選択します。
新しくできたクラスモジュールのプロパティウィンドウで、名前を `clsPageEvents` に変更してください。

ここに、Visioのイベントをフックするためのコードを記述します。

‘ =================================================================
‘ クラスモジュール名: clsPageEvents
‘ 役割: Visioのアプリケーションイベント(特にページ追加)を監視する
‘ =================================================================

‘ WithEventsキーワードを使い、VisioのApplicationオブジェクトのイベントを受け取れるようにします
Public WithEvents VisApp As Visio.Application

‘ ページが新しく追加された瞬間に走るイベントプロシージャ
Private Sub VisApp_PageAdded(ByVal Page As IVPage)
‘ エラーハンドリングの準備
On Error GoTo ErrorHandler

‘ 画面描画を一旦停止して処理を高速化(画面のチラつきを防ぐプロの技)
Application.ScreenUpdating = False

‘ ————————————————————-
‘ ここに「新ページ追加時に自動で行いたい処理」を記述します
‘ ————————————————————-

‘ 1. ページ名にプレフィックスや標準ルールを適用(例: “Config_” + ページ名)
‘ Page.Name = “Auto_” & Page.Name

‘ 2. 特定の標準レイヤーを強制作成する
Dim targetLayer As Visio.Layer
Set targetLayer = Page.AddLayer(“01_システム領域”)

‘ レイヤーの色を設定(例:青色)
targetLayer.CellsC(Visio.visLayerColor).FormulaU = “RGB(0, 120, 215)”

‘ 3. ページ設定の調整(例:グリッドを表示モードにする、など)
‘ ※必要に応じてPage.PageSheetのセルを操作します

‘ 処理終了
Application.ScreenUpdating = True

‘ ユーザーにこっそり通知(不要ならコメントアウトしてください)
Debug.Print “新ページ [” & Page.Name & “] に標準テンプレートを適用しました。”
Exit Sub

ErrorHandler:
Application.ScreenUpdating = True
MsgBox “ページイベントの処理中にエラーが発生しました: ” & Err.Description, vbCritical
End Sub

💡 ここがエンジニアの知見ポイント:`ScreenUpdating`

`Application.ScreenUpdating = False` を挟むことで、Visioがレイヤー作成などの内部処理を行っている間の画面再描画を抑止し、動作を劇的に高速化させます。ユーザーに無駄なチラつきを見せないのも、優秀なエンジニアの気配りです。

—

ステップ2:イベント監視を起動するトリガーを作る

クラスを作っただけでは、Visioは「どのアプリを監視すればいいのか」分かりません。監視をスタートさせるための「スイッチ」を標準モジュールに用意します。

標準モジュール(`Module1` など)を挿入し、以下のコードを記述します。

‘ =================================================================
‘ 標準モジュール: 監視の有効化/無効化を管理する
‘ =================================================================

‘ クラスのインスタンスを保持するためのグローバル変数
‘ (プロシージャ終了後も破棄されないよう、Publicまたはモジュールレベル変数にするのがミソ)
Public EventWatcher As clsPageEvents

Sub StartPageEventMonitoring()
‘ すでに監視中であれば二重起動を防ぐ
If Not EventWatcher Is Nothing Then
MsgBox “すでにページイベントの監視は有効です。”, vbInformation
Exit Sub
End Sub

‘ クラスのインスタンスを生成
Set EventWatcher = New clsPageEvents

‘ 現在のVisioアプリケーションを監視対象として紐付ける
Set EventWatcher.VisApp = Visio.Application

MsgBox “Visioのページ追加イベント監視を開始しました!” & vbCrLf & _
“新しくページを追加してみてください。”, vbInformation
End Sub

Sub StopPageEventMonitoring()
‘ 監視を終了(インスタンスを解放)
Set EventWatcher = Nothing
MsgBox “ページイベントの監視を停止しました。”, vbInformation
End Sub

—

ステップ3:動作テストをしてみよう!

1. まず、標準モジュールの `StartPageEventMonitoring` を実行(F5キーなど)して、監視をスタートさせます。
2. その後、Visioの下部にある「+」ボタン(ページの追加)を押して、新しいページを追加してみてください。
3. イミディエーションウィンドウ(Ctrl + G で表示)に、「新ページ […] に標準テンプレートを適用しました。」と表示されれば大成功です!
4. 追加されたページの「ホーム」タブ > 「レイヤー」ダイアログ等を確認してみてください。自動で「01_システム領域」というレイヤーが追加されているはずです。

—

陥りやすいエラーと、プロとしての回避策

イベント駆動型VBAを実装する際、初学者が必ずといっていいほどハマる「罠」があります。

⚠️ 罠:「コードを実行したのに、ページを追加しても何も起きない…」

原因:
標準モジュール内で宣言した `EventWatcher` 変数が、プロシージャの終了とともにメモリから消去されてしまった(スコープの消滅)ことが原因です。変数に `Dim` を使っていたり、通常のローカル変数にしていると、マクロが終わった瞬間に監視の「耳」が消えてしまいます。

解決策:
上記コードのように、変数をモジュールレベル(または `Public`)として宣言し、インスタンスを生存させ続ける必要があります。

—

おわりに

お疲れ様でした!今回は、Classモジュールを使ったVisioの高度なイベント監視と、ページ設定の自動化について解説しました。

「マクロの記録」を卒業し、イベントドリブンなプログラムが組めるようになると、Visioは単なるお絵描きツールから、「業務を最適化する強力なアプリケーションプラットフォーム」へと生まれ変わります。

ここをクリアしたあなたなら、図形が配置されたときのイベント(`ShapeAdded`)など、他のイベントへの応用も余裕でできるはずです。ぜひ、日々の業務効率化に役立ててくださいね。

それでは、また次のテクニカルセッションでお会いしましょう!バッチリ使いこなしてください!

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