【入門編】Shape.GluedShapesメソッドによる接続トラッキング:配線・コネクタの接続先完全把握 – Visio VBA解析バイブル

スポンサーリンク

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は、単なる「お絵描きツール」を「構造化データ基盤」に変える魔法です。ぜひ、このコードを土台にして、あなただけの自動化ツールを育て上げてください。

何か不明な点や、さらに深い「接続の罠」について知りたいことがあれば、いつでも聞いてくださいね。応援しています!

タイトルとURLをコピーしました