Visio VBAを掌握する:Geometryセルの動的制御で「動く図面」を創り出せ
多くのエンジニアがVisioを「単なる描画ツール」だと勘違いしている。しかし、真のアーキテクトにとってVisioは、「ShapeSheetという強力なデータベースを内包した、双方向のグラフィカル・プロセッサ」だ。
今回は、業務自動化の極致である「頂点の動的制御」について語ろう。単に色を変える、値を書き換えるといった表面的な自動化ではない。データの入力に応じて、図形の形状(ジオメトリ)そのものを再構築する。この技術を習得すれば、複雑なネットワーク構成図や工程表を、Excelのデータから一瞬で生成することが可能になる。
—
1. なぜ「Geometryセクション」を直接叩く必要があるのか
初心者は `Shape.Height` や `Shape.Width` を操作して図形を伸縮させようとする。だが、それだけでは「頂点の数」は変わらない。多角形の辺を増やしたり、複雑なポリゴンをデータに基づき生成したりするには、`Geometry` セクションの `Row` を操作するしかない。
Visioの内部構造において、`Geometry` はリスト構造を持っている。ここに `RowAdd` で行を挿入し、`RowDelete` で削除することで、私たちは図形の「骨格」を自由自在に操れるようになる。
堅牢な設計のための鉄則
- 例外処理の徹底: `RowAdd` は失敗する可能性がある。必ず `Err` オブジェクトを監視せよ。
- マジックナンバーの排除: `visRowVertex` などの定数を使用せよ。数値で直接指定するコードは、半年後の自分を地獄へ突き落とすことになる。
- リフレッシュの制御: `Application.ScreenUpdating = False` は必須。描画更新を止めるだけで、処理速度は劇的に向上する。
—
2. 実装コード:動的に多角形を生成するエンジン
以下は、指定した頂点数で正多角形を生成し、既存のジオメトリを動的に書き換えるためのプロダクションコードだ。
Option Explicit
‘ 頂点を動的に制御して多角形を再構築するプロシージャ
Public Sub RebuildShapeGeometry(shp As Visio.Shape, vertexCount As Integer)
Dim geoSection As Visio.Section
Dim rowIdx As Integer
Dim i As Integer
Dim angle As Double
Dim radius As Double: radius = 1.0 ‘ 単位インチ
‘ 描画の高速化
Application.ScreenUpdating = False
On Error GoTo ErrorHandler
‘ Geometry1セクションを取得(なければ作成)
Set geoSection = shp.Section(visSectionFirstComponent)
‘ 既存の頂点をすべてクリア(MoveTo以外を削除)
For i = geoSection.Count – 1 To 1 Step -1
geoSection.DeleteRow i
Next i
‘ 新しい頂点を追加(LineToで構成)
For i = 0 To vertexCount – 1
angle = (2 Application.Pi / vertexCount) i
‘ RowAddで新しい頂点を追加
rowIdx = geoSection.AddRow(visSectionFirstComponent, visRowVertex, visTagLineTo)
‘ 座標をセルに書き込み
shp.CellsSRC(visSectionFirstComponent, rowIdx, visX).ResultIU = radius Cos(angle)
shp.CellsSRC(visSectionFirstComponent, rowIdx, visY).ResultIU = radius Sin(angle)
Next i
‘ 閉じた図形にするために最後にもう一度起点を追加
geoSection.AddRow visSectionFirstComponent, visRowVertex, visTagLineTo
shp.CellsSRC(visSectionFirstComponent, vertexCount, visX).ResultIU = radius Cos(0)
shp.CellsSRC(visSectionFirstComponent, vertexCount, visY).ResultIU = radius Sin(0)
CleanUp:
Application.ScreenUpdating = True
Exit Sub
ErrorHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
Resume CleanUp
End Sub
—
3. 開発現場での注意点:データ連携とパフォーマンス
この技術を実務に落とし込む際、以下の2点に特に注意を払うべきだ。
① データベース(Excel/SQL)との同期
データソースから図形を生成する場合、「IDによる管理」を徹底せよ。Visioの `Shape.ID` は、図形をコピペしたりグループ化を解除したりすると変わってしまう可能性がある。
- 対策: `Shape.UniqueID` メソッドを使用し、外部データベースの主キーとVisioシェイプを永続的に紐付けること。
② 計算コストの最小化
`CellsSRC` へのアクセスは、実は重い処理だ。ループ内で何度もアクセスすると、描画エンジンが毎回再計算を試みる。
- 対策: 大量に座標を更新する場合は、可能な限り `Array` にデータを格納し、`Shape.SetFormulas` や `SetResults` メソッドを使用して一括で書き込むのがプロの流儀だ。
—
最後に:エンジニアとしての矜持
VisioのAPIを叩くということは、図形という「オブジェクト」の生命をコードで司るということだ。今回伝授した `Geometry` の制御は、単なる機能追加ではない。あなたが手作業で深夜まで行っていた「図形の微調整」を、数ミリ秒の計算に置き換えるための武器だ。
このコードをただコピペするだけでなく、君の業務環境に合わせて「データから形状を生成する」ための抽象化層を構築してほしい。それができれば、君はもう単なる作業者ではなく、Visioの世界を支配するアーキテクトだ。
何か詰まったら、いつでも戻ってこい。コードは嘘をつかない。君の設計が正しければ、必ず動く。
