Visio VBAを制する者だけが辿り着く「座標系」の真実:PinX/PinYを支配せよ
Visioの自動化において、多くのエンジニアが最初の壁として立ちはだかるのが「図形の配置」だ。`Shape.Left`や`Shape.Top`といったプロパティに頼り、期待した場所に図形が置けずに頭を抱えた経験はないだろうか?
結論から言おう。Visioの世界において、図形の位置を支配するのは`PinX`と`PinY`であり、その背後にある「LocPin(回転中心)」と「座標の原点」の関係を理解しない限り、堅牢なレイアウトロジックは一生構築できない。
本稿では、VBAでVisioを自在に操るための「座標系の真理」を解き明かす。
—
1. Visio座標系の「絶対的法則」
Visioの座標系において、最も重要なのは以下の3点だ。
1. 原点は左下(0, 0): 多くのUIフレームワークと異なり、Visioのページ座標は左下が原点だ。
2. PinX/PinYの正体: これらは図形の「左上」の座標ではない。「回転中心(LocPin)」がページ上のどこにあるかを示す値だ。
3. LocPinX/LocPinYの存在: 図形の中のどこを「回転中心」とするか(デフォルトは図形の中心)を決める値。これを無視して`PinX`を操作しようとするのは、操舵輪のない船で航海するに等しい。
なぜ「中級者」で止まるのか
多くの初学者は、「図形の左上を特定の座標に置きたい」と願うが、Visioは「中心を置け」と命令を待っている。このギャップを埋める計算を行わない限り、図形のサイズが変わるたびにレイアウトが崩壊するツールが出来上がる。
—
2. 堅牢なレイアウトを構築するプロダクションコード
保守性と再利用性を極限まで高めたコードがこれだ。図形の左上を目標座標に一致させる、実務で最も要求されるロジックをカプセル化している。
‘ —————————————————————————
‘ @brief 指定した座標(x, y)に、図形の左上を配置する
‘ @param shp 対象のVisio Shapeオブジェクト
‘ @param targetX ページのX座標(インチ/ミリ等、Visio設定に依存)
‘ @param targetY ページのY座標
‘ —————————————————————————
Public Sub SetShapeTopLeft(ByVal shp As Visio.Shape, ByVal targetX As Double, ByVal targetY As Double)
‘ 1. LocPinを左上に移動させる(LocPinX = 0, LocPinY = Height)
‘ これにより、PinX/PinYが「左上」の座標として計算可能になる
shp.Cells(“LocPinX”).FormulaU = “Width0”
shp.Cells(“LocPinY”).FormulaU = “Height1”
‘ 2. PinX/PinYを目標座標にセット
‘ セル値の更新はFormulaプロパティを使用し、単位を考慮して設定する
shp.Cells(“PinX”).Result(“in”) = targetX
shp.Cells(“PinY”).Result(“in”) = targetY
End Sub
なぜこの実装なのか(アーキテクトの視点)
- FormulaUの使用: プロパティ値は常に`FormulaU`を通じて設定せよ。UIの単位設定(ミリ/インチ)に依存せず、型安全な計算を保証するためだ。
- LocPinの強制移動: 図形のサイズが変更されても、このコードなら常に「左上」を基準とした配置が維持される。これが「バグを起こさない」ための最適解だ。
—
3. 業務自動化における「罠」と設計方針
ファイル・DB連携時の注意点
Visio図面を動的に生成する際、データベースから座標値を取得するケースが多いだろう。ここで注意すべきは「単位の不一致」だ。
- データベースには「mm」で格納されていることが多いが、Visioの内部計算は「インチ」が基点となる。
- `Application.ConvertResult`関数を必ず噛ませること。生の数値を入れるのは、時限爆弾を抱えるようなものだ。
パフォーマンスを極める
大量の図形を配置する場合、以下の手法を徹底せよ。
1. ScreenUpdatingのオフ: `Application.ScreenUpdating = False`を忘れずに。描画コストをカットするだけで、実行速度は数倍になる。
2. イベントの抑制: `Application.EventEnabled = False`により、配置のたびに走る再計算イベントを抑止せよ。
3. ストアドプロシージャ的な発想: 一つずつ図形を配置するのではなく、必要なセル値を計算しきってから`shp.Cells(“…”).FormulaU`を一度に更新する。
—
結びに代えて:エンジニアの誇り
Visio VBAは古い言語と言われることがある。しかし、それは使いこなす者の視点が「自動化」というレベルに達していないだけだ。図形の一つひとつの座標を精密に、かつ数学的に制御するコードを書く時、あなたは単なるVBAユーザーではなく、図面という「空間」を定義するエンジニアになる。
次にコードを書くとき、`PinX`の裏側にある数式を想像してほしい。その一歩が、あなたのツールを「動くツール」から「壊れないプロダクト」へと進化させるはずだ。
さあ、設計に取り掛かろう。あなたの自動化の旅に、幸運を。
