【入門編】Shape.Is1Dプロパティを活用した図形分類の自動化:コネクタと通常シェイプを完全に判別するアルゴリズム – Visio VBA解析バイブル

スポンサーリンク

Visio VBAの深淵へ:Shape.Is1Dで「コネクタ」と「図形」を完全制圧する

こんにちは。自動化の荒波を越えてきた皆さんに、今日はVisio VBAの「本質」をお伝えします。

多くの人がVisioマクロを書き始めると、必ず一度は壁にぶつかります。「コネクタ(線)と、箱やアイコン(図形)をどうやってコード上で区別すればいいのか?」という問題です。

マクロの記録をポチポチ押すだけなら気になりませんが、実務で数千の図形を扱う際、これを曖昧にするとコードは地獄のようなスパゲッティ状態になります。今日は、`Shape.Is1D`プロパティという強力な武器を使い、図形を「1次元(線)」と「2次元(面)」に厳密に振り分ける、プロのアルゴリズムを授けましょう。

1. なぜ「Shape.Is1D」が最強なのか

Visioのオブジェクトモデルにおいて、全てのパーツは`Shape`オブジェクトとして扱われます。しかし、心の中では全く別物です。

  • 1Dシェイプ(コネクタなど): 始点と終点を持つ「線」。座標計算には始点・終点の位置が必要。
  • 2Dシェイプ(四角形、アイコンなど): 幅と高さを持つ「面」。座標計算には中心点(PinX/PinY)が必要。

この性質を無視して、2D図形に対してコネクタ用の処理(例:始点座標の取得)を行うと、VBAは無慈悲なエラーを吐き出します。`Shape.Is1D`は、この「生物学的な種の違い」を瞬時に判定してくれる、まさに開発者のための羅針盤なのです。

2. 実践:コネクタと通常シェイプを自動判別するアルゴリズム

以下のコードは、アクティブなページ内の全シェイプを巡回し、その特性に応じて処理を分岐させるテンプレートです。ここをマスターすれば、どんな複雑な図面整理も自動化の対象になります。

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

Set pg = ActivePage

‘ ページ内の全シェイプを高速にループ処理
For Each shp In pg.Shapes
‘ 【核心】Is1Dプロパティで判定
‘ Trueならコネクタ(1次元)、Falseなら通常の図形(2次元)
If shp.OneD Then ‘ .Is1D と同義
‘ — 1Dシェイプ用の処理 —
Debug.Print “コネクタを発見: ” & shp.Name
‘ ここで始点(BeginX)や終点(EndX)を操作するロジックを記述

Else
‘ — 2Dシェイプ用の処理 —
Debug.Print “2D図形を発見: ” & shp.Name
‘ ここで幅(Width)や高さ(Height)を操作するロジックを記述

End If
Next shp

MsgBox “全シェイプの分類と処理が完了しました。”, vbInformation
End Sub

コードのここがポイント

  • `shp.OneD`: `Shape.Is1D`と同じ意味です。VBAでは`OneD`と書くのが一般的ですね。このプロパティが`True`を返すか`False`を返すかで、そのシェイプの「骨格」が決まります。
  • 処理の分離: 判定後の`If…Else`ブロックの中に、それぞれの図形が持つべき属性(1Dなら端点、2Dなら中心点)に応じた処理を書くことで、エラーの発生率を限りなくゼロに近づけられます。

3. 陥りやすい罠と解決策

初心者の頃は、つい以下のようなミスをしてしまいがちです。

罠1:「グループ化」されたシェイプの扱い

グループ化された図形も一つの`Shape`として扱われます。グループが1D属性を持つことは稀ですが、複雑な図面では予期せぬ挙動をすることがあります。
対策: `If shp.Type = visTypeGroup` でグループかどうかを先にチェックする癖をつけると、より堅牢なコードになります。

罠2:レイヤーによる非表示シェイプ

見えていないだけで、図面には多くの「隠れたシェイプ」が存在します。
対策: 処理対象が意図した図形だけであることを確認するため、`If shp.Visible = True` という条件を加えるのが現場の鉄則です。

最後に:自動化の先にある景色

「コネクタを判別する」という小さな一歩ですが、これはVisioという複雑な空間をプログラムで制御するための「基礎体力」です。

ここをクリアできれば、次は「特定のコネクタを自動的に接続し直す」「2D図形をグリッド状に整列させる」といった、より高度な自動化へ進むことができます。

Visio VBAは、一度仕組みを理解してしまえば、皆さんの事務作業を劇的に減らす忠実な相棒になります。今日学んだ`Is1D`を武器に、ぜひ明日からの業務をスマートに変えていってください。

何か分からないことがあれば、またいつでも聞きに来てくださいね。皆さんの挑戦を、私はいつでも応援しています。

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