こんにちは!Visioでの自動化、楽しんでいますか?
「マクロの記録」ボタンを押して図形を描画させてみたものの、そこから先、自分オリジナルのロジックを組もうとして「オブジェクトモデルの壁」にぶつかっていませんか?
今回は、大規模なネットワーク図やプラントの配管図を描いていると、いつの間にか発生してしまう「どのコネクタも接続されていない、ぽつんと取り残された孤立シェイプ(野良シェイプ)」をVBAで綺麗に検出・一掃する実用的なテクニックを解説します。
ここをクリアすれば、単なるお絵描きツールとしてのVisioから脱却し、「図面のデータ整合性を自動担保するシステム」へと昇華させることができます。優しく、そして本質的な知見を込めてお伝えしますので、一緒にマスターしていきましょう!
—
1. なぜ「野良シェイプ」が生まれるのか?
Visioで図面を描いていると、こんな状況がよく起きます。
- コピー&ペーストしたはいいが、接続を忘れた。
- 既存の図形を削除した際、そこに繋がっていたコネクタや末端の図形だけが残ってしまった。
人間が目視でこれらを探すのは、広大な砂漠で針を探すようなものです。特に数百個の図形が入り乱れる配管図や業務フロー図では、致命的な「見落とし」に繋がります。
これをVBAの力で、一瞬のうちに特定してみせましょう。
—
2. Visioオブジェクトモデルの核心:コネクタをどう判定するか?
Visio VBAで図形(Shape)を扱う際、最も重要なのは「Application > Document > Page > Shape」という階層構造です。
そして、今回最も重要な鍵となるのが、各Shapeオブジェクトが持つ「ConnectedShapesメソッド」(またはGlueInfoプロパティなど)です。Visioにおいて、図形と図形を繋ぐ「コネクタ」の存在を検知するには、この接続関係を辿るのが最も確実です。
しかし、もっとシンプルで確実な判定方法があります。
それは、「その図形に、何本のコネクタ(あるいは接続点)が結合しているか?」を調べることです。
Visioの `Shape.ConnectedShapes` メソッドを使えば、指定した図形に接続されている他の図形やコネクタのIDを配列として一発で取得できます。
—
3. 実装コード:孤立シェイプ検出&クリーンアップマクロ
以下のコードをVBAエディタ(Alt + F11)の標準モジュールに貼り付けて実行してみてください。
現在のページ(ActivePage)を総当たりでスキャンし、接続数が「0」の不審なシェイプを特定・ログ出力、さらにオプションで一括削除します。
Option Explicit
Public Sub CleanUpOrphanShapes()
‘ =========================================================================
‘ 処理概要: アクティブページ内を走査し、どのコネクタとも接続されていない
‘ 孤立した「野良シェイプ」を検出し、イミディエイトウィンドウに報告。
‘ (オプションで一括削除も可能)
‘ =========================================================================
Dim shp As Visio.Shape
Dim targetPage As Visio.Page
Dim connectedCount As Long
Dim orphanCount As Long
Dim targetIDs() As Long
‘ 処理対象のページをアクティブページに設定
Set targetPage = ActivePage
orphanCount = 0
‘ 画面描画を停止してマクロの実行速度を爆発的に上げる(お作法です)
Application.ScreenUpdating = False
Debug.Print “=== 孤立シェイプ(野良シェイプ)の検出スキャン開始 ===”
‘ ページ上のすべてのシェイプをループ処理
For Each shp in targetPage.Shapes
‘ 【重要】ガイド線やグループ自体のコンテナなどは判定から除外するアプローチも必要ですが、
‘ 今回はシンプルに「通常シェイプ」を対象とします。
‘ ※ガイド線(VisTypeGuide)などはスキップ判定を入れるとより実用的になります。
If shp.Type <> visTypeGuide Then
On Error Resume Next
‘ 接続されているシェイプのID配列を取得
‘ visConnectedShapesAllLinks: 入出力問わず、すべてのリンクを対象とする
targetIDs = shp.ConnectedShapes(visConnectedShapesAllLinks, “”)
If Err.Number <> 0 Then
‘ 接続情報が取得できない(そもそもコネクタの概念がない等)場合のハンドリング
connectedCount = 0
Err.Clear
Else
‘ 取得できた配列のサイズ(上界)から接続数を割り出す
‘ 配列が空の場合は -1 が返るため、安全に判定
connectedCount = UBound(targetIDs) – LBound(targetIDs) + 1
End If
On Error GoTo 0
‘ 接続数が 0 の場合、それは「孤立シェイプ」と判定
If connectedCount = 0 Then
orphanCount = orphanCount + 1
‘ ログに出力 (図形名とIDを表示)
Debug.Print ” [孤立検出] ID: ” & shp.ID & ” / 名称: ” & shp.Name & ” / テキスト: ” & Left(shp.Text, 20)
‘ — 【危険】もし自動削除まで行いたい場合は、以下のコメントアウトを外してください —
‘ shp.Delete
‘ ———————————————————————————
End If
End If
Next shp
‘ 描画を再開
Application.ScreenUpdating = True
Debug.Print “=== スキャン終了 ===”
Debug.Print “検出された孤立シェイプ総数: ” & orphanCount & ” 個”
If orphanCount > 0 Then
MsgBox “孤立シェイプの検出が完了しました。” & vbCrLf & _
“イミディエイトウィンドウを確認してください。”, vbInformation, “完了”
Else
MsgBox “素晴らしい!野良シェイプは1つもありませんでした。”, vbInformation, “完了”
End If
End Sub
—
4. コードの深掘り解説:ここがプロの技
初心者の方が「おっ」と思うポイントや、現場で役立つテクニックをいくつか解説します。
① `Application.ScreenUpdating = False` の魔法
Visioは、VBAからシェイプを1つずつ操作・走査するたびに画面の再描画を行おうとします。これがマクロを劇的に遅くする原因です。処理の最初に `False` にし、最後に `True` に戻す。これはVisio VBAにおける絶対の鉄則(パフォーマンス・ハック)です。
② `ConnectedShapes` メソッドの使い所
`shp.ConnectedShapes` は、指定した図形に物理的・論理的に接続されている他の図形群のIDを配列で返してくれます。
第1引数に `visConnectedShapesAllLinks` を指定することで、入り口(始点)であれ出口(終点)であれ、何かしらの配管や線が刺さっているかどうかを全方位からチェックできます。
③ エラーハンドリングの優しさ
Visioの図形の中には、テキストボックスや特殊な付箋など、接続関係という概念を持たないものが存在します。そういったオブジェクトに対して `ConnectedShapes` を実行すると、容赦なく実行時エラー(エラー番号が返る)が発生します。
そのため、`On Error Resume Next` でガードしつつ、エラーが起きた場合は「接続数=0(孤立扱い)」として安全に処理を継続する、いわゆる「防御的プログラミング」を取り入れています。
—
5. 陥りやすいエラーと注意点
現場でこのコードを運用する際、以下の罠に気をつけてください。
- 「1文字も書いていないコネクタ自体」も孤立判定される?
上記のコードでは `shp.Type <> visTypeGuide` でガイド線を除外していますが、もし図面内に「宙ぶらりんになったコネクタ線(線単体)」が存在する場合、そのコネクタ自体も `ConnectedShapes` が 0 になり、検出対象になることがあります。
完全に「四角や丸などのノード図形」だけを対象にしたい場合は、`shp.Master.Name` やシェイプのマスター図形を条件に絞り込むと、さらに精度が上がります。
- 削除処理(`shp.Delete`)は慎重に
コメントアウトしていますが、いきなり `shp.Delete` を有効にして実行すると、必要な図形まで消し去ってしまうリスクがあります。最初は必ず「イミディエイトウィンドウへのログ出力(目視確認)」からスタートし、ロジックの確実性を担保してから削除処理を組み込んでください。
—
まとめ
いかがでしたでしょうか?
Visio VBAのオブジェクトモデルを少し理解し、`ConnectedShapes` のような強力なメソッドを使いこなせるようになると、Visioは単なる「お絵描きソフト」から「リレーショナルな構造を持つデータベース」へと見えてきます。
「ここをクリアすれば、Visio VBAの基本はバッチリですよ!」
ぜひ、ご自身の業務図面やネットワーク図で試して、その圧倒的な効率化を体感してください。エンジニアとしての自動化のロマンが、ここから始まります。
