Visio VBAを掌握する:コネクタの「接続関係」を逆引き解析し、トポロジをExcelへ出力せよ
こんにちは。現場で泥臭い自動化を積み重ねてきたエンジニアです。
Visioで図形を並べて線でつなぐ……これは初歩ですが、その「接続情報」をプログラムで吸い上げて、ネットワーク図のリスト化やフローの整合性チェックに活用しようとすると、途端に難易度が上がります。「マクロの記録」ボタンを押しても、何も記録されない世界ですよね。
今回は、Visio VBAにおいて最も重要かつ強力な武器、`ConnectedShapes`メソッドを使って、図形の「上流・下流」を自在に操る技術を伝授します。
—
1. なぜ「ConnectedShapes」なのか?
Visioの図形(Shape)には、コネクタを通じて「誰とつながっているか」という情報が隠されています。
初心者の方は、「図形を全走査して、すべてのコネクタの端点座標を計算して……」といった、地獄のような幾何学計算を試みがちです。しかし、それは不要です。
Visioのオブジェクトモデルには、最初から「接続している相手を教えろ」という命令が用意されています。それが `ConnectedShapes` メソッドです。
- `visConnectedShapesIncomingNodes`: 自分に向かってくる(上流)図形を取得
- `visConnectedShapesOutgoingNodes`: 自分から出ていく(下流)図形を取得
このメソッドを使いこなせば、図形の座標計算など一度もすることなく、ネットワークの論理構造だけを抽出できます。
—
2. 実装:接続関係をExcelへ吐き出すエンジン
以下のコードは、選択中の図形を起点として、その下流にある接続先を特定し、Excelへ書き出すための雛形です。
Sub ExportTopologyToExcel()
Dim vsoShape As Visio.Shape
Dim connectedShapes() As Long
Dim i As Long
Dim xlApp As Object
Dim xlSheet As Object
‘ 1. 選択している図形があるか確認
If ActiveWindow.Selection.Count = 0 Then
MsgBox “解析対象の図形を選択してください。”, vbExclamation
Exit Sub
End If
Set vsoShape = ActiveWindow.Selection(1)
‘ 2. Excelを起動(参照設定なしで動くLate Binding)
Set xlApp = CreateObject(“Excel.Application”)
xlApp.Visible = True
xlApp.Workbooks.Add
Set xlSheet = xlApp.ActiveSheet
xlSheet.Cells(1, 1).Value = “起点図形”
xlSheet.Cells(1, 2).Value = “接続先図形”
‘ 3. ConnectedShapesで下流(Outgoing)を取得
‘ 第2引数で「outgoing」を指定することで、配線の向きを抽出
connectedShapes = vsoShape.ConnectedShapes(visConnectedShapesOutgoingNodes, “”)
‘ 4. 取得したIDを元に、接続先の名前をExcelに転記
For i = LBound(connectedShapes) To UBound(connectedShapes)
Dim targetShape As Visio.Shape
Set targetShape = ActivePage.Shapes.ItemFromID(connectedShapes(i))
xlSheet.Cells(i + 2, 1).Value = vsoShape.Name
xlSheet.Cells(i + 2, 2).Value = targetShape.Name
Next i
MsgBox “解析完了!”
End Sub
—
3. ここをクリアすれば一人前!陥りやすい罠
このコードを実装する際、多くのエンジニアが躓くポイントが3つあります。
① 「グループ化」の罠
Visioの図形はグループ化されると、親子関係が発生します。`ConnectedShapes`は「そのShapeオブジェクト」に対して実行されるため、グループの外側からコネクタが刺さっている場合、期待通りのIDが取れないことがあります。
対策: 複雑な図形は必ずグループ解除するか、`Parent`プロパティを辿ってトップレベルの親を探すロジックを入れましょう。
② 「コネクタの向き」の罠
Visioのコネクタは、描画した順番や方向によっては「逆向き」に解釈されることがあります。「下流を取得したはずなのに逆が出る」という場合は、コネクタ図形の `Flip` プロパティを確認するか、手動でコネクタの端点を繋ぎ直してリセットしてください。
③ `ItemFromID` の寿命
`ConnectedShapes` が返すのは「ID(Long型)」です。このIDは、図形を削除して元に戻す(Undo)と変わる可能性があります。長時間の解析処理を行う際は、IDを溜め込まず、その都度オブジェクトを取得するスタイルを徹底してください。
—
最後に:自動化の先にあるもの
この「接続情報の抽出」ができるようになると、次は「自動生成」が可能になります。
Excelに書かれた接続リストを読み込み、`ActivePage.Drop` メソッドを使って図形を配置し、`Shape.AutoConnect` メソッドで線をつなぐ。これだけで、数時間かかるネットワーク図の更新が、一瞬で終わるようになります。
プログラミングの醍醐味は、手作業の再現ではなく、「構造の変換」にあります。
まずは今日紹介した `ConnectedShapes` を使い、自分の図面がどう見えているのか、コードの目で覗いてみてください。
「Visioはただの作図ツールではない、データベースである」――そう気づいた時、あなたはもう中級者の壁を越えていますよ。応援しています。
