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

スポンサーリンク

Visio VBAの真髄:ブーリアン演算で「図形の神」になる

こんにちは。業務自動化の現場でVisioと格闘し続けてきたアーキテクトです。

Visioで「マクロの記録」ボタンを押した瞬間、失望したことはありませんか? 複雑な図形操作を行っても、記録されるのは単なる「選択」や「移動」ばかり。Visioの真の力である「幾何学ブーリアン演算(Union, Combine, Fragment, Intersect)」は、記録ボタンの向こう側に隠されています。

今回は、手作業では数分かかる複雑なカスタムシンボルの合成を、わずか数行のVBAで一瞬にして完了させる、職人技の扉を開きましょう。

1. Visioのブーリアン演算とは何か?

Visioの「開発」タブにある[操作]メニューの裏側には、強力な幾何学エンジンが鎮座しています。これをVBAから操るのが `Shape.ShapesAddOn` 系のメソッドです。

まずは、4つの基本操作を脳に焼き付けてください。

  • Union (結合): 複数の図形を一つに統合します。境界線は消えます。
  • Combine (結合/抜き): 重なった部分を「穴」として抜き取ります。
  • Fragment (断片化): 重なった部分をすべて切り分け、独立した図形にします。
  • Intersect (交差): 重なった部分だけを残します。

2. 現場で使える「実戦コード」

まずは、2つの図形(円と四角)を合成して、新しいカスタムシンボルを作るコードを見てみましょう。

実践:図形を合体させる(Union)

Sub CreateCustomSymbol()
Dim vsoPage As Visio.Page
Dim shp1 As Visio.Shape, shp2 As Visio.Shape
Dim shpResult As Visio.Shape

Set vsoPage = ActivePage

‘ 1. 基本図形を描画 (円と四角)
Set shp1 = vsoPage.DrawOval(1, 1, 3, 3)
Set shp2 = vsoPage.DrawRectangle(2, 2, 4, 4)

‘ 2. 複数のシェイプを選択状態にする(演算の準備)
ActiveWindow.DeselectAll
ActiveWindow.Select shp1, visSelect
ActiveWindow.Select shp2, visSelect

‘ 3. Union実行 (戻り値として新しいシェイプが返る)
‘ 演算後のシェイプは「元の図形を削除して生成」される点に注意
Set shpResult = ActiveWindow.Selection.Union

‘ 4. 生成されたシェイプにスタイルを適用
shpResult.Cells(“FillForegnd”).Formula = “RGB(255,0,0)”

MsgBox “カスタムシンボルが完成しました!”
End Sub

3. なぜエラーが出るのか?「陥りやすい落とし穴」

初学者が必ず突き当たる壁が2つあります。ここをクリアすれば、あなたはもう中級者の入り口に立っています。

① 「選択」の概念を理解する

Visioのブーリアンメソッド(`Union`など)は、`Selection`オブジェクトに対して実行されます。
コードの中で `ActiveWindow.Select` を使わずに実行しようとすると、「そんなメソッドはない」というエラーが出ます。操作したい図形を必ず `Selection` に入れる、これが鉄則です。

② 元の図形は「消滅」する

`shp1.Union(shp2)` のように書いて成功したと思っても、元の `shp1` や `shp2` は演算後に消滅しています。コード内で `shp1.Name` などにアクセスしようとすると、「オブジェクトが存在しません」と怒られます。
「演算した瞬間に、古い変数(参照)はゴミ箱行き」。これこそが、Visioのオブジェクトライフサイクルにおける最大の注意点です。

4. プロの現場で差がつく「Fragment」の活用

私が現場で最も多用するのが `Fragment` です。これは、「複雑な形状をバラバラのピースに分解する」ときに最強の威力を発揮します。

例えば、地図のエリア分けや、配管の交差部分の切り出しなど、手作業では気が遠くなるような作業も、Fragmentを使えば一撃です。

‘ 選択した全ての図形を切り刻む
Sub SliceShapes()
If ActiveWindow.Selection.Count < 2 Then MsgBox "2つ以上の図形を選択してください" Exit Sub End If ' 選択範囲をバラバラにする ActiveWindow.Selection.Fragment ' これだけで、重なり合った箇所が独立したシェイプになります End Sub ---

最後に:自動化の先にある世界

Visio VBAで図形を合成できるようになると、単なる「作図ツール」だったVisioが、「プログラム可能なデザイン・エンジン」へと変貌します。

  • データ駆動型デザイン: Excelのデータを読み込み、その値に基づいて図形を自動合成する。
  • テンプレート生成: 毎日使う複雑な帳票の雛形を、一瞬で生成する。

最初はコードが動くだけで感動するはずです。その感覚を大切にしてください。それが、複雑な業務を自動化するエンジニアへの第一歩です。

何か分からないことがあれば、またいつでも聞きに来てください。あなたの自動化の旅を、全力でサポートしますよ。

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