Visio Validation API:図面品質をコードで強制する「検閲官」の作り方
VisioのValidation(図面検証)機能。GUIでポチポチと「検証」ボタンを押して結果を眺めるだけで満足しているなら、それはまだ「素人」の域を出ない。
大規模なプロセス図や、複雑なデータモデルを扱うエンタープライズ環境において、図面の整合性は「人手」に委ねてはならない。我々アーキテクトが目指すべきは、保存時やデプロイ時に、Validationルールを強制的に走らせ、違反があれば即座に修正・ログ出力を行う「自動検閲機構」の構築だ。
今回は、Visio VBAを用いてValidation機能をハックし、そのライフサイクルを掌握する方法を伝授する。
—
1. オブジェクトモデルの深層:Validation APIの全貌
VisioのValidation機能は、`Document`オブジェクト配下に存在する`Validation`プロパティを起点とする。UI上の機能はあくまでフロントエンドに過ぎず、真のパワーは`Validation.Validate`メソッドにある。
ここで重要なのは、「検証ルール(Rule)」の定義はVSDXファイル自体に埋め込まれているという点だ。VBAからこれらを操作する際は、以下の階層構造を意識せよ。
1. Validation.Issues: 検証結果のコレクション。ここにすべての「違反」が格納される。
2. Validation.RuleSets: ルールセット。特定の検証ルール群を束ねるコンテナ。
3. Validation.Validate: 検証エンジンを起動するトリガー。
—
2. 実装コード:検証実行と違反の抽出
以下のコードは、単に検証を走らせるだけではない。検証後に発生した`ValidationIssue`を走査し、ログへ書き出すまでの堅牢なパターンだ。
‘ Visio Validation Engine Execution Routine
Public Sub ExecuteValidationAndLog()
Dim doc As Visio.Document
Dim val As Visio.Validation
Dim issues As Visio.ValidationIssues
Dim issue As Visio.ValidationIssue
Set doc = ActiveDocument
Set val = doc.Validation
‘ 1. 検証実行:メモリオーバーヘッドを避けるため、必要なルールセットのみを対象にするのが定石
‘ 全ルールの実行は大規模図面では数秒のブロッキングを招くため注意が必要
val.Validate
‘ 2. 結果の取得
Set issues = val.Issues
If issues.Count = 0 Then
Debug.Print “検証完了:違反なし”
Exit Sub
End If
‘ 3. 違反の走査とログ出力
Dim i As Long
For i = 1 To issues.Count
Set issue = issues.Item(i)
‘ issue.Target が違反対象のShape(あるいはPage/Doc)
Debug.Print “違反検出: ” & issue.Rule.Name & ” | TargetID: ” & issue.Target.Name
‘ 開発現場の知見:ここから自動修正ロジックへ分岐させる
‘ If issue.Rule.Name = “DisconnectedConnector” Then FixConnection(issue.Target)
Next i
‘ 明示的なオブジェクト解放(VBAにおいては重要)
Set issue = Nothing
Set issues = Nothing
Set val = Nothing
Set doc = Nothing
End Sub
—
3. シニアエンジニアが守るべき「3つの鉄則」
① メモリリークを許容するな
VisioのオブジェクトモデルはCOMのラッパーだ。特に`ValidationIssues`のようなコレクションをループする際、`Set`変数を適切にクリアしないと、Visioのプロセスが肥大化し、長時間稼働後のクラッシュを誘発する。`Nothing`による解放は、VBAにおける「作法」ではなく「生存戦略」だ。
② UIスレッドのブロックを回避せよ
Validation機能は重い。もし、図面を開いた直後の`DocumentOpened`イベントでこれを実行しようとすると、Visioの起動が極端に遅くなる。Windows APIの`SetTimer`や、あるいは`Application.Idle`イベントを活用し、バックグラウンドでの非同期処理に近い挙動を模倣することをお勧めする。
③ 運用ルールとしての「Validate-on-Save」
システム管理者としての最適解は、`DocumentBeforeSave`イベントをフックし、検証違反がある場合は「保存をキャンセルする」または「警告ダイアログを出す」という強制力を持たせることだ。
‘ ThisDocument モジュールに記述
Private Sub Document_BeforeSave(ByVal doc As IVDocument)
If HasCriticalValidationIssues(doc) Then
MsgBox “品質基準を満たしていないため、保存できません。”, vbCritical
‘ キャンセル処理の実装はVisioのバージョンにより挙動が異なるため要注意
End If
End Sub
—
4. 結びに:なぜ「自動化」に魂を込めるのか
手作業での品質チェックは、人間が疲弊するたびに精度が落ちる。しかし、コードは裏切らない。我々が書くこのVBAは、単なるマクロではなく、図面の品質を維持するための「静的な門番」である。
Visioという、一見するとGUI主体のレガシーなツールであっても、その深層には強固なオブジェクトモデルが息づいている。それを手懐け、意のままに操ることこそが、真の自動化エンジニアの矜持だ。
次回の講義では、さらに踏み込んで`ValidationRule`自体をVBAから動的生成し、特定のプロジェクト特有の「ビジネスロジック」を検証ルールに注入する手法について論じる。
現場の健闘を祈る。
