【入門編】Shape.TextTransformセルのVBA書き換え:図形回転時にテキスト角度を常に水平保持する補正術 – Visio VBA解析バイブル

スポンサーリンク

こんにちは! Visioの図面自動化の世界へようこそ。
マクロの記録ボタンを押して、生成されたコードを眺めては「なんだこの呪文は……」と頭を抱えていませんか? 大丈夫、そのモヤモヤを解消する瞬間がやってきました。

今回は、Visio VBAの基礎とオブジェクトモデルの核心に迫りながら、実務でめちゃくちゃ重宝する「図形を回転させても、中のテキストは常に水平をキープする魔法の補正術」を授けましょう。

ここをクリアすれば、Visio VBAのオブジェクト構造の本質がグッと見えてきます。優しく、そして深く解説していくので、リラックスしてついてきてくださいね!

1. なぜ「図形を回転させると文字まで傾く」のか?

Visioで四角形や吹き出しを描き、その中に文字を入力したとします。その図形をマウスでグイッと45度傾けたとき、何が起きるでしょうか?

当然、中の文字も一緒に45度傾きますよね。
図面やフローチャートの種類によっては「これでいいや」となりますが、レイアウト図やプラント図、あるいは整然としたドキュメントを作っているとき、「図形は斜めを向いているのに、文字は真っ直ぐ水平であってほしい」というシチュエーションに出くわします。

これを手動でやろうとすると、図形を回転させたあとに、テキストツールで文字だけを逆向きに回転させる……という、気が遠くなるような作業が必要です。
――であれば、VBAに図形の角度を監視させ、文字の角度を自動で打ち消せばいい。 そう思いませんか?

2. Visioオブジェクトモデルの基礎:ShapeとShapeSheet

ここで、Visio VBAの基本に立ち返りましょう。
Visioの画面上にあるすべての線、四角形、グループなどは、VBAの世界ではすべて `Shape` オブジェクトと呼ばれます。

そして、それぞれの `Shape` は、内部に「ShapeSheet(シェープシート)」というExcelのセルのようなデータベースを持っています。
図形の幅(Width)、高さ(Height)、そして角度(Angle)などは、すべてこのShapeSheetの「セル」として管理されています。

今回ターゲットにするのは、文字の角度を司る `TextTransform`(テキスト変形)セルの `TxtAngle`(テキスト角度) です。

  • `Shape.Angle` : 図形自体の回転角度
  • `TextTransform.TxtAngle` : 図形の中にあるテキストの回転角度

図形を回転させたとき、デフォルトではテキストの角度は図形の角度に追随します。つまり、テキストを常に水平(0度)に保ちたいなら、「図形の回転角度(Angle)が変化した瞬間に、テキストの角度(TxtAngle)をそのマイナス分だけ相殺する」ように書き換えればよいのです。

3. 実践!テキスト角度を水平保持するVBAコード

それでは、実際に動くコードを見てみましょう。
今回は、現在選択している図形(`ActiveWindow.Selection`)に対して実行するマクロを書きます。

以下のコードを、VisioのVBAエディタ([開発]タブ > [Visual Basic])の標準モジュールに貼り付けてください。

Sub KeepTextHorizontal()
‘ — 変数の宣言 —
Dim vsoShape As Visio.Shape
Dim currentAngle As Double

‘ 1. エラーハンドリング:何も選択されていない場合の対策
If ActiveWindow.Selection.Count = 0 Then
MsgBox “文字を水平に保たい図形を選択してください。”, vbExclamation, “選択エラー”
Exit Sub
> End If

‘ 2. 処理の高速化と画面ちらつき防止
Application.ScreenUpdating = False

‘ 3. 選択されている図形を一つずつループ処理
For Each vsoShape In ActiveWindow.Selection

‘ グループ図形などの特殊なケースでエラーが出ないよう保護
On Error Resume Next

‘ 図形自体の現在の回転角度(ラジアン)を取得する
‘ ※Visioの内部計算はラジアンで行われます
currentAngle = vsoShape.Cells(“Angle”).ResultIU

‘ 【核心】
‘ 図形が回転している角度(currentAngle)を打ち消すため、
‘ テキストの角度(TxtAngle)に「-currentAngle」を代入する
‘ これにより、文字盤だけが常に初期位置(水平)を維持します。
vsoShape.CellsU(“TxtAngle.FormulaU”) = “-” & currentAngle

On Error GoTo 0

Next vsoShape

‘ 4. 画面描画を復元
Application.ScreenUpdating = True

MsgBox “選択された図形のテキストを水平に補正しました!”, vbInformation, “完了”

End Sub

コードのここがポイント!

  • `CellsU` プログラム用プロパティ: Visio VBAでは、言語の違い(日本語版・英語版)によるエラーを防ぐため、プログラム内では常にグローバル名(`CellsU` や `.FormulaU`)を使うのがプロの鉄則です。
  • `ResultIU`: 単位(度、ラジアン、ミリメートルなど)を気にせず、Visioの内部単位(Internal Units = 基本はラジアンやインチ)で値を取り出すための強力なプロパティです。
  • マイナスで相殺する発想: 図形が右に30度($+\theta$)傾いたなら、テキストを左に30度($-\theta$)戻す。この直感的な数学的アプローチが、VBAなら一瞬で実行できます。

4. 初学者が陥りやすい罠とエラー回避のコツ

Visio VBAを書き始めると、必ずと言っていいほど次のような壁にぶつかります。ここを知っておくだけで、開発スピードが何倍も変わりますよ。

① 「この図形にはそのセルがありません」エラー

すべての図形にすべてのShapeSheetセルが存在するわけではありません。例えば、一部の古いマスターシェイプや特殊なグループ図形では、テキストセルの構造が異なる場合があります。

  • 対策: サンプルコードにも入れている `On Error Resume Next` を活用し、万が一エラーが出る図形に出くわしてもマクロが止まらずに次の図形へ進むように「プチ耐性」をつけておきましょう。

② 度(Degree)とラジアン(Radian)の罠

人間は「90度」「45度」と度数法で考えますが、Visioの内部計算は「ラジアン」が基本です。
今回の `Cells(“Angle”).ResultIU` はラジアンで値を返すため、そのまま `-currentAngle` とすることで、単位の変換を気にせず完璧に角度を打ち消すことができます。ここを下手に「45」などの数値で計算しようとすると、盛大にズレるので注意してくださいね。

5. さらに高みを目指すあなたへ(チーフアーキテクトからの助言)

今回のコードは「ボタンを押した瞬間に実行する(静的な補正)」ものでした。
しかし、真の自動化エンジニアを目指すなら、「図形をマウスでグリグリ回したリアルタイムに、文字が勝手に水平を維持し続ける」仕組みを作りたくありませんか?

それには、Visioの `Shape` が持つ `ShapeChanged` イベント`CellChanged` イベント を監視するクラスモジュール(Class Module)の技術が必要になります。

「図形が動いた」というイベントをトリガーにして、先ほどのコードをバックグラウンドで自動実行させるのです。ここまで来れば、あなたはもう初心者ではありません。立派なVisio VBAエンジニアです。

まずは今回の「選択した図形のテキストを綺麗に水平に戻すマクロ」を自分の環境で動かし、ShapeSheetとVBAの繋がりを体感してみてください。
ここをクリアすれば、Visio VBAの基本はバッチリです。あなたの自動化ライフの成功を応援しています!

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