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

スポンサーリンク

こんにちは!Visio VBAの自動化の世界へようこそ。
マクロの記録ボタンを押して出てきたコードをそのまま動かしてみたものの、「あれ、なんだか意図しない変な方向に図形がねじれちゃったぞ…?」と頭を抱えた経験はありませんか?

図形の回転や反転は、フローチャートの向きを変えたり、レイアウトを整えたりする上で避けて通れない重要ポイントです。しかし、Visioの座標系とオブジェクトモデルの癖を知らずにコードを書くと、図形があらぬ方向へ飛んでいったり、計算が狂ったりする「迷宮」に入り込みがちです。

大丈夫。ここをクリアすれば、Visio VBAの基本と「姿勢制御の極意」はバッチリです!
今回は、伝説のチーフアーキテクトである私から、Shapeオブジェクトの姿勢を自由自在に操るための実践的な知見を優しく、そして深く伝授しましょう。

1. Visioの「回転・反転」を捉える2つのアプローチ

Visio VBAで図形を回転・反転させる手段には、大きく分けて2つのアプローチがあります。

1. メソッドを使う方法 (`Flip` や `Rotate` メソッド)

  • 直感的に「右に90度回す」「左右反転する」といった操作を命令できます。

2. シェイプシートのセルを直接書き換える方法 (`Angle` セルや `LocPin` セル)

  • 「絶対にこの角度にする」「中心を軸にして正確に回転させる」という厳密な制御に向いています。

実務の現場では、この2つを使い分ける(あるいはセルの書き換えに一本化する)のが、バグを出さないための最大のコツです。それぞれの正体と使い方を見ていきましょう。

2. メソッドによる簡易操作:`Flip` と `Rotate`

まずは、手っ取り早く図形の向きを変えるメソッドの紹介です。

左右・上下反転:`Flip` メソッド

図形を鏡写しのように反転させたいときは `VisFlipDirection` 列挙体を使います。

‘ 選択している図形を水平(左右)反転する
ActiveWindow.Selection(1).Flip visFlipHorizontal

‘ 選択している図形を垂直(上下)反転する
ActiveWindow.Selection(1).Flip visFlipVertical

角度を指定した回転:`Rotate` メソッド

`Rotate` メソッドは、現在の角度から相対的に何度回転させるか、あるいは絶対的なラジアン角を指定して回すためのものです。

Dim shp As Visio.Shape
Set shp = ActiveWindow.Selection(1)

‘ 現在の向きから時計回りに 90度(π/2ラジアン)回転させる
‘ 引数:Angle, PinFlag (visRotatePin または visRotateAngle)
shp.Rotate 3.14159265358979 / 2, visRotateAngle

【チーフのワンポイント注意】
`Rotate` メソッドはラジアン指定(度数法ではない!)が必要なことや、現在の状態からの相対変化になりがちなため、複雑なレイアウト自動化では「意図しない角度にズレる」というエラーの温床になりやすいです。
そこで、プロの現場では次章で紹介する「シェイプシートのセル直接制御」を好んで使います。

3. 現場の決定版!`Angle` セルによる絶対的な姿勢制御

Visioのすべての図形は、内部に「シェイプシート」という強力なパラメータ表を持っています。その中の `Angle` セル を書き換えることで、「何度であろうとも、一発で指定の角度(絶対角度)にする」という正確無比な制御が可能になります。

ここで重要なのは、角度を変えるときの「回転の中心(ピン)」です。どこを軸にして回転するかを意識しないと、図形があらぬ方向へ移動してしまいます。

実践:図形を「中心基準」で「正確に45度」に回転させるコード

以下のコードは、選択中の図形の回転中心をシェイプの中心に固定し、ピタリと45度(ラジアン変換)に傾ける実用的なマクロです。

Sub RotateShapePrecisely()
Dim shp As Visio.Shape

‘ 1. 何も選択されていない場合のガード処理
If ActiveWindow.Selection.Count = 0 Then
MsgBox “回転させたい図形を1つ選択してください。”, vbExclamation
Exit Sub
End If

Set shp = ActiveWindow.Selection(1)

On Error GoTo ErrorHandler

‘ 2. 処理の高速化と画面描画のロック(お作法)
Application.ScreenUpdating = False

‘ 3. 回転の中心(LocPinX / LocPinY)を「図形の中心」に設定
‘  ※ Width0.5 と Height0.5 で図形の中央を指定します
shp.CellsU(“LocPinX”).FormulaU = “Width0.5”
shp.CellsU(“LocPinY”).FormulaU = “Height0.5”

‘ 4. Angleセルに「度数」をラジアンに変換して代入する
‘  ※ Visioのシェイプシートは内部でラジアンを保持します (45度 = 45 3.14159 / 180)
Dim targetAngle As Double
targetAngle = 45 ‘ ここに好みの角度(度数)を入れる

shp.CellsU(“Angle”).FormulaU = targetAngle & ” (3.14159265358979 / 180)”

Application.ScreenUpdating = True
MsgBox “図形を正確に 45度 回転させました!”, vbInformation
Exit Sub

ErrorHandler:
Application.ScreenUpdating = True
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End Sub

4. 陥りやすい罠:「あれ、反転させたら文字まで逆さになったぞ?」

図形の反転(`Flip`)を行った際、初学者が最もハマる罠がこれです。
「四角い箱のなかに文字(テキスト)が入っている図形」を水平反転させると、中の文字まで鏡文字(左右逆)になってしまう現象が起きることがあります。

なぜ起きるのか?

Visioの図形構造において、テキストブロックが図形の基本座標系と完全に同期している場合、図形そのものを裏返すとテキストごと反転してしまうためです。

華麗なる回避テクニック

もし「図形の枠の向きは変えたいが、中の文字は正立のままにしたい」あるいは「きれいに左右反転させたい」場合は、`Flip` メソッドに頼るのではなく、シェイプシートの `LocPin`(回転・反転の基準ピン)スケーリング(Width/Heightのマイナス反転) をコントロールするか、あるいはマスターシェイプ自体の構造を見直す必要があります。

実務の簡易的なハックとして、テキストブロックの反転を防ぎたい場合は、シェイプシートの `TxtAngle`(テキストの角度)を逆向きに補正するか、テキストを別シェイプとして分離・グループ化する設計をとるのがプロの現場の知見です。

5. まとめ

今回は、Visio VBAにおける図形の回転と反転、そして正確な姿勢制御の技術を解説しました。

  • 簡単な反転なら `Flip` メソッドが手軽。
  • 正確な角度指定なら シェイプシートの `Angle` セルと `LocPin` を組み合わせるのが最強。
  • 画面のチラツキ防止 (`ScreenUpdating = False`) も忘れないプロの配慮。

ここをマスターすれば、複雑な配管図やネットワーク図、自動生成されるフローチャートのレイアウトエンジンをあなた自身の手で完全にコントロールできるようになります。

「ここをクリアすれば、Visio VBAの基本はバッチリですよ!」
自信を持って、次の自動化のステップへ進んでください。あなたの開発ライフが素晴らしいものになることを応援しています!

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