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`を武器に、ぜひ明日からの業務をスマートに変えていってください。
何か分からないことがあれば、またいつでも聞きに来てくださいね。皆さんの挑戦を、私はいつでも応援しています。
