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のデータを読み込み、その値に基づいて図形を自動合成する。
- テンプレート生成: 毎日使う複雑な帳票の雛形を、一瞬で生成する。
最初はコードが動くだけで感動するはずです。その感覚を大切にしてください。それが、複雑な業務を自動化するエンジニアへの第一歩です。
何か分からないことがあれば、またいつでも聞きに来てください。あなたの自動化の旅を、全力でサポートしますよ。
