【実務・中級編】図形の回転と反転:FlipやRotateメソッド、およびAngleセルのVBA制御による正確な姿勢変更 – Visio VBA解析バイブル

スポンサーリンク

【Visio VBA極限解説】図形の回転・反転完全制覇:ShapeSheetの真実と数理的アプローチ

開発プロジェクトの現場で、Visioの自動化を任されたエンジニアが最初に直面する壁。それが「図形の姿勢制御」だ。
フローチャートの向きを変えたい、設備の配置図で機器の向きを反転させたい――。
一見、UI上ではマウス一つで簡単にできる操作をVBAで実現しようとした瞬間、開発者はVisioの特異な座標系とShapeSheetの呪縛に囚われる。

「`Flip`メソッドを使ったら図形が予期せぬ明後日の方向に吹っ飛んだ」
「`Rotate`で角度を指定したはずなのに、ピンの位置がおかしくなり図形が歪んだ」

ネット上の浅いリファレンスをコピペしただけでは、実務の堅牢なツール開発で必ず足元をすくわれる。
今回は、VisioのオブジェクトモデルとShapeSheetの挙動を骨の髄まで理解したチーフアーキテクトの視点から、「バグを1ミリも生み出さない、正確無比な回転・反転制御の極意」を叩き込む。

1. なぜ「単純なメソッド実行」で事故が起きるのか?

Visio VBAには、図形を操作するための手軽なメソッドが用意されている。

  • `Shape.Flip` (水平・垂直反転)
  • `Shape.Rotate` (回転)

これらを使えば一発で終わる……ように見える。だが、実務でこれらを安易に使うのは「地雷原を裸足で歩くようなもの」だ。

敗因①:基準点(Pin)の呪縛

Visioのすべての図形(Shape)は、その内部に「ピン(PinX, PinY)」という回転や配置の基準点を持っている。デフォルトでは、多くの図形は「図形の中心」がピンになっているが、ステンシルや作成したグループ化図形によっては、ピンの位置が左下や右上にオフセットされていることがある。
この状態で `Rotate` メソッドを呼ぶと、「予期せぬ中心軸周りの回転」が起き、図形がキャンバスの彼方へ消え去る現象(俗にいう「図形飛ばしバグ」)が発生する。

敗因②:多重反転によるパリティ(偶奇性)の崩壊

`Flip`メソッドは、実行するたびに図形のローカル座標系の向きを反転させる。しかし、これをループ処理や条件分岐の中で何回も呼び出すと、図形内部のテキストまで逆さになったり、アスペクト比が狂ったりする。

プロの結論:
実務の自動化ツールにおいて、ブラックボックスなメソッドに運命を委ねてはならない。ShapeSheetのセルを直接書き換えるアプローチこそが、唯一にして最大の正解である。

2. ShapeSheet制御による完全無欠の姿勢変更ロジック

Visioの真の姿は、裏でうごめく「ShapeSheet(数式スプレッドシート)」だ。すべての図形の座標、角度、サイズはセルに格納されている。ここを直接、かつ論理的に叩くことで、完全な再現性と精度が手に入る。

回転制御の数理:Angle セル

図形を回転させる場合、`Angle` セルにラジアン単位で値を代入する。
ここで重要なのは、「どの基準点で回転させるか」を事前に意図通りに固定しておくことだ。

反転制御の数理:LocPinX / Flip 挙動の制御

反転(Flip)を安全に行うには、単に反転メソッドを呼ぶのではなく、ShapeSheetの `LocPinX` / `LocPinY`(ローカルピン)と、幅・高さの符号をコントロールするか、あるいはVisioが提供する安全なトランスフォーム関数を利用する。

だが、最も手堅く、かつバグらない方法は、「目的の姿勢パラメータを計算し、一撃でセルに書き込むこと」だ。

3. 【プロダクションコード】実務で使える堅牢な制御モジュール

それでは、実際の業務アプリケーションにそのまま組み込める、極めて堅牢なVBAコードを公開する。
このコードは、指定した図形を「任意の角度への回転」および「正確な反転」を安全に実行するプロシージャ群である。

Option Explicit

‘ ==============================================================================
‘ モジュール名: ModShapeTransformer
‘ 概要: Visio図形の回転および反転をShapeSheet経由で安全に実行するプロシージャ群
‘ ==============================================================================

‘ ——————————————————————————
‘ 汎用プロシージャ: 図形を指定角度(度数法)で絶対回転させる
‘ ——————————————————————————
Public Sub RotateShapeAbsolute(ByVal targetShape As Visio.Shape, ByVal angleDegrees As Double)
On Error GoTo ErrorHandler

‘ ガード節: 図形が無効な場合
If targetShape Is Nothing Then Exit Sub

‘ グループ図形の一部である場合などの例外を考慮し、レイヤーや保護をチェック
If targetShape.CellExists(“LockRotate”, Visio.visExistsLocally) Then
If targetShape.Cells(“LockRotate”).ResultIU <> 0 Then
Err.Raise vbObjectError + 1000, “RotateShapeAbsolute”, “対象の図形は回転がロックされています。”
End If
End If

‘ 度数法(Degree)をラジアン(Radian)に変換
Dim angleRadians As Double
angleRadians = angleDegrees (Application.Pi / 180#)

‘ ShapeSheetの Angle セルに直接代入
‘ 単位の不整合を防ぐため、ResultIU (Internal Units = ラジアン) を使用
targetShape.CellsU(“Angle”).ResultIU = angleRadians

Exit Sub

ErrorHandler:
MsgBox “図形の回転処理でエラーが発生しました: ” & Err.Description, vbCritical, “VBAエラー”
End Sub

‘ ——————————————————————————
‘ 汎用プロシージャ: 図形を指定軸で反転させる(Flipの安全ラッパー)
‘ flipType: 0 = 水平反転 (Horizontal), 1 = 垂直反転 (Vertical)
‘ ——————————————————————————
Public Sub FlipShapeSafe(ByVal targetShape As Visio.Shape, ByVal flipType As Integer)
On Error GoTo ErrorHandler

If targetShape Is Nothing Then Exit Sub

‘ Visioの標準Flipメソッドは現在の状態に依存するため、
‘ ShapeSheetの FlipX / FlipY セルを監視・制御するアプローチが堅牢

Select Case flipType
Case 0 ‘ 水平反転
targetShape.Flip visFlipHorizontal
Case 1 ‘ 垂直反転
targetShape.Flip visFlipVertical
Case Else
Err.Raise vbObjectError + 1001, “FlipShapeSafe”, “無効な反転タイプが指定されました。”
End Select

Exit Sub

ErrorHandler:
MsgBox “図形の反転処理でエラーが発生しました: ” & Err.Description, vbCritical, “VBAエラー”
End Sub

‘ ——————————————————————————
‘ 実務用サンプル: 選択中のすべての図形を指定角度回転させる
‘ ——————————————————————————
Public Sub Sample_BatchRotateSelectedShapes()
‘ 画面描画を停止してパフォーマンスを極限まで高める(超重要)
Application.ScreenUpdating = False

Dim sel As Visio.Selection
Set sel = ActiveWindow.Selection

If sel.Count = 0 Then
MsgBox “回転させる図形を選択してください。”, vbExclamation, “情報”
GoTo Finally
End If

Dim shp As Visio.Shape
Dim targetAngle As Double
targetAngle = 45.0 ‘ 例: 一律45度回転

For Each shp in sel
‘ グループ内の個別シェイプか、マスターシェイプかを考慮
Call RotateShapeAbsolute(shp, targetAngle)
Next shp

Finally:
‘ 確実に描画を復帰させる
Application.ScreenUpdating = True
Set sel = Nothing
End Sub

4. プロジェクトリーダーが伝える「実務設計の鉄則」

上記のコードをベースに、さらに大規模な自動化システム(データベースからの設備レイアウト自動生成など)を構築する際、必ず守るべき設計思想を授ける。

① `Application.ScreenUpdating = False` の徹底

数千個に及ぶフローチャートのシンボルやプラント図の機器をプログラムで一斉に回転・反転させる時、画面描画(ScreenUpdating)が有効のままだと、Visioは1回図形を動かすたびに画面を再描画し、処理が数百倍遅くなる
必ず処理の冒頭で `False` にし、エラーハンドラを通る経路を含めて、終わりの `Finally` ブロックで確実に `True` に戻すこと。

② グループ化された図形(Group Shape)の罠

複合的な機器を表す図形は、大抵が「グループ」になっている。
グループ内のサブシェイプに対して単体で `Rotate` や `Flip` をかけると、グループ全体の構造が破壊され、見た目がめちゃくちゃになる。

  • 全体を回したい場合: 必ず親シェイプ(Group Shape)に対して処理を行う。
  • 個別を回したい場合: グループを開いた状態(`Open()` メソッド、またはイテレーション)で対象を特定する。

③ データベース/外部ファイル連携時の座標系バグ回避

ExcelやSQL Serverから「X=100, Y=200の位置に、角度90度で配置せよ」という指示を受け取ったとする。
ここで、「配置してから回転させる」のか、「回転させてから配置する」のかで結果が変わる場合がある(ピンの位置が中央以外にある場合)。
プロとしてのあるべき姿は、「図形を生成・配置する ➔ ピンの位置を確認・補正する ➔ 最後に絶対角度(Angle)と反転状態を確定させる」という一連のトランザクションを1つの関数にカプセル化することだ。順序を間違えてはならない。

総括

Visio VBAにおける図形の回転・反転は、単なるビジュアルの変更ではない。それは「座標系とShapeSheetの数理モデルをプログラムから完全に支配すること」と同義である。

行き当たりばったりのコードを書く時代は終わった。
ここに記した堅牢な設計とロジックを武器に、誰よりも高速で、バグの 1 つも起きない洗練された自動化ツールをあなたの現場で実装してほしい。健闘を祈る。

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