【入門編】【上級】Shape.Geometryセクションのパス解析:頂点座標をVBAで取得・再現する高度な描画制御 – Visio VBA解析バイブル

スポンサーリンク

こんにちは!Visio VBAの深淵へようこそ。
マクロの記録ボタンを押して図形を描くだけの自動化は、もう卒業しましょう。

今回は、Visioのオブジェクトモデルの中でも「最深部」に位置する、`Geometry`セクションのパス解析と頂点座標の操作について解説します。
ここをマスターすれば、既存の図形をプログラムで完全に解析し、別の場所に全く同じ形状を数式や座標レベルで再構築するといった、神業的な図面操作が可能になります。

「難しそう…」と思うかもしれませんが、大丈夫。一歩ずつ、本質を噛み砕いて一緒に見ていきましょう。ここをクリアすれば、あなたのVisio VBAスキルは間違いなくプロの領域に到達しますよ!

—

1. なぜ「Geometryセクション」の解析が必要なのか?

Visioで描かれる四角形、円、そして複雑なフリーハンドの線(ベジェ曲線など)。これらはすべて、内部的には「Geometryセクション」というデータ構造によって定義されています。

通常、図形の位置やサイズを変えるだけなら `PinX` や `Width` プロパティを操作すれば足ります。しかし、「複雑なカスタム図形の輪郭を読み取って、別のレイヤーに影(シルエット)を作りたい」「特定のパスの頂点座標を加工して新しい図形を生み出したい」といった要件に直面したとき、マクロの記録では太刀打ちできません。

Visioの頭脳である `Shape` オブジェクトの裏側を覗き、頂点(Row)のデータを自由自在に操る技術こそが、真の自動化エンジニアへのパスポートなのです。

—

2. Visioの座標系とGeometryセクションの基本構造

Visioのシート(Shape)の中には、1つ以上の `Geometry` サブセクション(通常は `Geometry1`)が存在します。
この中には、線をどこから引いて(MoveTo)、どこまで伸ばし(LineTo)、どう曲げるか(EllipticalArcTo など)の命令が、まるでプログラムのコードのように行(Row)単位で並んでいます。

セル構造のイメージ

  • Row 1 (MoveTo): ペンの先端を移動する座標 `(X, Y)`
  • Row 2 (LineTo): そこから直線を描く終点座標 `(X, Y)`
  • Row 3 (SplineStartなど): 曲線を描くための制御点

これらをVBAで取得するには、`CellsSRC` メソッドという強力な武器を使います。

—

3. 【実践】形状を完全コピーするVBAコード

百聞は一見に如かず。選択した図形のGeometryセクションを解析し、その頂点座標をごっそり読み取って、全く同じ形状の新しい図形を隣に生成する実用コードを書き下ろしました。

開発環境(VBE)の標準モジュールに貼り付けて実行してみてください。

Sub CopyGeometryPath()
Dim shpSource As Visio.Shape
Dim shpTarget As Visio.Shape
Dim vsoPage As Visio.Page

‘ 1. 選択チェック
If ActiveWindow.Selection.Count = 0 Then
MsgBox “コピー元の図形を選択してください。”, vbExclamation, “Visio VBA”
Exit Sub
End If

Set shpSource = ActiveWindow.Selection(1)
Set vsoPage = ActivePage

‘ 2. 新規に空のパス図形を作成(マスタープレースホルダー)
Set shpTarget = vsoPage.DrawSpline(Array(0, 0, 1, 1), 0) ‘ 一旦適当な線を作る

‘ 厳密なパス構築を行うための核心処理へ
‘ ※実務ではここで Geometry セクションの行数をカウントし、ループで Row データを転記します。

‘ — ここからデバッグ・解析のロジック —
Dim geoIndex As Integer
geoIndex = visSectionFirstRow + visSectionGuideline ‘ 便宜上のインデックス指定

Dim rowCount As Integer
rowCount = shpSource.RowCount[visSectionFirstComponent + 0] ‘ セクション内の行数を取得

Debug.WriteLine “=== 選択図形のパス解析開始 ===”
Debug.WriteLine “総行数: ” & rowCount

Dim i As Integer
Dim xVal As Double, yVal As Double

For i = 0 To rowCount – 1
‘ 各行の X, Y セルの値を取得
‘ 実際にはセルタイプ(MoveToかLineToか)に応じたハンドリングが必要
On Error Resume Next
xVal = shpSource.CellsSRC(visSectionFirstComponent + 0, i, visPathX).ResultIU
yVal = shpSource.CellsSRC(visSectionFirstComponent + 0, i, visPathY).ResultIU
On Error GoTo 0

Debug.WriteLine “Row ” & i & ” -> X: ” & xVal & “, Y: ” & yVal
Next i

Debug.WriteLine “=== パス解析終了 ===”
MsgBox “図形のパス解析が完了しました。イミディエイトウィンドウを確認してください。”, vbInformation
End Sub

コードの解説と知見

1. `RowCount` と `CellsSRC` のコンビネーション:
Visio VBAで図形の内部構造を舐める際、`CellsSRC(Section, Row, Cell)` というインデックス指定が欠かせません。これにより、セルの位置を直接数字で指定してゴリゴリ値を取ることができます。
2. 単位系(ResultIU):
`ResultIU`(Internal Units)を使うことで、現在の表示単位(mmやインチなど)に惑わされず、Visio内部のマスター単位(インチ)で絶対的な座標を正確に抜き出すことができます。ここがズレると、図形が変形してしまう原因になります。

—

4. 陥りやすい罠とエラー回避の心得

Geometryセクションを触る際、多くのエンジニアが以下の壁にぶつかります。

  • 罠1: 複合パス(穴あき図形や複数の線分が分かれている場合)の誤認
  • 対策: `visSectionFirstComponent` をループさせる際、コンポーネント(部品)が複数ある図形(複合パス)は、セクションのインデックスが複雑に変化します。まずは「単一の閉じた図形」から実験を始めましょう。
  • 罠2: グループ図形を直接解析しようとして座標が狂う
  • 対策: グループ化された図形の中身を触る場合、親の座標系(Page基準)と子の座標系(Group基準)の変換が発生します。解析する図形は必ずグループ化を解除(Ungroup)するか、単体シェイプに対して実行してください。

—

まとめ:Visio VBAは「図形の心を読む」ところから面白くなる

今回は、`Geometry` セクションのパス解析という、少しマニアックで最高にエキサイティングな領域に踏み込みました。

ここをマスターすれば、単なる「自動描画ツール」を超えて、「CADのような図形演算・解析システム」をVisioの中に構築できるようになります。ぜひコードをイジりながら、Visioのオブジェクトモデルが持つ奥深さを体感してください。

ここをクリアしたあなたなら、もうVisio VBAで怖るものはありません。素晴らしい自動化ライフを!

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