Visioの「心臓部」を解剖する:Geometryセルの頂点座標をVBAで制御する極意
こんにちは。Visioの世界へようこそ。
もしあなたが「マクロの記録」ボタンを押して生成された、冗長で意味不明なコードに絶望したことがあるなら、今日こそがその卒業の日です。
Visioにおける図形(Shape)とは、単なる「四角」や「丸」の集まりではありません。その正体は、数学的な座標データ(Geometry)の集合体です。この深淵に触れることができれば、Visioは単なる作図ソフトから「プログラムで制御可能なCAD」へと変貌を遂げます。
今日は、プロの現場でも頻繁に要求される「図形の頂点座標を解析し、それを別の図形として再構築する」という、Visio VBAの最も美しく、かつ強力な技術を伝授します。
—
1. なぜ「Geometryセル」を理解する必要があるのか?
Visioの図形は、`Geometry`というセクションを持っています。ここには `MoveTo`(開始点)や `LineTo`(直線)、`ArcTo`(曲線)といった、図形を描くための「設計図」が書き込まれています。
これを読み解くということは、「図形のDNAを抽出する」ようなものです。これができれば、複雑な図形の歪みを補正したり、座標データを外部のCADやデータベースへ出力したりと、自動化の幅が劇的に広がります。
—
2. 実践:Geometryの頂点を解析するVBAコード
以下のコードは、選択した図形のGeometryセクションを走査し、その頂点座標(X, Y)をイミディエイトウィンドウに書き出すルーチンです。
Sub ExtractShapeGeometry()
Dim shp As Visio.Shape
Dim geoSection As Visio.Section
Dim row As Visio.Row
Dim i As Integer
‘ 現在選択している図形を取得
If ActiveWindow.Selection.Count = 0 Then Exit Sub
Set shp = ActiveWindow.Selection(1)
‘ Geometryセクションは複数存在する場合がある(通常はGeometry1)
Set geoSection = shp.Section(visSectionFirstComponent)
Debug.Print “Shape Name: ” & shp.Name
‘ 各行(Row)をループ処理
For i = 0 To geoSection.Count – 1
Set row = geoSection.Row(i)
‘ 座標値は CellsU(インデックス) で取得可能
‘ X座標とY座標を抽出
Dim x As Double, y As Double
x = row.Cell(“X”).ResultIU
y = row.Cell(“Y”).ResultIU
Debug.Print “Point ” & i & “: (” & x & “, ” & y & “)”
Next i
End Sub
このコードの「賢い」ポイント
- `.ResultIU`の活用: Visioは内部でインチ単位(Internal Units)を使っています。これを使うことで、ドキュメントの表示単位(mmやcm)に依存せず、正確な数値を扱えます。
- `.Section(visSectionFirstComponent)`: なぜこれを使うのか? Visioの図形には複数のパスが含まれることがあります。まずは基本となる最初のコンポーネントを抑えるのが定石です。
—
3. 初学者が必ず陥る「3つの落とし穴」
コードを書くとき、以下の点に注意してください。これを知っているだけで、デバッグの時間は半分になります。
1. 「Rowの型」を意識せよ: `LineTo`行にはXとYがありますが、`MoveTo`や`EllipticalArcTo`ではセルの構成が異なります。いきなり `.Cell(“X”)` を呼ぶとエラーになることがあります。`row.Type` で行の種類を判定するガード節を入れるのがプロの作法です。
2. 座標系の罠: 取得した座標は「図形のローカル座標系」です。ページ上の絶対座標が欲しい場合は、`shp.LocPinToPage` などのメソッドと組み合わせて変換が必要です。
3. パフォーマンスの重み: 1,000個の図形をループする際、`ActiveWindow` に触れると処理が激重になります。ループ処理中は `Application.ScreenUpdating = False` を忘れずに。
—
4. 次のステップへ:座標を「再現」する
抽出した座標を使い、`Application.ActivePage.DrawPolyline` メソッドなどと組み合わせれば、図形のクローンを生成したり、図形の頂点をプログラムで動的に変形させることも可能です。
「図形を操作するのではなく、図形の設計図を書き換える」
この意識を持てたとき、あなたはもう初級エンジニアではありません。Visioの内部構造という「裏側」が見え始めているはずです。
最後に
Visio VBAは非常に奥が深く、同時に非常に論理的です。まずは上記のコードをコピーして、色々な図形で試してみてください。「なぜこの座標になるのか?」という疑問を一つずつ潰していくこと。それが、伝説的な自動化エンジニアへの唯一の近道です。
また分からないことがあれば、いつでも聞きに来てください。あなたの挑戦を応援していますよ。
