【実務・中級編】シェイプ同士の高度な結合・くり抜き:Shape.Union / Combine / Fragment / IntersectのVBA制御 – Visio VBA解析バイブル

スポンサーリンク

Visio VBA「幾何学演算」の極意:Shape演算を完全掌握し、カスタムシンボルを自動生成する

Visioで図形を並べるだけの自動化で満足していないか?
業務効率化の真髄は、単なる配置ではない。複雑な形状を数学的アプローチで合成し、現場が求める「専用シンボル」をコード一つで生成することにある。

今回は、Visio VBAにおいて最も強力かつ、最もハマりやすい罠である「幾何学ブーリアン演算(Union/Combine/Fragment/Intersect/Subtract)」を完全制圧するための知見を授ける。

1. 幾何学演算の「非破壊的」な理解と落とし穴

`Shape.Union` や `Shape.Subtract` を実行した瞬間、元の図形は消滅し、新しいシェイプへと姿を変える。ここで初心者が陥るのが、「演算後のシェイプへの参照が切れる」という問題だ。

堅牢な設計の鉄則

1. Selectionの管理を徹底する: `ActiveWindow.Selection` に頼るな。演算対象は明示的にオブジェクト変数に格納せよ。
2. 描画の更新を抑制する: `Application.ScreenUpdating = False` は必須。演算は重い。GUIの描画を停止させないと、パフォーマンスはゴミ箱行きだ。
3. 演算後のID再取得: 演算によって生成された新しいシェイプは、元のIDとは別物になる。`Shape.Name` や `Shape.ID` を追跡するロジックを必ず組み込め。

2. 実践:複雑な「カスタム・コネクタ用シンボル」の合成

以下のコードは、長方形から円をくり抜き、特定の機能を持つスロット型シェイプを生成するプロダクションコードだ。

Option Explicit

”’

”’ 複数のシェイプをブーリアン演算で加工するアーキテクチャ
”’

Public Sub GenerateCustomSymbol()
Dim vsoPage As Visio.Page
Dim vsoRect As Visio.Shape
Dim vsoCircle As Visio.Shape
Dim vsoResult As Visio.Shape

Set vsoPage = ActivePage

‘ 描画更新を止めてパフォーマンスを最大化
Application.ScreenUpdating = False

‘ 1. 基本形状の生成
Set vsoRect = vsoPage.DrawRectangle(1, 1, 3, 2)
Set vsoCircle = vsoPage.DrawOval(2, 1.5, 2.5, 2)

‘ 2. 演算実行(Subtract: 長方形から円を引く)
‘ 注意: 演算対象はSelectionオブジェクトに入れて実行するのがVisioの作法
Dim vsoSelection As Visio.Selection
Set vsoSelection = vsoPage.CreateSelection(visSelTypeEmpty)
vsoSelection.Select vsoRect, visSelect
vsoSelection.Select vsoCircle, visSelect

‘ 演算実行 (Subtract)
‘ 演算後、vsoRectは破棄されるため、戻り値を受け取る必要がある
Set vsoResult = vsoSelection.Subtract

‘ 3. 後処理:プロパティの付与
vsoResult.Name = “Custom_Slot_Component”
vsoResult.Cells(“FillForegnd”).Formula = “RGB(200,200,200)”

Application.ScreenUpdating = True

Debug.Print “生成されたシェイプID: ” & vsoResult.ID
End Sub

3. なぜ「Fragment(断片化)」が最強のツールなのか

実務で最も多用すべきは `Fragment` だ。
複数の図形が交差するエリアを個別のシェイプに分解するこの機能を使えば、「複雑なレイアウトの境界線」を自動的に計算できる。

  • 活用例: データベースから取得した「エリア情報」の座標群をシェイプとして配置し、`Fragment` で切り分けることで、自動的に部屋の区画(ポリゴン)を生成できる。
  • 注意点: `Fragment` を実行すると、重なった図形が「バラバラの閉じたパス」に分解される。分解後の `Group` 化や、特定の名称を持ったシェイプの再特定といった「後処理ルーチン」をクラスモジュール化しておくことが、保守性を担保する唯一の道だ。

4. プロダクション環境におけるDB連携の極意

データベース(ExcelマスタやSQL Server)から図形を生成する場合、「演算結果の検証」を忘れてはならない。

1. ゼロ除算/空の集合を回避せよ: 演算対象が重なっていない状態で `Intersect` を呼ぶと、Visioは無情にもエラーを吐く。`Shape.GeometryCount` や領域の重なり判定を事前に行うガード節を必ず設けること。
2. Undoスタックの肥大化を防ぐ: 大量生産する場合、処理の区切りで `Application.UndoScopeID` を使用し、一つ一つの演算をヒストリーに乗せない工夫が必要だ。さもなくば、ユーザーが「Ctrl+Z」を押した瞬間にVisioはクラッシュする。

最後に:エンジニアとしての矜持

VisioのVBAは、単なる事務作業の自動化ツールではない。
「図形というオブジェクトを数学的に操作する強力なAPI」である。

今回紹介したブーリアン演算を理解すれば、手作業で数時間かかる図面修正を、わずか数秒のスクリプトで完了させることができる。コードを書くときは、常に「このプロセスを1万回繰り返してもメモリリークやID競合が起きないか」を自問自答せよ。

それが、伝説的な自動化エンジニアへの唯一の道だ。健闘を祈る。

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