【実務・中級編】【初心者】Visio VBAの座標系を理解する:PinX/PinYとLocPinX/LocPinYを操作して図形を正確に配置する – Visio VBA解析バイブル

スポンサーリンク

【Visio VBA】座標系の悪夢を断つ:PinX/PinYとLocPinX/LocPinYの完全掌握

業務自動化の現場において、Visioの図形自動配置ほど開発者を絶望させるタスクはない。
「コードを実行したら、図形がキャンバスの彼方に吹き飛んだ」
「回転させた途端、想定外の場所に図形がワープした」

もし君がこんな怪奇現象に悩まされているなら、原因は明確だ。Visioの根幹をなす「2つの座標系とアンカーの概念」を誤解している。

一般の入門書には「PinXとPinYは図形の中心座標です」としか書かれていない。しかし、プロダクションレベルの自動化ツールを設計する者にとって、それだけの理解では実用に耐えない。今回は、Visio VBAの座標系を完全にハックし、一発で正確無比な配置を実現するための極限の知見を伝授する。

—

1. なぜ図形は意図しない場所に飛ぶのか?

Visioの座標系が難しいとされる理由は、「図形自身のローカル座標系」と「ページ全体のマスター座標系(ページ空間)」の2つが常に連動しているからだ。

ここで登場するのが、形状シート(ShapeSheet)における以下の4つの重要プロパティである。

1. `PinX` / `PinY`(ピン座標)

  • 役割: ページ上のどこに図形を配置するかを決める(ページ座標系)。
  • 基準: 後述する「ローカルピン」が、ページの原点(通常は左下)から見てどこにあるかを示す。

2. `LocPinX` / `LocPinY`(ローカルピン座標)

  • 役割: 図形自身の内部における「回転中心」および「配置基準点」を決める(ローカル座標系)。
  • 基準: 図形の左下隅を `(0, 0)` としたときの相対位置。

致命的な誤解:中心を基準にするという罠

デフォルトでは、`LocPinX` と `LocPinY` は図形の「中心(Width0.5, Height0.5)」に設定されている。
そのため、単純に `PinX` と `PinY` を変更して図形を移動させようとすると、つねに「図形の中心がその座標にくる」ように計算される。

もし、図形の左上隅を基準にグリッドへスナップさせたい場合、このデフォルト挙動のまま `PinX`/`PinY` をいじると、計算が激しく狂うことになる。これが「図形が飛ぶ」根本原因だ。

—

2. 堅牢な座標制御の鉄則

実務でバグの起きない自動配置ロジックを組むためには、以下の設計原則を遵守しなければならない。

  • 原則1:配置の基準(LocPin)を最初に明示的に定義せよ

デフォルト任せにしてはならない。図形を生成・配置する際は、まず `LocPinX` と `LocPinY` に何を基準にするかをコードで明示的に代入する。

  • 原則2:図形のサイズ変更(Width/Height)と座標変更の順序に気をつけろ

サイズを変更すると、`LocPin` の比率設定によっては `Pin` の位置が意図せず再計算される場合がある。サイズ変更 $\rightarrow$ ローカルピン設定 $\rightarrow$ ピン座標設定 の順序を徹底する。

—

3. 【プロダクションコード】正確無比な図形配置エンジン

以下のコードは、指定した座標(左上基準)に図形を正確に配置し、任意の角度で回転させても位置が狂わないように制御する実用的なVBAプロシージャだ。
単なるサンプルではない。エラーハンドリングとオブジェクトのライフサイクルを考慮した、そのまま業務で使える品質に仕上げている。

Option Explicit

Public Sub CreateAndPlaceShapePrecisely()
Dim vshTarget As Visio.Shape
vbeSetErrorHandling:
On Error GoTo ErrorHandler

‘ 1. アクティブページの取得
Dim vPage As Visio.Page
Set vPage = ActivePage
If vPage Is Nothing Then
MsgBox “アクティブなページが存在しません。”, vbCritical
Exit Sub
End If

‘ 2. 矩形シェイプのマスター(または直接描画)
‘ ※ここではシンプルに長方形を描画する (X=100mm, Y=100mm の位置に、幅50mm, 高さ30mmの箱)
‘ 単位はVisioの内部単位(インチ)に換算するか、mmプロパティを使用する
Dim dblWidth As Double, dblHeight As Double
Dim dblTargetX As Double, dblTargetY As Double

‘ 実務ではmm単位で思考するため、Visioの関数でインチに変換する
dblWidth = vPage.Application.IUtoFunc(50, “mm”) ‘ 幅 50mm
dblHeight = vPage.Application.IUtoFunc(30, “mm”) ‘ 高さ 30mm

‘ 配置したい目標位置(ページの左下を原点とした、図形の「左上隅」の座標を指定したい場合)
dblTargetX = vPage.Application.IUtoFunc(50, “mm”) ‘ ページ左から50mm
dblTargetY = vPage.Application.IUtoFunc(150, “mm”)’ ページ下から150mm

‘ シェイプの作成
Set vshTarget = vPage.DrawRectangle(0, 0, dblWidth, dblHeight)

‘ — 【極限の知見】座標とアンカーの完全制御 —

‘ Step A: ローカルピン(回転・配置基準)を「左上隅 (Left, Top)」に固定する
‘ デフォルトは中心(Width0.5, Height0.5)だが、左上(0, Height)に変更する
vshTarget.CellsU(“LocPinX”).FormulaU = “Width0”
vshTarget.CellsU(“LocPinY”).FormulaU = “Height1”

‘ Step B: PinX / PinY を用いて、目標とする「左上隅の座標」をダイレクトに指定する
‘ LocPinを左上に設定したため、PinX/PinYはそのまま図形の左上隅の座標として機能する
vshTarget.CellsU(“PinX”).FormulaU = dblTargetX & ” mm”
vshTarget.CellsU(“PinY”).FormulaU = dblTargetY & ” mm”

‘ Step C: 必要であればここで回転角を与える(基準が左上なので、左上を軸に回転する)
vshTarget.CellsU(“Angle”).FormulaU = “45 deg”

MsgBox “図形の正確な配置に成功しました。”, vbInformation
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical
‘ オブジェクトのクリーンアップ(メモリリーク防止)
If Not vshTarget Is Nothing Then
‘ 必要に応じた処理
End If
End Sub

コードの解説ポイント

  • `LocPinX = Width0`, `LocPinY = Height1`: これにより、図形のアンカー(把手)が左上隅に移動する。結果として、`PinX`/`PinY` を操作することは、「図形の左上をどこに置くか」を指定することと同義になる。直感的なレイアウト計算が可能になるのだ。
  • `IUtoFunc` の活用: Visioの内部データはすべて「インチ」で保持されている。実務で「ミリメートル単位」で正確に位置を計算するためには、Visioの単位変換関数を挟むのがプロの作法である。ハードコーディングでインチ直値を叩くのは、保守性を下げる最悪のアンチパターンだ。

—

4. データベースや外部ファイル連携時の注意点

DB(Excel, Access, SQL Serverなど)から座標データ(X, Y)を読み込んで図形を自動生成・配置するシステムを構築する場合、以下のトラップに注意せよ。

1. 原点(Origin)の差異

  • Visioのページ座標の原点は、通常「左下」である。
  • 一方、一般的なUIデザインや画像処理、あるいはExcelシート上のレイアウト定義では、画面の「左上」を原点とすることが多い。
  • DBから取得したY座標をそのままVisioに突っ込むと、上下が反転して配置される。必ず `(ページの高さ – Y座標)` の変換ロジックをVBA側に挟むこと。

2. シェイプシートの遅延評価とパフォーマンス

  • 大量の図形(例: 1,000個のノード)をループで配置する際、セルを変更するたびにVisioが画面描画や再計算を行っていると、処理が極端に遅くなる。
  • 大規模自動化の際は、必ず処理の最初に `Application.ScreenUpdating = False` をかけ、処理の最後に戻すこと。これだけで実行速度が数倍〜数十倍に跳ね上がる。

—

総括

Visio VBAにおける座標系は、仕組みさえ理解してしまえば決して難解なものではない。
「図形をどこに置きたいか」を考える前に、「図形のどの点を基準(アンカー)にして配置するか(`LocPin`)」を常に最初に定義する癖をつけろ。

この原則をマスターした瞬間から、君の書くVisio自動化コードから「図形が変な場所に飛ぶバグ」は完全に駆逐されるはずだ。さあ、その手でコードを書き換え、圧倒的な生産性を手に入れろ。

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