【入門編】Visio固有の単位系に悩まない:VisioInternalUnitsと実寸・ポイント値の相互変換マクロ – Visio VBA解析バイブル

スポンサーリンク

Visio VBAを掌握せよ:単位系の呪縛を解き、図形配置を完全に支配する極意

Visio VBAの世界へようこそ。マクロの記録ボタンを押して「動いたから良し」とする段階は、今日で卒業です。

多くのエンジニアがVisio自動化の入り口で挫折する最大の要因、それが「単位系の不一致」です。画面上で「10mm」と見える場所が、コード上では全く別の数値として扱われる。この不可解なギャップを理解できないと、図形は常に数ピクセルずれた場所に配置されることになります。

今日は、Visioの心臓部である「Internal Units(内部単位)」を完全掌握し、あなたのコードで配置した図形が「ピタリと」決まるようになるための極意を伝授します。

1. Visioの単位系:「内部単位」という名の絶対尺度

Visioは、あなたが画面上で何を設定していようと、内部的には「インチ(inch)」をベースとした独自の浮動小数点数で座標を管理しています。

  • ユーザーの認識: ミリメートル(mm)、センチメートル(cm)、ポイント(pt)
  • Visioの内部: すべて「インチ」で計算される(Internal Units)

コードで `shp.Cells(“PinX”).Formula = “10mm”` と書くとVisioは理解してくれますが、計算が必要なロジックを組む際、この「単位変換」を意識せずに浮動小数点数で直接値を書き込もうとすると、地獄を見ます。

なぜ「ズレ」が生じるのか?

多くの初心者は、画面の「定規」の目盛りをそのまま数値として変数に代入します。しかし、計算過程で「インチからmmへの換算」を曖昧にすると、浮動小数点誤差と変換係数のズレが積み重なり、図形が数ミリずつ漂流を始めるのです。

2. 単位系を制する「変換の黄金律」

Visioの `Application` オブジェクトには、この単位変換を安全に行うための強力なメソッドが備わっています。これを使わずに自分で「25.4で割る」といった計算をするのは、車輪の再発明どころか、パンクしたタイヤで走るようなものです。

以下の2つのメソッドを脳に焼き付けてください。

1. `ConvertResult`: 文字列(”10mm”など)を内部単位(インチ)に変換する。
2. `FormatResult`: 内部単位(インチ)を、指定した単位の文字列に変換する。

3. 実践:ズレを排除する変換モジュール

それでは、現場で即戦力となる「単位変換ロジック」を実装してみましょう。このコードを標準モジュールにコピーすれば、単位系の悩みからは解放されます。

‘ Visio単位変換ユーティリティ
‘ 内部単位(インチ)と実寸(mm)を正確に行き来するためのメソッド群

Public Function ConvertMmToInternal(ByVal mmValue As Double) As Double
‘ mmの数値をVisio内部単位(インチ相当の数値)に変換
‘ Application.ConvertResultは、強力な変換エンジンです
ConvertMmToInternal = Application.ConvertResult(mmValue & ” mm”, VisUnitCodes.visInches, “”)
End Function

Public Function ConvertInternalToMm(ByVal internalValue As Double) As Double
‘ 内部単位をmmの数値に変換
ConvertInternalToMm = Application.ConvertResult(internalValue, VisUnitCodes.visInches, VisUnitCodes.visMillimeters)
End Function

‘ — 実践的な配置テスト —
Sub PositionShapePrecisely()
Dim shp As Visio.Shape
Set shp = ActivePage.DrawRectangle(0, 0, 1, 1) ‘ 仮の図形

‘ 100mmの場所に配置したい場合
Dim targetX As Double
targetX = ConvertMmToInternal(100)

‘ PinX(図形の中心X座標)に適用
shp.Cells(“PinX”).ResultIU = targetX

Debug.Print “配置完了: ” & ConvertInternalToMm(shp.Cells(“PinX”).ResultIU) & ” mm”
End Sub

コードの解説

  • `ResultIU`: これは「Result In Units(内部単位での結果)」を意味するプロパティです。`.Formula`に文字列を渡すのではなく、`.ResultIU`に計算済みの内部単位数値を直接渡すのが、パフォーマンスと精度の観点で最も優れた作法です。
  • `VisUnitCodes`: Visioが持つ定数ライブラリです。`visMillimeters`や`visPoints`など、明示的に指定することで、コードの可読性とメンテナンス性が劇的に向上します。

4. 陥りやすい罠:なぜ「0」を基準にしてはいけないのか

初心者がやりがちなミスとして「ページ上の座標を絶対値で書く」ことがあります。しかし、Visioのページには「ドキュメントのプロパティ(原点位置や余白)」が存在します。

  • アドバイス: `ActivePage.PageSheet` を参照し、ページサイズやプリンタのオフセットを考慮した座標設計を心がけてください。
  • オブジェクトモデルの階層: `Application -> Document -> Page -> Shape` の順にアクセスする癖をつけましょう。「今どのページを見ているか」を曖昧にすると、意図しないドキュメントに図形が生成される事故が起きます。

まとめ:自動化の先にあるもの

単位系の変換を完璧にマスターしたあなたは、もう「数値のズレ」に悩まされることはありません。

Visio VBAの本質は、「手作業の再現」ではなく「座標計算の自動化」にあります。今回学んだ `ConvertResult` を軸に、複雑な図面をプログラムで再構築する感覚をぜひ楽しんでください。

ここをクリアした今、あなたはVisioを「描画ツール」ではなく「プログラム可能なキャンバス」として扱えるようになったはずです。次のステップとして、マスターシェイプの差し替えや、データグラフィックとの連動に挑戦してみてください。

あなたの自動化ライフが、より快適で精緻なものになることを願っています。質問があれば、いつでも現場のエンジニアとしてお答えしますよ。

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