【実務・中級編】マウス操作はもう不要:VBAでコネクタ(線)を生成し2つの図形間を自動ルーティングする – Visio VBA解析バイブル

スポンサーリンク

マウス操作はもう不要:VBAでコネクタを完全掌握し、配線図作成を自動化する極意

システム構成図、ネットワーク図、あるいは複雑な業務フローチャート。
Visioで最もフラストレーションが溜まる作業は何だと思うか? そう、「図形と図形をコネクタで正確に繋ぎ、きれいにルーティングする作業」だ。

マウスでコネクタの端点を引っ張り、接続ポイント(グルーポイント)にスナップさせようとしては外れ、線が重なり、レイアウトを変えるたびに配線がグチャグチャになる。この不毛な手作業に、エンジニアの大切な時間をドブに捨てさせてはならない。

今回は、Visio VBAを用いてマスターシェイプに依存せずコード上でスマートにコネクタを生成し、2つの図形間を完璧に自動ルーティングする実践手法を伝授する。

実務でそのまま使える、堅牢で保守性の高いプロダクションコードを用意した。早速、泥臭い手作業から卒業しよう。

1. Visioコネクタ自動化の核心:なぜ「グルー(接着)」で躓くのか

VBAでコネクタを扱う際、多くの初心者が陥る罠がある。それは「線を引いてから端点を図形に合わせようとする」アプローチだ。これでは座標計算が狂い、正しく図形に追従しない「浮いた線(デッドリンク)」が量産される。

Visioのオブジェクトモデルにおいて、堅牢な配線を実現するための鉄則は以下の3つだ。

1. マスターシェイプは不要
`ActiveDocument.Pages(1).Drop` のような方法でステンシルからコネクタを取る必要はない。`Page.DrawLine` や動的なコネクタ生成メソッドを使う必要もなく、もっとスマートな方法がある。実は、ページに対して `Drop` メソッドで「ダイナミックコネクタ(Dynamic Connector)」のマスターを配置するのが最も手堅い。
2. Cellオブジェクトによる厳密な「グルー(糊付け)」
コネクタの始点(BeginX / BeginY)と終点(EndX / EndY)を、対象図形のピンや接続ポイントのセルに対して `.GlueTo` メソッドで完全に接着(Glued)させる。
3. ルーティングスタイル(RouteStyle)の制御
配線がどのように曲がるかをコードで強制指定する。直交配線、直線、曲線など、図面の種類に応じたスタイルをプログラム側で統御する。

2. プロダクションコード:2つの図形を自動接続するプロシージャ

以下のコードは、指定した2つの図形(ShapeIDまたは名前で特定)の間をダイナミックコネクタで結び、自動ルーティングさせる実用的なモジュールだ。

エラーハンドリングを完備し、実務のデータベース連携や自動生成ツールの一部としてもそのまま組み込める設計にしている。

Option Explicit

‘ ==============================================================================
‘ 処理名: ConnectTwoShapes
‘ 概要 : 指定した2つの図形間にダイナミックコネクタを生成し、自動ルーティングで接続する
‘ 引数 : targetPage – 対象のPageオブジェクト
‘ fromShape – 接続元のShapeオブジェクト
‘ toShape – 接続先のShapeオブジェクト
‘ 戻り値: 生成されたコネクタのShapeオブジェクト
‘ ==============================================================================
Public Function ConnectTwoShapes(ByRef targetPage As Visio.Page, _
ByRef fromShape As Visio.Shape, _
ByRef toShape As Visio.Shape) As Visio.Shape

Dim vsoConnector As Visio.Shape
Dim vsoMaster As Visio.Master
On Error GoTo ErrorHandler

‘ 1. ドキュメントから「ダイナミック コネクタ」のマスターを取得する
‘ ※ Visioの組み込みステンシル(Basic 4.vss等)からマスターを探す
Set vsoMaster = GetDynamicConnectorMaster()
If vsoMaster Is Nothing Then
Err.Raise 9999, “ConnectTwoShapes”, “ダイナミックコネクタのマスターが見つかりません。”
End If

‘ 2. ページ上にコネクタをドロップして生成
Set vsoConnector = targetPage.Drop(vsoMaster, 0, 0)

‘ 3. 始点(BeginX)を元図形の中心、またはピンにグルー(接着)する
‘ GlueTo:対象のCellオブジェクトに対して接続を行う
vsoConnector.CellsSRC(visSectionObject, visRowXForm1D, vis1DBeginX).GlueTo _
fromShape.CellsU(“PinX”)

‘ 4. 終点(EndX)を先図形のピンにグルーする
vsoConnector.CellsSRC(visSectionObject, visRowXForm1D, vis1DEndX).GlueTo _
toShape.CellsU(“PinX”)

‘ 5. ルーティングスタイルを最適化(例: 直角ルーティング = visSLORouteRightAngle)
vsoConnector.CellsU(“RouteStyle”).FormulaU = visSLORouteRightAngle

‘ 正常終了時の戻り値設定
Set ConnectTwoShapes = vsoConnector
Exit Function

ErrorHandler:
‘ 現場で原因特定を容易にするためのエラーログ出力(必要に応じてDebug.Printや独自ログへ)
Debug.Print “Error [” & Err.Number & “]: ” & Err.Description
Set ConnectTwoShapes = Nothing
End Function

‘ ==============================================================================
‘ 内部関数: ドキュメント内からダイナミックコネクタのマスターを安全に取得する
‘ ==============================================================================
Private Function GetDynamicConnectorMaster() As Visio.Master
Dim mast As Visio.Master

‘ 開発者なら知っている:ビルトインのダイナミックコネクタはドキュメントのMastersから取得可能
On Error Resume Next
Set GetDynamicConnectorMaster = ActiveDocument.Masters.ItemU(“ダイナミック コネクタ”)
If GetDynamicConnectorMaster Is Nothing Then
‘ 英語環境へのフォールバック
Set GetDynamicConnectorMaster = ActiveDocument.Masters.ItemU(“Dynamic connector”)
End If
On Error GoTo 0

‘ もしドキュメントに含まれていない場合はステンシルを開いて取得する等のフォールバックを入れると完璧だが、
‘ 通常はVisioのデフォルトドキュメントには標準搭載されている。
End Function

3. 実務で活きる!データベースやExcel連携への応用設計

このコード単体を単発で動かして満足してはプロのエンジニアとは言えない。実務では、「Excelのマスター定義書」や「外部DBのノード・エッジ情報(RDBのテーブル定義など)」を読み込んで、数千個の図形と配線をワンクリックで構築するような一括処理(バッチ処理)に組み込むことになる。

ここで、大規模データを扱う際の3つの極意を授けよう。

① 画面描画の抑制(ScreenUpdating)で爆速化を図る

VBAで数100個の図形とコネクタを動かす際、画面を描画し続けると処理が異常に遅くなり、Visioがフリーズしたような挙動を見せる。
プロシージャの最初と最後で以下を挟むのは鉄則だ。

Application.ScreenUpdating = False
‘ — 処理本体 —
Application.ScreenUpdating = True

これだけで処理速度が文字通り「桁違い(10倍以上)」になる。

② イベントの無効化で予期せぬトリガーを防ぐ

コネクタのグルー時に `ShapeAdded` などのイベントが走る設計にしている場合、意図しない無限ループやパフォーマンス低下を招く。
`Application.EventEnabled = False` を活用し、バックグラウンドで静かに、かつ確実にインフラを構築させること。

③ 接続ポイント(Glue)の厳密な指定

上記のサンプルコードでは図形の中心(`PinX` / `PinY`)に接続しているが、実務のフロー図やネットワーク図では「上から入って下へ抜ける」「特定のコネクションポイント番号(Connection Point)に挿す」という要件が多い。

その場合は、`PinX` の代わりに以下のように特定の接続ポイントセルを指定して `.GlueTo` を実行する。

‘ 例: 図形のコネクションポイントの行(Row_1)に正確にグルーする
vsoConnector.CellsSRC(visSectionObject, visRowXForm1D, vis1DBeginX).GlueTo _
fromShape.CellsSRC(visSectionConnection, 0, visCllX)

この粒度までコードをコントロールできれば、どんなに複雑怪奇なシステム構成図であっても、ロジック一つで美しく自動生成することが可能になる。

4. チーフアーキテクトからのメッセージ

「VBAはレガシーだ」と言う者もいる。しかし、Microsoft Officeエコシステムにおいて、Visioのオブジェクトモデルをダイレクトに叩き、ローカル環境でミリ秒単位の図面自動化を完結させられるVBAの機動力は、いまだに代替不可能な武器である。

マウスを握って線を引く作業は、今日で終わりにしよう。
あなたが書いた数行のコードが、何百時間もの手作業とヒューマンエラーを消し去る。これこそが、エンジニアが手に入れるべき本当の自動化の快感だ。

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