Visio VBAの深淵:Geometryセクションを操り、図形を「生命体」へと進化させる
こんにちは。業務自動化の最前線で、日々Visioと格闘しているエンジニアです。
皆さんは、マクロの記録で作成したコードが「なぜか特定の設定で動かない」「図形が増えると重くなる」といった壁にぶつかったことはありませんか?
Visio VBAをマスターする上で避けて通れない、そしてここを突破すれば一気に景色が変わる領域があります。それが「Geometry(ジオメトリ)セクションの動的制御」です。
今日は、定型的な図形配置から脱却し、データに応じて頂点そのものを増減させる「図形をプログラムで描く」技術を伝授しましょう。
—
1. なぜ「Geometryセクション」を直接叩くのか?
Visioのシェイプは、実は「Geometry」という名前のセクションに格納された頂点座標のリストで成り立っています。
- 初学者の壁: `Shape.Height` や `Width` を変えるだけの単純な伸縮。
- プロの領域: `RowAdd` や `RowDelete` を使い、四角形を五角形に、あるいは折れ線を複雑な波線へと、構造そのものを実行時に再定義する。
これを使いこなせば、Excelのデータから「その数だけ頂点を持つグラフ」を自動生成するような、高度な自動化が可能になります。
—
2. 核心:Geometryを操作するコードの作法
Visioのシェイプには「セクション」があり、その中に「行(Row)」があります。頂点を追加するということは、`visSectionFirstComponent` というセクションに新しい行を追加することに他なりません。
以下のコードは、選択したシェイプのGeometryセクションに、新しい頂点(LineTo)を追加する実例です。
Public Sub AddVertexToShape()
Dim shp As Visio.Shape
Dim rowIdx As Integer
‘ 選択中のシェイプを取得
If ActiveWindow.Selection.Count = 0 Then Exit Sub
Set shp = ActiveWindow.Selection(1)
‘ Geometry1セクションに新しい行を追加
‘ visRowVertexは頂点行を追加する定数
‘ -1を指定すると、既存の最後の行の後ろに追加されます
rowIdx = shp.AddRow(VisSectionIndices.visSectionFirstComponent, _
VisRowIndices.visRowVertex, _
VisRowTags.visTagLineTo)
‘ 追加した行にX, Y座標を書き込む
‘ X = 2インチ, Y = 2インチ の地点へ線を引く
shp.CellsSRC(VisSectionIndices.visSectionFirstComponent, rowIdx, VisCellIndices.visX).Formula = “2 in”
shp.CellsSRC(VisSectionIndices.visSectionFirstComponent, rowIdx, VisCellIndices.visY).Formula = “2 in”
Debug.Print “頂点番号 ” & rowIdx & ” を追加しました。”
End Sub
このコードのポイント
- `AddRow`メソッド: これがすべてです。第3引数の `visTagLineTo` が、「直線でつなぐ」という指示になります。
- `CellsSRC`: セクション(S)、行(R)、列(C)を指定してピンポイントで値を操作するVisio VBA最強のメソッドです。これを使えるようになると、もうマクロの記録には頼りません。
—
3. 陥りやすい「落とし穴」と鉄則
ここをクリアすれば、あなたはもう中級者です。実務で必ず直面する罠を3つ共有しておきます。
① インデックスのズレ(RowDeleteの罠)
行を削除する際、`RowDelete` を実行すると後ろの行のインデックスがすべて一つずつ前にずれます。
ループ処理で複数の頂点を消す際は、必ず「後ろから(大きなインデックスから)」削除してください。これが自動化エンジニアの常識です。
② 計算式と値の混同
`Cells.Formula` には数式(例: `Width0.5`)を入れ、`Cells.ResultIU` には計算済みの数値を入れます。
動的に座標を変える際は、基本は `Formula` を使い、単位(`in` や `mm`)を明示的に文字列として渡すのが最も安全です。
③ 再描画のオーバーヘッド
大量の頂点を一度に追加すると、Visioは描画を更新しようとします。コードの冒頭で `Application.ScreenUpdating = False` にし、最後に `True` に戻す。この一手間で、実行速度が劇的に変わります。
—
4. 最後に:Visioと対話する楽しさを
図形の頂点をプログラムで動的に制御する。これは単なる自動化ではなく、Visioというキャンバスに「生命」を吹き込む作業です。
「データが変われば、図形の形も変わる」。
この柔軟性さえ手に入れれば、あなたの業務自動化の幅は無限に広がります。
まずは既存の四角形に対して、コードで「頂点を1つ増やして、ちょっとだけ形を歪ませる」ところから始めてみてください。その小さな一歩が、いずれ複雑なシステム構成図をワンクリックで描き出す強力なエンジンへと成長します。
何か分からないことがあれば、いつでもまた聞きに来てください。技術の核心を、一緒に解き明かしていきましょう。
