Visio VBAの深淵へ:ConnectedShapesで「図形の接続関係」を逆引きする極意
こんにちは。Visioの世界へようこそ。
普段、何気なくコネクタで図形を繋いでいるその図面、実は「単なるお絵描き」ではありません。Visioの裏側では、緻密な数学的グラフ構造(ノードとエッジ)が構築されています。
今日は、そのネットワーク構造をプログラムで解き明かすための最強の武器、`ConnectedShapes`メソッドの使い方を伝授しましょう。「マクロの記録」を卒業し、図面をデータとして自在に操るための第一歩です。
—
1. なぜ「ConnectedShapes」が最強なのか?
かつてのVisio VBA開発者は、すべてのコネクタを総当たりでループさせ、`BeginX`や`EndX`がどの図形に接続されているかを計算していました。これは非常に重く、非効率で、何よりバグの温床でした。
しかし、`ConnectedShapes`メソッドは違います。Visioのエンジンが内部で管理している「接続テーブル」を直接叩くため、極めて高速かつ正確に接続情報を取得できるのです。
基本的な考え方
- 探索の始点: どの図形から出発するか
- 方向の指定: 出ていくコネクタ(Outgoing)か、入ってくるコネクタ(Incoming)か、あるいは両方か。
- 結果の取得: 繋がっている図形のIDが「配列(Array)」として返ってくる。
—
2. 実践コード:接続先を自動追跡する
まずは、現在選択している図形から、「どの図形が繋がっているか」を追跡し、イミディエイトウィンドウに出力するコードを書いてみましょう。
Sub TraceConnectedShapes()
Dim vsoShape As Visio.Shape
Dim connectedIds() As Long
Dim i As Long
‘ 選択中の図形を取得(1つだけ選択している前提)
If ActiveWindow.Selection.Count = 0 Then Exit Sub
Set vsoShape = ActiveWindow.Selection(1)
‘ 1. ConnectedShapesで接続先を取得
‘ visConnectedShapesOutgoing: 出力方向(矢印の先)へ追跡
‘ 他にも visConnectedShapesIncoming, visConnectedShapesAll などがあります
connectedIds = vsoShape.ConnectedShapes(visConnectedShapesOutgoing, “”)
‘ 2. 取得したIDをループして情報を表示
Debug.Print “図形 ID: ” & vsoShape.ID & ” (” & vsoShape.Name & “) からの接続先:”
If UBound(connectedIds) = -1 Then
Debug.Print “接続先はありません。”
Else
For i = LBound(connectedIds) To UBound(connectedIds)
‘ 取得したIDから図形オブジェクトを特定
Dim targetShape As Visio.Shape
Set targetShape = ActivePage.Shapes.ItemFromID(connectedIds(i))
Debug.Print ” -> 接続先ID: ” & targetShape.ID & ” / 名称: ” & targetShape.Name
Next i
End If
End Sub
コードの解説
- `ItemFromID`の重要性: `ConnectedShapes`が返すのは「ID(数値)」です。実体である`Shape`オブジェクトに変換するには、`ActivePage.Shapes.ItemFromID(ID)`を使うのが定石です。これを知っているだけで、開発の速度が段違いになります。
- 配列の空判定: `UBound(connectedIds) = -1` という書き方は、配列が空(接続なし)であることを判定するイディオムです。ここを忘れると、空の配列にアクセスしようとして実行時エラーになるので注意してください。
—
3. 陥りやすい罠と解決策
罠1:コネクタ自体を追跡してしまう
`ConnectedShapes`は「図形→図形」の接続を追跡します。もし「どのコネクタを使って繋がっているか」を知りたい場合は、`ConnectedShapes`ではなく、`FromConnects`プロパティを使う必要があります。用途に合わせて使い分けるのが「プロ」の視点です。
罠2:図面の複雑さによるパフォーマンス低下
数千個の図形がある図面で、全ノードを再帰的に走査すると、Visioがフリーズすることがあります。
- 対策: 既に訪問済みのIDを`Collection`や`Dictionary`オブジェクトに格納し、二重探索を防ぐ「探索済みフラグ」を必ず実装してください。
—
4. さあ、次のステップへ
この`ConnectedShapes`をマスターすれば、以下のようなことが可能になります。
1. 自動グラフ解析: 複雑なシステム構成図から、単一障害点(SPOF)をプログラムで自動検出する。
2. データ連携: 接続関係をCSVやJSONに書き出し、外部のグラフデータベースやExcelで可視化する。
3. 自動ドキュメント生成: 図面のトポロジを解析し、接続表を自動作成する。
Visio VBAは、単なるマクロ作成ツールではありません。「図面という非構造化データを、論理的な構造体として操作する」ための強力なエンジンなのです。
まずは、適当な図形をいくつか置いて、このコードを動かしてみてください。イミディエイトウィンドウにIDが表示された瞬間、あなたの図面が「ただの絵」から「生きたデータベース」に変わるはずです。
何か詰まったら、いつでも聞いてくださいね。あなたの自動化の旅を、全力でサポートします。
