【入門編】Shape.Typeプロパティによる図形判定:グループ・コネクタ・ガイド線をVBAで安全にフィルタリング – Visio VBA解析バイブル

スポンサーリンク

こんにちは!Visio VBAの世界へようこそ。
マクロの記録ボタンを押して「動いたはいいけれど、中身が呪文のようで手直しできない……」そんなもどかしさを感じていませんか?

今回は、Visio VBAの基礎でありながら、実務の現場で絶対に避けて通れない「図形のフィルタリング(見極め)」について、プロの視点から徹底的に解説します。ここをクリアすれば、あなたの書くマクロは「おもちゃ」から「実用的な自動化ツール」へと劇的に進化しますよ。

なぜ `Shape.Type` による判定が必要なのか?

Visioの図面(Page)の中には、私たちが普段マウスで描く四角形や丸だけでなく、さまざまな「裏方のオブジェクト」が混ざっています。

  • グループ化された図形(親のなかに子が隠れている)
  • コネクタ(図形同士を繋ぐ線。これ自体を動かすとレイアウトが崩壊する)
  • ガイド線(印刷されない位置合わせ用の線)

もし、ページ内の全シェイプに対して「無条件で色を赤に変える」なんていうループ処理を書いたらどうなるでしょう?
ガイド線の色が変わってしまったり、グループの構造が破壊されてエラー吐き出したり、コネクタが変な方向にぶっ飛んだり……現場は大パニックです。

だからこそ、「今触ろうとしているシェイプは何者なのか?」を `Shape.Type` プロパティで事前に見極める(フィルタリングする)必要があるのです。

Visioが持つ主な図形タイプ(Type)の正体

`Shape.Type` プロパティを取得すると、その図形が何であるかに応じて特定の数値(定数)が返ってきます。代表的なものを押さえておきましょう。

| 定数名 | 値 | 意味・解説 |
| :— | :— | :— |
| visTypeShape | 2 | 通常の図形(マスターからドラッグした図形や、手書きの四角など) |
| visTypeGroup | 1 | グループ化された図形(この中にはさらに子シェイプが存在します) |
| visTypeForeign | 4 | 外部オブジェクト(CAD図面や画像など) |
| visTypeGuide | 6 | ガイド線・ガイドポイント |

※なお、「コネクタ」は `Shape.Type` だけでは判定しにくく、通常は `.Connector` プロパティやマスターシェイプの名前を見て判断することが多いです(後述の実装例を参考にしてください)。

【実践】安全に図形をフィルタリングするVBAコード

それでは、アクティブページの全シェイプを走査し、「通常シェイプだけを処理し、グループやガイド線は安全にスルーする」実用的なコードを見てみましょう。

Sub FilterShapesSample()
Dim shp As Visio.Shape
Dim pg As Visio.Page

‘ 現在のアクティブページを取得
Set pg = ActivePage

‘ ページ上のすべてのシェイプを順番に処理(ループ)
For Each shp in pg.Shapes

‘ — 1. ガイド線は問答無用でスキップ —
If shp.Type = visTypeGuide Then
Debug.Print “ガイド線スキップ: ” & shp.Name
GoTo NextShape
End If

‘ — 2. グループ図形の場合の処理 —
If shp.Type = visTypeGroup Then
Debug.Print “【グループ】を発見しました: ” & shp.Name
‘ ※グループ内の子シェイプを操作したい場合は、ここで再帰処理を書きます
GoTo NextShape
End If

‘ — 3. コネクタ(線)の判定 —
‘ Visioではコネクタは Type が 2 (visTypeShape) のことがあるため、
‘ IsConnector プロパティ等で別途チェックするのが安全です
If shp.OneD Then
Debug.Print “コネクタ(1次元図形)スキップ: ” & shp.Name
GoTo NextShape
End If

‘ — 4. ここに到達したのは「通常の2次元シェイプ」だけ! —
Debug.Print “処理対象シェイプ: ” & shp.Name

‘ 例:通常のシェイプの色を赤に変える
shp.Cells(“FillForegnd”).ResultIU = RGB(255, 0, 0)

NextShape:
Next shp

MsgBox “フィルタリング処理が完了しました!”, vbInformation
End Sub

コードのポイント・先輩からのアドバイス

1. `GoTo NextShape` の活用
条件に合致しない(処理したくない)ものにぶつかったら、さっさと次のループへ飛ばすのがエレガントです。インデントが深くならず、コードが読みやすくなります。
2. `shp.OneD`(1次元図形プロパティ)
Visioにおいて、コネクタや直線は「1次元シェイプ(起点と終点があるもの)」として扱われます。四角形などの「2次元シェイプ」と明確に区別できるため、コネクタ除外の強力な武器になります。

陥りやすい罠:グループの「底なし沼」に注意

もう一つ、チーフアーキテクトとして絶対に伝えておかなければならない罠があります。

それは、「グループの内部にあるシェイプは、通常の `Page.Shapes` ループでは直接捕まえられない」ということです。

もし、グループの中身まで一括で色を変えたい、あるいは処理したい場合は、`shp.Type = visTypeGroup` を検知したときに、その中身(`shp.Shapes`)を掘り下げる「再帰処理(Recursive Function)」というテクニックが必要になります。
まずは今回の基本である「トップレベルのシェイプを安全に弾く」をマスターし、慣れてきたらグループ内部へのアプローチに挑戦してみてください。

まとめ

ここをクリアすれば、Visio VBAの基本はバッチリです!

  • すべてのシェイプを同じように扱ってはいけない。
  • `Shape.Type` や `OneD` を使って、相手の正体を暴いてから触る。
  • グループやガイド線、コネクタは専用のガード文で優しくスルーする。

この「安全第一」の精神を忘れないでいれば、あなたの書くマクロは予期せぬエラーで止まることのない、堅牢で美しい自動化ツールへと生まれ変わります。

現場でのVisio自動化ライフを、心から応援しています!

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