【入門編】Page座標系とPinX/PinYの基礎:図形の配置位置をVBAで正確にコントロールする計算手法 – Visio VBA解析バイブル

スポンサーリンク

Visio VBAを掌握せよ:座標系の「深淵」を突き抜け、図形を完璧に操る極意

こんにちは。自動化の現場でVisioと格闘し続けてきた諸君、ようこそ。

「マクロの記録」で生成されたゴミのようなコードを整理し、いざ自分で図形を配置しようとしたとき、多くの人がこう叫びます。
「なぜ、指定した場所に図形が来ないんだ!」

そう、Visioの座標系は、Excelのセル指定のような直感的なものとは一線を画しています。今日は、Visioの「PinX」「PinY」という概念を徹底解剖し、君たちのコードを「動くもの」から「意のままに操れるもの」へと昇華させましょう。

1. Visio座標系の「絶対ルール」:原点はどこにある?

Visioの座標系において、最も重要なのは「原点(0,0)はどこか?」ということです。

答えはシンプル。「ページの左下」です。

  • X軸: 左から右へ。
  • Y軸: 下から上へ。

ここで初心者が陥る最大の罠が、「図形のどこを基準に配置しているか」という点です。図形の中心なのか、左上なのか、それとも右下なのか。この基準点を制御するのが `LocPinX` と `LocPinY` ですが、まずはその基本となる `PinX` と `PinY` を理解しましょう。

2. PinXとPinY:図形の「心臓」を掴むプロパティ

`PinX` と `PinY` は、「図形の回転中心(ピン)」がページ上のどこにあるかを指定するプロパティです。

重要なのは、`PinX/Y` を変更しても、図形の「左端」や「右端」が移動するわけではないということ。あくまで「図形のピン位置」が座標系上のどこに配置されるか、なのです。

実践コード:図形を正確に配置する

以下のコードは、アクティブページ上の選択した図形を、ページの中央(または任意の座標)へ正確に移動させるためのテンプレートです。

Sub MoveShapeToCoordinate()
Dim shp As Visio.Shape
Dim pg As Visio.Page

‘ 現在のページを取得
Set pg = ActivePage

‘ 選択されている図形を対象にする(一つだけ選んでいると仮定)
If ActiveWindow.Selection.Count = 0 Then
MsgBox “図形を一つ選択してください。”
Exit Sub
End If
Set shp = ActiveWindow.Selection(1)

‘ 座標系における「単位」はデフォルトで「インチ」のため注意
‘ cmで指定したい場合は Visio.Application.ConvertResult を活用する
Dim targetX As Double: targetX = 5 ‘ インチ単位
Dim targetY As Double: targetY = 5

‘ PinX/PinYを直接代入することで、図形を移動させる
‘ これが最も低レイヤーで、かつ確実な移動手法です
shp.Cells(“PinX”).ResultIU = targetX
shp.Cells(“PinY”).ResultIU = targetY

‘ ヒント: .ResultIU は「内部単位(Internal Units)」を意味します
‘ Visio内部では常にインチ単位で処理されるため、これを使うのがバグを防ぐ鉄則です
End Sub

3. なぜ「意図しない場所」へ飛ぶのか?

「コードを書いたのに、図形がずれる!」という悩み、よく聞きます。原因の多くは以下の二つです。

1. LocPin(位置合わせ点)のズレ:
図形の中心が回転軸になっていない場合、`PinX/Y` を指定しても、見た目上の端が指定座標にくるわけではありません。

  • `shp.Cells(“LocPinX”).Formula = “Width0.5″`
  • `shp.Cells(“LocPinY”).Formula = “Height0.5″`

これらを設定して、図形の中心を回転軸に固定してから `PinX/Y` を動かすのがプロの作法です。

2. 単位の混同:
Visioは設定によって「mm」「cm」「inch」を切り替えられますが、VBAの内部演算は常に「インチ」です。`ResultIU` を使わずに数値を直接入れると、予期せぬスケールで図形が配置されます。

4. 伝説のエンジニアからのアドバイス:自動化の極意

マクロを組む際、常に意識してほしいことがあります。それは「図形は生き物である」ということです。

図形を移動させる際、単に `PinX` を変えるだけでなく、`Group` 内の図形なのか、それとも `MasterShape` のインスタンスなのかによって挙動が変わります。複雑なレイアウトを組む際は、まず「手作業で動かしたときにどういう挙動をするか」をシェイプシートで確認してください。

今後のステップ

次は、`Cells(“PinX”).Formula` を使って、他の図形との相対位置関係を計算式で定義する方法を学びましょう。これができるようになると、君たちのVisio自動化は「単なる移動」から「動的な図面生成」へと進化します。

ここをクリアすれば、Visio VBAの基本はバッチリです。
恐れずにコードを書き、図形をページの上で踊らせてやりましょう。何かあれば、またいつでも聞いてください。応援していますよ。

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