【実務・中級編】Shape.OneD/TwoDプロパティでの厳密な図形判定:コネクタと通常シェイプを安全に区別して処理するロジックの実装 – Visio VBA解析バイブル

スポンサーリンク

Visio VBAの深淵:Shape.OneD判定による「コネクタと図形の完全分離」戦略

Visioで自動化ツールを組む際、多くの初学者が陥る罠がある。それは「図形の種類を名前やレイヤーで判定しようとする」ことだ。`If shp.Name = “コネクタ” Then` といったロジックは、ユーザーが図形をコピー&ペーストして名前が変わった瞬間に崩壊する。

プロのアーキテクトであれば、Visioのオブジェクトモデルの「骨格」に直接触れるべきだ。今回は、Visioの全シェイプを支配する根源的なプロパティ、`Shape.OneD` を用いた堅牢な判別ロジックを伝授する。

1. なぜ「名前」ではなく「OneD」なのか

Visioのシェイプには、その設計思想の根底に「1次元シェイプ(OneD)」と「2次元シェイプ(TwoD)」という二元論が存在する。

  • 1Dシェイプ (OneD = True): コネクタ、線、矢印など。始点と終点を持ち、パスとして定義される。
  • 2Dシェイプ (OneD = False): 四角形、円、アイコン、コンテナなど。幅と高さ(Width/Height)を持ち、領域を占有する。

この判定は、Visioのレンダリングエンジンに近いプロパティであるため、ユーザーがいくら図形を加工しても、その本質的な挙動(パスで繋ぐか、領域を占有するか)が変わらない限り、判定が狂うことはない。これが「堅牢性」の正体だ。

2. 実装:堅牢なシェイプ分類関数

現場で即戦力となる、再利用可能な関数を作成した。単に判定するだけでなく、処理対象を柔軟に切り替えられる設計にしている。

‘ —————————————————————————
‘ 関数名: IsConnector
‘ 概要: Shapeオブジェクトが1D(コネクタ等)かどうかを厳密に判定する
‘ 引数: shp – 判定対象のShapeオブジェクト
‘ 戻り値: True: 1Dシェイプ, False: 2Dシェイプ
‘ —————————————————————————
Public Function IsConnector(ByVal shp As Visio.Shape) As Boolean
‘ セーフガード: オブジェクトがNothingの場合のハンドリング
If shp Is Nothing Then
IsConnector = False
Exit Function
End If

‘ OneDプロパティは0または1(True)を返す
‘ 厳密なBoolean判定を行う
If shp.OneD Then
IsConnector = True
Else
IsConnector = False
End If
End Function

‘ —————————————————————————
‘ 使用例: ページ内のコネクタのみを抽出して処理する
‘ —————————————————————————
Public Sub ProcessConnectorsOnly()
Dim pg As Visio.Page
Dim shp As Visio.Shape

Set pg = ActivePage

For Each shp In pg.Shapes
If IsConnector(shp) Then
‘ ここにコネクタに対する処理を記述(例: 色の変更、メタデータ付与)
Debug.Print “コネクタを検知しました: ” & shp.Name
Else
‘ ここに2D図形に対する処理を記述
End If
Next shp
End Sub

3. 実務で勝つための「3つの極意」

このコードをプロダクションレベルで運用するための、エンジニアとしての知見を共有する。

① グループ化の罠を回避せよ

グループ化された図形(`Group`)は、たとえその中にコネクタが含まれていても、親要素としては「2Dシェイプ」として振る舞うことが多い。もしグループ内のコネクタを操作したい場合は、`shp.Shapes.Count > 0` で再帰的に走査するロジックを必ず組み込むこと。これを怠ると、巨大なシステム構成図で漏れが発生する。

② セル値(Cell)との組み合わせ

コネクタか否かの判定に加え、特定のコネクタを特定したい場合は、`shp.CellExists(“BeginX”, 0)` を併用せよ。1Dシェイプであっても、Visioの特定のマスターシェイプから作成されたものか、あるいは特定の接続関係にあるかを判断する際、この「セルの存在確認」は強力なフィルタになる。

③ データベース連携時のID利用

もしVisio図面と外部DB(ExcelやSQL Server)を連携させるなら、`shp.UniqueID`(`visGetOrMakeGUID`)を使用すること。`shp.Name` は前述の通り不安定だ。`UniqueID` をキーにすれば、図形を移動させようが回転させようが、データベースとVisioの整合性を物理的に保証できる。

終わりに:自動化は「構造」から理解する

多くのエンジニアがVisioのUI上の見栄えに惑わされ、非効率なコードを量産している。しかし、Visioの真の強みは、その背後にある「強固な数学的モデル(OneD/TwoD/Cells/Layers)」にある。

今回紹介した `OneD` による判定は、その基礎の基礎だが、最も破壊力のある「揺るがないロジック」だ。これをマスターすれば、どんなに複雑な図面であろうと、正確にコントロールできる。

君たちの自動化ツールが、現場の泥臭い作業を撲滅する強力な武器になることを期待している。次回のアーキテクチャ解説にも期待してくれ。

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