エンジニア諸君、ようこそ。
Visioの「マクロの記録」ボタンを押して、生成されたコードのあまりの無力さに絶望した経験はないかな?
Visioの真の力は、画面上の図形を並べることではなく、「データとルールの整合性をプログラムで制御すること」にある。今回は、Visio Professionalの隠れた秘宝『Validation(図面検証)API』をVBAで掌握し、図面の品質を自動で担保する「プロの自動化手法」を伝授しよう。
—
なぜ「検証機能」をVBAで操る必要があるのか?
通常、Visioの「図面検証」は[プロセス]タブから手動で実行するものだ。だが、数百ページある図面や、定期的な監査が必要なシステム設計書で、毎回手動でポチポチと確認するのはナンセンスだ。
VBAを使えば、「保存時」や「納品前」に自動でルールを走らせ、違反があれば即座にログを吐き出し、場合によっては自動修正まで完結させることができる。これが、エンジニアがVisioを「描画ツール」ではなく「開発プラットフォーム」として使うということだ。
—
Visioオブジェクトモデルの深淵:DocumentとValidation
Visioにおいて、検証機能は `Document` オブジェクトに紐付いている。まずは、この階層構造を頭に叩き込んでおこう。
- Application: Visioそのもの。
- Document: 図面ファイル。ここに「検証ルールセット(Validation)」が宿る。
- Validation: 検証ルールそのものを管理するエンジン。
実践:検証ルールを自動実行するVBAコード
以下のコードは、現在の図面に対して設定されているすべての検証ルールを実行し、違反(Issue)が見つかった場合に、その内容をイミディエイトウィンドウに出力するプロフェッショナルなテンプレートだ。
Public Sub RunValidationAndExportIssues()
Dim doc As Visio.Document
Dim vld As Visio.Validation
Dim issues As Visio.ValidationIssues
Dim issue As Visio.ValidationIssue
Set doc = ThisDocument
‘ 1. DocumentからValidationオブジェクトを取得
Set vld = doc.Validation
‘ 2. 全ルールを実行(Validation.Validate)
‘ これにより、図面内の全図形がルールに基づいてチェックされる
vld.Validate
‘ 3. 検出されたIssue(違反)を取得
Set issues = vld.Issues
If issues.Count = 0 Then
Debug.Print “検証完了:違反は見つかりませんでした。完璧です。”
Exit Sub
End If
‘ 4. 違反内容のログ出力
Debug.Print “— 検証結果: ” & issues.Count & ” 件の違反 —”
For Each issue In issues
‘ issue.TargetShapeで違反図形そのものにアクセス可能
Debug.Print “ルール: ” & issue.Rule.Description
Debug.Print “場所: ” & issue.TargetShape.Name
Debug.Print “説明: ” & issue.Message
Debug.Print “—————————–”
Next issue
End Sub
—
陥りやすい罠と「プロの知見」
1. 「なぜかルールが実行されない」問題
Visioの検証機能は、「ルールセット」がそのドキュメントに有効化されていることが前提だ。コードが正しくても、UI上で検証ルールが一つもチェックされていない状態では何も起きない。
解決策として、VBAの冒頭で `doc.Validation.RuleSets` をループし、必要なルールセットの `Enabled` プロパティを `True` にする処理を加えると堅牢性が増す。
2. オブジェクトの参照破棄(メモリリーク対策)
VBAはガベージコレクションが優秀とは言えない。`For Each` で `Issue` を回す際、処理対象が数千個を超えるとVisioが重くなることがある。重い処理を行う場合は、ループ内で `Set issue = Nothing` を明示的に呼ぶ癖をつけよう。
3. 「自動修正」のヒント
`issue.TargetShape` を取得できるということは、その図形の `Cells`(シェイプシート)をVBAで書き換えることも可能だということだ。
例えば、「接続されていないコネクタ」という違反が出たら、そのコネクタの `EndConnected` セルを確認し、座標を強制的に近くの図形にスナップさせる処理を書けば、「自律修復する設計書」が完成する。
—
次のステップ:君が手に入れるべき「自動化の視点」
このコードをクリアした諸君は、もう「マクロの記録」に頼る初心者ではない。
次に目指すべきは、イベント駆動だ。
`Document_BeforeDocumentSave` イベントを使い、「保存ボタンを押した瞬間に、検証ルールを走らせ、違反があれば保存をブロックする」というゲートキーパーを作成してみるといい。品質担保の自動化こそが、開発効率を爆発させる鍵だ。
Visioという巨大なオブジェクトの海を泳ぎこなすのは楽しいだろう?
分からないことがあれば、いつでも聞きに来てほしい。君のコードが、現場のスタンダードになることを期待している。
