Visio VBAの「環境依存」を打破せよ:テンプレートを識別し、動的に挙動を変える設計術
こんにちは。現場で「動くもの」を作るだけではなく、「長く生き残るシステム」を設計するエンジニアとして、今日はVisio VBAの深淵に少しだけ足を踏み入れてみましょう。
マクロの記録ボタンを押して生成されるコードは、いわば「その場限りの使い捨て」です。しかし、私たちが目指すのは、「どのテンプレートから作成されたドキュメントでも、文脈を読み取って賢く動くツール」です。
今日は、Visio開発において最も重要な「テンプレート依存コードの抽象化」というテーマを攻略します。ここを理解すれば、あなたはもう「マクロの記録」を卒業したエンジニアの入り口に立っています。
—
1. なぜ「テンプレートの判定」が必要なのか?
例えば、「ネットワーク図」を作るときと「フローチャート」を作るときでは、シェイプの役割やルールが違いますよね。
もし、あなたが作ったマクロが「どの図面でも同じ動きしかしない」としたら、それは非常に脆いツールです。
- 「このボタンを押すと、ネットワーク図用の接続設定を反映してほしい」
- 「でも、フローチャートで同じボタンを押したら、別のレイアウト処理をしてほしい」
これを実現するために、「今、自分はどのテンプレートから生まれたのか?」をドキュメント自身に問いかける必要があります。
—
2. 核心に迫る:Document.Templateプロパティの罠と真実
Visio VBAで最も直感的に「テンプレートを知りたい」と思うと、`Document.Template` プロパティを探したくなるでしょう。しかし、ここに一つ、伝説的なエンジニアだけが知る「教訓」があります。
「`Document.Template` は、常に正しいパスを返すとは限らない」
ドキュメントが保存されると、その履歴が消えたり、環境によってパスの表記が揺れたりすることがあります。そこで私たちは、「テンプレートのファイル名」と「プロパティ」を組み合わせて、多重的に判定する堅牢なロジックを組みます。
実践:テンプレート判定用ユーティリティ関数
以下は、現在のアクティブドキュメントがどのテンプレート由来かを判定し、処理を分岐させるための「背骨」となるコードです。
‘ @brief 現在のドキュメントのテンプレート名を判定し、処理を分岐させるための基盤関数
‘ @return String: 判定したテンプレートの識別子
Function GetCurrentTemplateType() As String
Dim doc As Visio.Document
Set doc = ActiveDocument
‘ Document.Template は、作成元が不明な場合や保存後には空になることがある
‘ そのため、ファイル名(Name)やドキュメントプロパティを併用する
Dim templateName As String
templateName = LCase(doc.Template)
‘ 判定ロジック:柔軟に判定するために「キーワード」でフィルタリングする
Select Case True
Case InStr(templateName, “network”) > 0
GetCurrentTemplateType = “NETWORK_DIAGRAM”
Case InStr(templateName, “flowchart”) > 0
GetCurrentTemplateType = “FLOWCHART”
Case Else
GetCurrentTemplateType = “UNKNOWN”
End Select
End Function
‘ @brief テンプレートに基づいた動的処理の実装例
Sub ExecuteSmartAction()
Dim templateType As String
templateType = GetCurrentTemplateType()
Select Case templateType
Case “NETWORK_DIAGRAM”
Debug.Print “ネットワーク図専用の最適化処理を実行します。”
‘ ここにネットワーク図特有の処理を記述
Case “FLOWCHART”
Debug.Print “フローチャート専用の整形処理を実行します。”
‘ ここにフローチャート特有の処理を記述
Case Else
MsgBox “このドキュメントタイプではサポートされていません。”, vbExclamation
End Select
End Sub
—
3. 初学者が陥りやすい「エラーの罠」
このコードを実装する際、多くの初学者が以下の壁にぶつかります。
1. `ActiveDocument` が存在しないケース:
Visioのウィンドウが一つも開いていない状態でマクロを実行すると、`ActiveDocument` へのアクセスでエラーになります。常に `If ActiveDocument Is Nothing Then Exit Sub` のようなガード節を入れておくのがプロの流儀です。
2. 大文字・小文字の揺れ:
`Windows` や `Visio` のパス比較では、`”Network”` と `”network”` が別物として扱われることがあります。必ず `LCase()` を使って小文字に統一してから比較しましょう。
—
4. 伝説のエンジニアからのアドバイス
コードの抽象化とは、「未来の自分への配慮」です。
テンプレートが増えるたびに `Select Case` を書き換えるのは面倒ですよね。そんな時は、設定ファイル(JSONや外部テキスト)に「ファイル名の一部」と「処理ID」をマッピングしておき、動的に読み込む設計に進化させてみてください。
Visioというソフトウェアは、単なる作図ソフトではなく、「データと図形が結合したデータベース」です。今回紹介した「テンプレートの判定」は、そのデータベースを操るための「最初の鍵」に過ぎません。
ここをクリアしたあなたは、もう「マクロを記録する人」ではありません。「Visioの構造を支配するエンジニア」です。
次回のステップアップでは、このテンプレート情報を活用して、特定のシェイプだけを抽出・操作する「スマート・セレクション」について深掘りしましょう。
何か疑問があれば、いつでも聞いてください。あなたの自動化の旅を、全力でサポートします。
