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

スポンサーリンク

こんにちは!Visio VBAの世界へようこそ。
マクロの記録ボタンを押して図形を動かしてみたものの、生成されたコードを見て「なんだこれ……? PinX? LocPinX?」とフリーズしてしまった経験はありませんか?

Excel VBAなら `Range(“A1”).Value = 100` で直感的に動くのに、Visioを開いた途端に立ちはだかる謎の座標プログラミングの壁。
でも、安心してください。ここをクリアすれば、あなたの描画自動化スキルは一気にプロの領域へ到達します。

今回は、Visio VBAの座標系における最大の肝、「PinX / PinY」 と 「LocPinX / LocPinY」 の正体を、実例を交えて優しく、そして本質的に解説していきますね。ここをクリアすれば、図形が意図しない宇宙の彼方へすっ飛んでいく怪現象とはおさらばできますよ!

—

1. なぜVisioの図形は「意図しない場所」に飛んでしまうのか?

ExcelやPowerPointでは、図形の「左上隅」を基準に位置(Left, Top)を決めるのが一般的です。
しかし、Visioの心臓部であるベクターエンジンは、もっと柔軟で、ある意味で複雑な仕組みを持っています。

Visioの図形には、次の2つの「中心点」が存在します。

1. 図形自身の基準点(ピン):どこを軸にして配置するか(PinX / PinY)
2. 図形内部のローカル基準点:図形にとっての「中心(または回転の軸)」はどこか(LocPinX / LocPinY)

これらを混同しているから、「X座標に100を指定したのに、なぜか図形の右端がそこに行った」「回転させたら明後日の方向にズレた」というパニックが起きるのです。

—

2. 4つの重要プログラ性プロパティを完全マスターする

まずは言葉の定義を、図解をイメージしながらスッキリ頭に整理しましょう。

PinX と PinY (ページ上のピン)

  • 意味: ページの左下を原点 `(0,0)` としたとき、「図形のピン(後述のLocPin)が、ページ上のどこに突き刺さっているか」を表す絶対座標です。
  • イメージ: 模造紙(ページ)の上に、画びょう(Pin)を刺して図形を留めている位置だと思ってください。

LocPinX と LocPinY (ローカルピン)

  • 意味: 「図形自身から見て、どこをピン留め(軸)にするか」を表す相対座標です。
  • イメージ: 四角形の中心を軸にくるくる回したいなら「図形の真ん中」、左下を基準に配置したいなら「図形の左下」を指定します。

> ★チーフアーキテクトからの極意
> Visioの図形は、デフォルトでは「図形の中心(Width / 2, Height / 2)」がLocPinに設定されています。
> つまり、`PinX = 50, PinY = 50` と指定した場合、「図形の中心がページ上の (50, 50) に来るように配置する」という意味になります。ここがExcelとの最大の決定的な違いです!

—

3. 実践!VBAコードで座標を意図通りにコントロールする

百聞は一見に如かず。実際にVBAエディタ(Alt + F11)を開き、イミディエイトウィンドウや標準モジュールで動かせるコードを見てみましょう。

以下のコードは、アクティブページに正方形を配置し、意図した位置に正確にコントロールするサンプルです。

Sub ControlShapePositioning()
Dim shp As Visio.Shape
Dim pageW As Double, pageH As Double

‘ 1. 4センチ四方の正方形をページの中央に作成
‘ 引数: 始点X, 始点Y, 終点X, 終点Y (単位はインチに換算されるためセンチなら / 2.54)
Set shp = ActivePage.DrawRectangle(2 / 2.54, 10 / 2.54, 6 / 2.54, 6 / 2.54)

‘ 2. 図形の幅と高さを取得(確認用)
Dim w As Double, h As Double
w = shp.Cells(“Width”).ResultIU
h = shp.Cells(“Height”).ResultIU

‘ 3. 【重要】ローカルピン(LocPin)を「図形の中心」に明示的に設定する
‘ Width0.5, Height0.5 で確実に中心をピンの軸にする
shp.Cells(“LocPinX”).FormulaU = “Width0.5”
shp.Cells(“LocPinY”).FormulaU = “Height0.5”

‘ 4. ピンの刺さる位置(PinX/PinY)をページ上の指定座標に移動する
‘ ここではページ上の X=100mm, Y=150mm の位置に「中心」を配置する
shp.Cells(“PinX”).ResultIU = 100 / 2.54
shp.Cells(“PinY”).ResultIU = 150 / 2.54

Debug.Print “図形を正確に指定座標の中心に配置しました。”
End Sub

コードの解説

  • `ResultIU`: Visio内部の基本単位(インチ)で値を読み書きするためのプロパティです。ミリメートルで思考したいときは `100 / 2.54` のように換算するのが実務の定石です。
  • `FormulaU`: 数式(Formula)として値を代入しています。`Width0.5` と入れておくことで、後から図形をリサイズしても、中心ピンの位置が自動的に追従してくれます。ここがハードコード(固定値)しないプロの技です。

—

4. 現場でよくある失敗と回避テクニック

罠:左上を基準に配置したい場合

「エクセルみたいに、図形の左上を基準にして座標を指定したいんだよ!」という場合は、LocPinを左上に変更すれば一発で解決します。

‘ LocPinを「図形の左下(または左上)」に設定する
shp.Cells(“LocPinX”).FormulaU = “0” ‘ 幅の0%(左端)
shp.Cells(“LocPinY”).FormulaU = “0” ‘ 高さが0%(下端 ※VisioのY軸は下が0、上がMAX)

※注意:Visioのページ座標系は、画面の左下が `(0,0)` です(数学の第1象限と同じ)。Excelの「左上が0,0」とは上下が逆になっている点も、初学者がハマりやすいポイントなので注意してくださいね。

—

まとめ:ここをクリアすればVisio VBAは怖くない!

  • PinX / PinY は「ページ上のどこに置くか」という絶対位置。
  • LocPinX / LocPinY は「図形のどこを軸にするか」という相対位置。
  • 回転させたり精密に整列させたりするときは、必ずこの2つのコンビネーションを意識する。

この2つの概念さえ掴んでしまえば、複雑なフローチャートの自動生成も、社内組織図のワンクリック構築も、あなたの思いのままです。

「ここがまだピンとこない」「こんな図形を自動で並べたいんだけどどう書くの?」といった疑問があれば、いつでも気軽にエンジニア仲間に聞いてくださいね。
あなたのVisio自動化ライフが快適なものになるよう、チーフアーキテクトとして応援しています!

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