Visioの「見えない鎖」を解き放て:ConnectedShapesで紐解くネットワークトポロジ解析の極意
多くのエンジニアがVisioを単なる「お絵かきツール」だと思っている。だが、我々自動化のスペシャリストにとって、Visioは「高次元なグラフ構造データ」そのものだ。
手作業で図形を追いかけ、Excelに転記する非効率な作業は今日で終わりだ。本稿では、Visioの`ConnectedShapes`メソッドを駆使し、図面内のネットワーク構造をプログラム側から逆引き・自動解析する「プロフェッショナルな設計術」を伝授する。
—
1. なぜ「手動追跡」が地獄への入り口なのか
多くの初心者は、`Connects`コレクションをループして、力技で接続先を探そうとする。しかし、それは悪手だ。
- 非効率なループ: `Connects`は図面全体の接続情報を保持しており、特定の図形から辿るには計算コストが高すぎる。
- 保守性の欠如: 接続の方向性(流出・流入)を意識しない設計は、複雑なトポロジで必ずバグを生む。
我々が採用すべきは、Visio 2010以降で実装された`ConnectedShapes`メソッドだ。これは、Visioの描画エンジンが内部的に保持しているトポロジ情報を直叩きするものであり、パフォーマンスと正確性が桁違いである。
—
2. 堅牢なトポロジ解析を実現するプロダクションコード
このコードは、ある図形から「どの図形に繋がっているか」を再帰的に、かつエラーハンドリングを徹底して抽出する設計となっている。
Option Explicit
‘ @description: 指定したShapeから接続先を逆引きし、イミディエイトウィンドウに出力する
‘ @param targetShape: 起点となるVisio.Shape
Public Sub TraceTopology(ByVal targetShape As Visio.Shape)
Dim connectedIds() As Long
Dim i As Long
Dim nextShape As Visio.Shape
‘ エラーハンドリング:非接続オブジェクトへの安全策
On Error Resume Next
‘ visConnectedShapesOutgoing: 流出方向の接続を解析
connectedIds = targetShape.ConnectedShapes(Visio.VisConnectedShapesFlags.visConnectedShapesOutgoingNodes, “”)
If Err.Number <> 0 Then
Debug.Print “この図形には出口がありません: ” & targetShape.Name
Exit Sub
End If
On Error GoTo 0
‘ 接続先を走査
For i = LBound(connectedIds) To UBound(connectedIds)
Set nextShape = targetShape.Page.Shapes.ItemFromID(connectedIds(i))
‘ ここでログ出力やデータベース連携を行う
Debug.Print “経路: ” & targetShape.Text & ” -> ” & nextShape.Text
‘ 再帰的な解析が必要な場合はここで TraceTopology(nextShape) を呼ぶ
‘ ※循環参照(ループ)対策のフラグ管理を忘れずに
Next i
End Sub
—
3. 現場で生き残るための「3つの鉄則」
現場の業務自動化において、コードが動くことはスタートラインに過ぎない。真のエンジニアは「壊れない仕組み」を作る。
① 循環参照の検知を実装せよ
トポロジ解析において最も恐ろしいのは、ネットワークがループしている場合の「無限再帰」だ。解析済みの`Shape.ID`を`Scripting.Dictionary`に格納し、二度見しない設計を徹底すること。これができないエンジニアは、複雑なシステムを扱う資格がない。
② データベースとの疎結合を維持せよ
解析したデータは、決してVisio内に保持させてはいけない。Visioはあくまで「ビューアー」だ。
- JSON/CSVに出力: `ConnectedShapes`の結果を一度構造化データとして書き出し、それをPythonやPower BIに渡すパイプラインを構築せよ。
- IDの永続性: VisioのIDは、ページをコピーしたりすると変わる可能性がある。図形に「ユニークなカスタムプロパティ(Shape Data)」を埋め込み、それをキーとしてDBと紐付けるのが、真のエンタープライズ構成だ。
③ 描画層とデータ層を分離せよ
「図形の色を変えて接続を表示する」といった装飾的なマクロは、解析完了後に別モジュールとして実行すること。解析中に描画プロパティを弄ると、パフォーマンスが著しく低下する。
—
結論:Visioを「データソース」として扱い尽くせ
`ConnectedShapes`をマスターすれば、貴方は単なるVBAユーザーから、「Visioという複雑な空間データ構造を支配するアーキテクト」へと進化する。
ネットワーク構成図、組織図、工程表。これらすべては、あなたのプログラムによって自動的にデータベース化され、可視化されるのを待っている。
次は、このデータをどのようにグラフデータベース(Neo4jなど)にインポートし、動的に解析するかを議論しよう。エンジニアとしての研鑽を止めるな。現場の課題を、コードの力でねじ伏せろ。
