Visio VBAの真髄:Charactersオブジェクトでテキストを「操る」極意
こんにちは。自動化の現場でVisioと格闘し続けている皆さんに、今日は「図形内の文字装飾」という、一歩先行く魔法をお教えします。
「マクロの記録」で生成されるコードは、確かに便利です。しかし、図形内のテキストを「一部だけ赤くしたい」「特定のキーワードだけ太字にしたい」といった要件に直面したとき、マクロの記録は沈黙します。
Visioのオブジェクトモデルにおいて、テキストは単なる「文字列」ではなく、`Characters`オブジェクトという特別な階層によって管理されています。ここを理解すれば、あなたのVisio自動化は「置換」のレベルから「デザイン」のレベルへと劇的に進化します。
—
1. なぜ「Characters」オブジェクトが必要なのか?
Visioの図形(Shape)には、`Text`プロパティが存在します。しかし、`Shape.Text = “Hello”` と書くと、図形内のすべての文字が一気に置き換わってしまい、既存の書式はすべてリセットされます。
ここで登場するのが `Shape.Characters` です。
これは、「図形の中にあるテキストの『範囲』を特定し、その範囲に対してのみ属性(フォント、色、サイズ等)を適用する」ための窓口です。
思考の転換:範囲を「選択」する
`Characters`オブジェクトは、以下の2つの引数で範囲を特定します。
- Start: 開始位置(0から数えます)
- Length: 長さ(何文字分か)
例えば、`shp.Characters(0, 5)` とすれば、先頭から5文字分を指し示します。ここに対して `Char.Color = vbRed` と命令を送る。これが、Visio VBAでテキストを自在に操るための基本作法です。
—
2. 実践:特定のキーワードだけを強調するコード
現場で最もよく使う「特定のキーワードを見つけて、色と太さを変える」ロジックを書きましょう。
Sub HighlightKeyword()
Dim shp As Visio.Shape
Dim charRange As Visio.Characters
Dim targetText As String
Dim pos As Long
‘ 現在選択している図形を対象にする
Set shp = ActiveWindow.Selection(1)
targetText = “警告” ‘ 強調したいキーワード
‘ 図形内にテキストがあるか確認
If InStr(shp.Text, targetText) > 0 Then
‘ 位置を探す(VBAのInStrは1始まりなので、Characters用に調整)
pos = InStr(shp.Text, targetText) – 1
‘ Charactersオブジェクトを取得
Set charRange = shp.Characters(pos, Len(targetText))
‘ 属性を操作する
With charRange
.CharProps(visCharacterColor) = 2 ‘ 2は赤色(Visioカラーパレット)
.CharProps(visCharacterWeight) = visWeightBold ‘ 太字にする
End With
End If
End Sub
このコードのポイント
- `CharProps`プロパティ: これが書式設定の心臓部です。色やサイズ、フォントファミリーを直接指定できます。
- `visWeightBold`: Visioには直感的な定数が用意されています。定数を使うことでコードの可読性が格段に上がります。
—
3. 初学者が陥りやすい「罠」
Visio VBAで最も多いエラーは、「テキストの長さ」の不一致です。
- 罠1:`Characters`の範囲外指定
図形の文字数を超えた範囲(例:テキストが5文字なのに10文字目を指定)を`Characters`に渡すと、エラーが発生します。`Len(shp.Text)` を使って、常に安全な範囲を確認する癖をつけましょう。
- 罠2:置換後のCharactersオブジェクトの無効化
`Shape.Text` を一度でも書き換えると、それまで保持していた `Characters` オブジェクトの参照が無効になることがあります。「テキストを変更してから、その後に書式を適用する」という順序を徹底してください。
—
4. プロの現場での応用:動的なスタイル変更
大規模な図面で、特定のステータスに応じて文字色を自動変更するシステムを作る場合、以下のような関数を用意しておくと非常に強力です。
‘ 特定の範囲を指定してスタイルを適用する汎用関数
Sub ApplyStyle(shp As Visio.Shape, startPos As Long, length As Long, colorIdx As Integer)
Dim ch As Visio.Characters
Set ch = shp.Characters(startPos, length)
ch.CharProps(visCharacterColor) = colorIdx
End Sub
このように「ロジック(どこを)」と「属性(どう変える)」を切り離すことで、あなたのコードは保守性が高く、他の開発者にも感謝されるものになります。
—
最後に:自動化の先にあるもの
`Characters`オブジェクトを使いこなすことは、単なる「効率化」を超えて、図面という「情報のインターフェース」を最適化することです。
「ここをクリアすれば、Visio VBAの基本はバッチリですよ」。
最初は難しく感じるかもしれませんが、この小さなオブジェクトが、あなたの描く図面を、単なる絵から「データが息づくドキュメント」へと変えてくれます。
さあ、次はあなたのVisioで、文字を自由に踊らせてみてください。何か詰まったら、いつでも戻ってきてくださいね。応援しています。
