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

スポンサーリンク

Visio接続解析の深淵:GluedShapesで「真のトポロジー」を掌握せよ

Visioで自動化ツールを開発していると、必ず突き当たる壁がある。それは「シェイプとコネクタの正確な相関関係の特定」だ。多くのエンジニアは`ConnectedShapes`メソッドで満足するが、それは浅瀬で遊んでいるに過ぎない。

現場で求められるのは、「どの接続点(Glue)に、どのコネクタが、どのような方向性(In/Out)で結合しているか」という完全なメタデータの抽出だ。これを実現する唯一の鍵が`Shape.GluedShapes`メソッドである。

本記事では、このメソッドを極め、堅牢なトポロジー解析エンジンを構築するための知見を伝授する。

なぜ `ConnectedShapes` では不十分なのか

`ConnectedShapes`は「接続されているシェイプ」を返すだけだ。しかし、これでは「二つのシェイプ間にコネクタが二本ある場合」や「接続点の位置(ピンポイント)」を識別できない。

一方、`GluedShapes`は、特定のコネクタやシェイプの接続点(Glue)に直接アクセスできる。これにより、データフロー図の追跡や、配線ミスの自動検知といった、高度なエンジニアリングが可能になる。

実践:GluedShapesによる接続トラッキング・コード

以下のコードは、指定したシェイプに接続されているコネクタを列挙し、その方向性を解析するプロダクション・グレードの関数である。

‘ @brief 指定シェイプに接続された全コネクタとその接続方向を解析する
‘ @param shp 解析対象のシェイプ
‘ @return 接続情報の配列(またはデバッグ出力)
Public Sub TraceConnections(shp As Visio.Shape)
Dim gluedIDs() As Long
Dim i As Long
Dim connectorObj As Visio.Shape

‘ visModeAll: 受信も送信も含む全ての接続を取得
‘ visGluedShapesIncoming: 受信のみ、visGluedShapesOutgoing: 送信のみ
‘ ここでは全て取得し、後続で判別する
shp.GluedShapes visGluedShapesAll, gluedIDs

If UBound(gluedIDs) < 0 Then Exit Sub For i = LBound(gluedIDs) To UBound(gluedIDs) Set connectorObj = shp.Document.Pages(shp.Page.Index).Shapes.ItemFromID(gluedIDs(i)) ' 接続方向の判定ロジック ' 接続先がFrom(始点)なのかTo(終点)なのかを特定 If connectorObj.OneD Then If connectorObj.Cells("BeginX").Glue.Shape.ID = shp.ID Then Debug.Print "コネクタID: " & connectorObj.ID & " は、このシェイプから始まっています (OUT)" ElseIf connectorObj.Cells("EndX").Glue.Shape.ID = shp.ID Then Debug.Print "コネクタID: " & connectorObj.ID & " は、このシェイプで終わっています (IN)" End If End If Next i End Sub ---

現場でバグを生まないための「設計の鉄則」

このコードを実務で運用する際、以下の3点に注意せよ。これらを怠ると、複雑な図面で必ず「Ghost Connection(存在しないはずの接続)」に悩まされる。

1. 接続の「動的更新」を待て

Visioのオブジェクトモデルは、描画更新(Recalc)のタイミングとVBAの実行順序が非同期になることがある。複雑な自動接続処理の直後に解析を行う場合は、`Application.ActiveWindow.DeselectAll` や `DoEvents` を挟み、計算モデルを同期させる必要がある。

2. 「グループ化」されたシェイプの落とし穴

`GluedShapes`は、グループ化された親シェイプに対して実行しても、中の子シェイプの接続までは自動で辿らない。再帰的に走査するか、グループを解除せずに接続点を持つシェイプを特定する「識別子(User-Defined Cells)」を付与しておく設計を強く推奨する。

3. DB連携時の注意:IDの永続性

Visioの `Shape.ID` は、ページのコピーや削除によって変動する可能性がある。外部データベース(SQL ServerやCSV)と同期させるなら、`ID` ではなく `UniqueID` プロパティ(GUID)をキーとして使用せよ。

‘ データベース連携用のキー取得
Dim guid As String
guid = shp.UniqueID(visGetOrMakeGUID)

チーフアーキテクトからの提言

多くの中級者は、コードの「書き方」に執着する。しかし、真のプロフェッショナルは「Visioの計算モデル」を制御する。

`GluedShapes`を使って何を実現したいのか?単なる一覧作成か、それとも自動ルーティングか。目的が前者なら上記のコードで十分だが、後者であれば、接続点の「GlueType」まで考慮した設計が必要だ。

「動くコード」を作るのはスタートラインに過ぎない。 「保守しやすく、かつVisioの気まぐれな描画更新にも耐えうる堅牢なロジック」を積み重ねてこそ、君は真の自動化エンジニアと呼べる。

次は、`Glue`オブジェクトを直接操作し、プログラムから接続を強制的に生成・切断する領域へ踏み込んでみよう。その時、君の自動化ツールは「単なる作業補助」から「設計を制御するエンジン」へと進化するはずだ。

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