こんにちは!Visioの自動化に挑むあなたの前に、必ずと言っていいほど立ち塞がる「壁」があります。そう、「Shape.Textに文字を代入したら、せっかく作り込んだフォントサイズや色が一瞬で消え去った(リセットされた)」という悪夢です。
マクロの記録を頼りにコードを書いたはいいものの、文字を流し込んだ瞬間に図形がすっぴんのデフォルト状態に戻ってしまう……。この現象に頭を抱えた開発者は数知れません。
今回は、このVisio VBA最大のトラップを華麗に回避し、「部分書式(スタイル)を完璧に保持したままテキストを書き換える極限の知見」をあなたに伝授します。ここをクリアすれば、Visio VBAの基礎はバッチリですよ。一緒に本質をマスターしていきましょう!
—
なぜVisioは文字を入れるとスタイルが壊れるのか?
Visioのオブジェクトモデルにおいて、`Shape.Text = “新しい文字列”` というコードは、「図形の中にある全てのテキストと、それに紐づく文字単位の書式(Characterプロパティ)を一度きれいさっぱり破壊し、デフォルトの文字スタイルで新しい文字列を流し込む」という暴挙を意味しています。
Visioの文字(Charactersオブジェクト)は、文字位置(BeginとEnd)ごとに書式を保持しています。単純な代入を行うと、この文字のレンジ(範囲)情報がリセットされてしまうため、苦労して設定した色やサイズが吹き飛んでしまうのです。
これを防ぐためには、「既存のテキストの長さを正確に把握し、そのレンジを指定してピンポイントで書き換える」か、あるいは「ShapeSheetのセクションを直接叩く」アプローチが必要になります。
—
解決アプローチ:Charactersオブジェクトを支配する
まずは、最も王道かつ安全な `Characters` オブジェクトを使った部分書き換えテクニックを見ていきましょう。
以下のコードは、選択している図形の文字スタイルを破壊せずに、テキストの中身だけを安全に差し替える実用的なプロシージャです。
Sub SafeUpdateText()
Dim shp As Visio.Shape
Dim chars As Visio.Characters
‘ 1. 図形が選択されているかチェック
If ActiveWindow.Selection.Count = 0 Then
MsgBox “テキストを変更する図形を選択してください。”, vbExclamation
Exit Sub
End If
Set shp = ActiveWindow.Selection(1)
‘ 2. Charactersオブジェクトを取得
Set chars = shp.Characters
‘ 【重要】ここがポイント!
‘ BeginとEndを指定することで、既存の文字レンジ全体をターゲットにします。
‘ これにより、文字単位ですでに設定されている個別の色やサイズを保持したまま
‘ 文字列の中身だけをスワップ(置換)できます。
chars.Begin = 0
chars.End = chars.CharCount
‘ テキストの書き換え
chars.Text = “【更新完了】” & vbCrLf & “元のスタイルは保持されています”
‘ 3. オブジェクトの解放(VBAのメモリ管理の基本です)
Set chars = Nothing
Set shp = Nothing
MsgBox “スタイルを保持したままテキストを更新しました!”, vbInformation
End Sub
コードの解説と心構え
- `shp.Characters`: このプロパティがテキスト操作の全ての鍵を握ります。
- `Begin` と `End` の指定: 全体を書き換える場合でも、あえて範囲(0からCharCountまで)を明示的に指定することで、Visioエンジンに「文字のコンテナ(枠)はそのまま、中身のテキストだけ差し替えてくれ」と伝えることができます。
—
さらに深部へ:ShapeSheetの「Charセクション」を操る極意
「文字の置き換えではなく、図形全体のデフォルトの文字サイズや色を、プログラムから安全に変更したい」という場面もあるでしょう。そんなときは、Visioの裏側にある設計図 ShapeSheet(シェープシート) を直接叩きます。
Visio VBAの真骨頂は、このShapeSheetのセル(Cell)を自在に操作できる点にあります。
Sub ModifyCharStyleDirectly()
Dim shp As Visio.Shape
If ActiveWindow.Selection.Count = 0 Then Exit Sub
Set shp = ActiveWindow.Selection(1)
‘ セルが存在するかエラーハンドリングを行いながらShapeSheetを書き換える
On Error GoTo ErrorHandler
‘ フォントサイズを「14pt」に変更 (Visio内部ではpt単位やFormulaで指定可能)
shp.CellsU(“Char.Size”).FormulaU = “14pt”
‘ フォントの色を赤色に変更 (RGB関数をVisioのRGB関数構文に変換してブキミなほどダイレクトに注入)
‘ 例: RGB(255, 0, 0)
shp.CellsU(“Char.Color”).FormulaU = “RGB(255,0,0)”
‘ 太字(Bold)にする: 0が通常、1が太字
shp.CellsU(“Char.Style”).FormulaU = “1”
MsgBox “ShapeSheet経由でスタイルを強制変更しました!”, vbInformation
Exit Sub
ErrorHandler:
MsgBox “この図形はテキストセクションを持っていません。”, vbCritical
End Sub
チーフアーキテクトからのアドバイス
`CellsU` メソッドを使うときは、必ず言語非依存の U(Universal)版 を使いましょう。日本語環境(`Cells`)と英語環境(`CellsU`)の差異によるバグを防ぐのは、プロフェッショナルなエンジニアの第一歩です。
—
現場でやりがちな「痛いエラー」と回避策
1. 「この図形にはテキストがありません」エラー (Error 91 / 別のエラー)
- 原因: テキストを持たない図形(線や単純な四角形など、初期状態でテキスト入力が許可されていないもの)に対して `shp.Characters` や `Char.` セルを叩いた場合に発生します。
- 対策: 操作前に `shp.CellExistsU(“Char.Size”, False)` などのメソッドでセルが存在するかどうかを事前にチェックする防衛的プログラミングを心がけましょう。
2. 改行コードの罠
- Visio内のテキスト改行は `vbCrLf` ではなく `vbCr`(Carriage Return)だけで処理されるべき場面が多いです。レイアウトが崩れる場合は改行コードの粒度を疑ってみてください。
—
おわりに
今回は、Visio VBAにおける最大の罠である「テキスト代入時のスタイル破壊」を防ぎ、`Characters` オブジェクトと `ShapeSheet` をスマートに連携させる手法を解説しました。
マクロの記録の先にある、オブジェクトモデルの「生きた挙動」を理解できれば、Visioの自動化はもはや敵ではありません。あなたの描く図面作成プロセスが、圧倒的なスピードと美しさに満ちたものになることを確信しています。
それでは、次回の極限の知見でお会いしましょう。お疲れ様でした!
