Visio Validationを掌握せよ:GUIの手作業を排し、品質をコードで強制する極限の設計
業務自動化の現場において、Visioの「図面検証(Validation)」をGUIでポチポチ操作しているようでは、プロフェッショナルとは呼べません。
図面の整合性、接続の不備、データ属性の欠落。これらを人の目に頼ることは、自動化の恩恵を自ら放棄しているに等しい。本稿では、`Document.Validation`機能をVBAから直接叩き、検証プロセスをCI/CDパイプラインのように組み込むための設計論を授けます。
—
1. なぜ「Validation機能」をVBAで制御すべきか
VisioのValidation機能は、単なるエラーチェッカーではありません。これは「ビジネスロジックの制約を図面に埋め込む」ためのエンジンです。
多くのエンジニアが犯す過ちは、検証ロジックを自作のマクロ内にべた書きすることです。これは保守の地獄を招きます。検証ルールはVisioの標準機能(`Validation`オブジェクト)に定義させ、VBAはその「実行」と「結果のハンドリング」に徹する。この役割分担が、堅牢な自動化の鍵です。
2. 実装の要諦:Validationオブジェクトのライフサイクル
VBAから検証を走らせる際、以下の3ステップを厳守してください。
1. Validation.Validate: 検証の実行。
2. ValidationIssues: 検出された違反リスト(`ValidationIssue`オブジェクト)の取得。
3. Issue.Target: 違反が発生したShapeへのダイレクトアクセス。
特に重要なのは、「Issueは実行ごとに更新されるため、動的な参照保持を行わない」こと。メモリリークや不正なポインタ参照を避けるため、都度クエリを投げる設計が必須です。
—
3. 実践:プロダクションレベルの検証実行コード
以下のコードは、検証ルールをトリガーし、違反があった場合に「何が、どこで、なぜ」起きているかをイミディエイトウィンドウに出力し、必要に応じて自動修正を行うための雛形です。
Option Explicit
”’
”’
Public Sub ExecuteDiagramValidation()
Dim vdoc As Visio.Document
Dim vissues As Visio.ValidationIssues
Dim vissue As Visio.ValidationIssue
Dim targetShape As Visio.Shape
Set vdoc = ActiveDocument
‘ 1. 検証の実行(検証ルールセットが定義されている前提)
‘ Application.DoCmd を使うよりも、Document直下のValidateを推奨
Set vissues = vdoc.Validation.Validate()
If vissues.Count = 0 Then
Debug.Print “検証完了:違反なし。”
Exit Sub
End If
Debug.Print “— 検証違反検出:合計 ” & vissues.Count & ” 件 —”
‘ 2. 違反のイテレーションとハンドリング
For Each vissue In vissues
Set targetShape = vissue.Target
‘ ロギング:どの図形が、どのルールに抵触したか
Debug.Print “Rule: ” & vissue.Rule.Name
Debug.Print “Target: ” & targetShape.Name & ” (ID: ” & targetShape.ID & “)”
Debug.Print “Message: ” & vissue.Rule.Description
‘ 3. 自動修正ロジックの分岐(例:未接続図形の特定とフラグ立て)
If vissue.Rule.Name = “ConnectedNodes” Then
ApplyAutoFix targetShape
End If
Next vissue
MsgBox “検証終了。詳細はイミディエイトウィンドウを確認してください。”, vbInformation
End Sub
Private Sub ApplyAutoFix(ByRef shp As Visio.Shape)
‘ ここでビジネスロジックに応じた自動修正を記述
‘ 例:検証を通らない図形に赤枠をつける等の可視化
shp.Cells(“LineColor”).Formula = “RGB(255,0,0)”
Debug.Print ” -> 自動修正適用済み: ” & shp.Name
End Sub
—
4. 運用上の注意点と「伝説」の知見
データベース連携の罠
Validationの結果をDBに送る際、`ValidationIssue.ID`はセッションを跨ぐと保持されません。永続的な管理が必要な場合は、Shapeの`UniqueID`(VisioのGUID)をキーとして抽出してください。`Shape.ID`は削除や再配置で容易に変わります。
パフォーマンスの最適化
大規模な図面(数百以上のShape)で検証を行う場合、`Validation.Validate`は重い処理となります。頻繁に呼び出すのではなく、`Document.EventList`を使用して「図面保存時(BeforeDocumentSave)」や「Shapeドロップ時」に限定して実行するようにイベント駆動設計を行ってください。
なぜこれが「保守性が高い」のか
- デカップリング: 検証ルール自体はVisioのUI上で管理(XMLエクスポート/インポート可能)するため、VBAコードを書き換えることなくルール変更に対応できます。
- 透過性: `vissue.Rule.Name`をキーに処理を分岐させることで、新しいルールが増えても`Select Case`や別モジュールへの委譲が容易です。
結びに代えて
ツールを作ることは、誰かの作業を奪うことではなく、誰かの「思考の質」を高めることです。検証作業を自動化し、エンジニアが「図面が正しいか」を確認する時間から解放されたとき、初めて本来の「設計」に集中できるはずです。
このコードをあなたの武器にし、Visioという巨大なオブジェクトモデルを、真の意味で支配してください。
