【実務・中級編】多角形シェイプの頂点をVBAで動的制御:Shape.Geometryセルの行(Row)の追加・削除による図形形状の変形 – Visio VBA解析バイブル

スポンサーリンク

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の世界を支配するアーキテクトだ。

何か詰まったら、いつでも戻ってこい。コードは嘘をつかない。君の設計が正しければ、必ず動く。

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