【入門編】図形テキストの高度な制御:Charactersプロパティを使ったシェイプ内文字列の部分書式設定 – Visio VBA解析バイブル

スポンサーリンク

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で、文字を自由に踊らせてみてください。何か詰まったら、いつでも戻ってきてくださいね。応援しています。

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