Visio VBAの深淵へ:GluedShapesで「接続の真実」を完全追跡する
こんにちは。業務自動化の最前線でVisioと格闘し続けているエンジニアです。
Visioでフローチャートやネットワーク図を描くとき、皆さんはどうやって「どのシェイプとどのコネクタが繋がっているか」を把握していますか? 多くの人が `ConnectedShapes` メソッドを使いますが、実はこれ、「大まかな繋がり」を見るには便利でも、現場のシビアな要件には力不足なことが多いのです。
「接続点(Glue)のどこに繋がっているのか?」「コネクタの始点側なのか終点側なのか?」
これらを正確に判別し、図面の整合性を担保するには、`GluedShapes` メソッドという強力な武器が必要です。
今回は、マクロの記録から一歩踏み出し、Visioの心臓部であるオブジェクトモデルを掌握するための「接続解析術」を伝授します。
—
1. なぜ「GluedShapes」なのか?
`ConnectedShapes` が「友達の友達」をざっくり取得するのに対し、`GluedShapes` は「どの接続点(Glue)に、どのコネクタが、どのような方向で刺さっているか」という物理的な情報を引き出します。
- ConnectedShapes: 「このシェイプに繋がっている図形を全部教えて」
- GluedShapes: 「このシェイプの『接続点(3番)』に、どのコネクタの『始点』が固定されているか教えて」
この解像度の違いが、自動生成レポートや図面チェックの精度を決定づけます。
—
2. 実践:接続先を完全追跡するコード
それでは、特定のシェイプに接続されているコネクタのIDと、それが「接続元(Outgoing)」なのか「接続先(Incoming)」なのかを判別するコードを見ていきましょう。
Sub TrackConnections()
Dim shp As Visio.Shape
Dim connectedIDs() As Long
Dim i As Long
‘ 現在選択しているシェイプを対象にする
Set shp = ActiveWindow.Selection(1)
‘ 1. このシェイプに接続されている「すべてのコネクタ」を取得
‘ visGluedShapesOutgoing: 始点として接続しているコネクタ
‘ visGluedShapesIncoming: 終点として接続しているコネクタ
‘ visGluedShapesAll: 両方
shp.GluedShapes visGluedShapesAll, connectedIDs
If UBound(connectedIDs) < 0 Then Debug.Print "接続は見つかりませんでした。" Exit Sub End If ' 2. 取得したIDをループ処理 For i = LBound(connectedIDs) To UBound(connectedIDs) Dim connectedShp As Visio.Shape Set connectedShp = ActivePage.Shapes.ItemFromID(connectedIDs(i)) ' 接続方向を判定(このシェイプから出ているか、入っているか) If shp.GluedShapes(visGluedShapesOutgoing, "").Contains(connectedIDs(i)) Then Debug.Print "接続先(Outgoing): " & connectedShp.Name & " (ID: " & connectedIDs(i) & ")" Else Debug.Print "接続元(Incoming): " & connectedShp.Name & " (ID: " & connectedIDs(i) & ")" End If Next i End Sub ---
3. 現場で陥りやすい「落とし穴」と対策
このコードを実務で使う際、初心者が必ずと言っていいほど躓くポイントがあります。
① 配列の境界チェック(LBound/UBound)
Visioの `GluedShapes` は、何も見つからないとエラーを吐くのではなく、「初期化されていない配列」を返します。`UBound(connectedIDs)` をチェックせずにループを回そうとすると、「添字が範囲外です」という憎きエラーに遭遇します。必ずコード例のように `UBound` をチェックする癖をつけてください。
② 接続点(Connection Point)の概念
実は、単純に「シェイプ同士が繋がっている」だけでなく、シェイプ上の「どのポイント(例:上辺の中心、右辺の端など)」に刺さっているかも取得可能です。
もし特定の接続点を指定したい場合は、`GluedShapes` の第3引数に接続点のインデックス(例:`visConnectionPoint`)を指定します。ここを使いこなすと、「右側から入ってくる線だけを抽出する」といった高度な選別が可能になります。
③ 図面の「更新タイミング」
Visioは非常に強力ですが、複雑な図面では「接続の更新」が少し遅れることがあります。プログラムでシェイプを動かした直後に解析する場合は、`Application.ActiveDocument.Calculate` や `DoEvents` を挟むことで、計算の不整合を回避できる場合があります。
—
最後に:自動化の先にある世界
「コードを書く」ということは、Visioが裏側で管理している「接続のデータベース」を直接操作するということです。
今回学んだ `GluedShapes` を応用すれば、以下のようなことが可能になります。
- 整合性チェック: 「必ず1つのInputに対して2つのOutputがあるべき」というルールを強制する。
- 自動レポート: 接続関係をCSVに書き出し、Excelで自動集計する。
- 自動レイアウト: 接続元から接続先までを再帰的に辿り、ツリー構造を解析する。
Visio VBAは、単なる「お絵描きツール」を「構造化データ基盤」に変える魔法です。ぜひ、このコードを土台にして、あなただけの自動化ツールを育て上げてください。
何か不明な点や、さらに深い「接続の罠」について知りたいことがあれば、いつでも聞いてくださいね。応援しています!
