【入門編】図形のテキスト操作:Characterプロパティを使ったシェイプ内文字列の部分書式設定と自動流し込み – Visio VBA解析バイブル

スポンサーリンク

Visio VBAの深淵へ:Characterプロパティで操る「動的テキスト」の極意

こんにちは。現場で泥臭い自動化を積み重ねてきたエンジニアとして、今日は「Visioのテキスト操作」という深淵の入り口へあなたを案内します。

多くの人がマクロの記録で`Shape.Text = “Hello”`と書き換えて満足しますが、それだけではVisioの真の力は引き出せません。今回は、`Characters`オブジェクトを使いこなし、シェイプ内の特定の文字だけを自在に装飾・制御する、プロフェッショナルなテクニックを伝授します。

1. なぜ「Shape.Text」だけでは不十分なのか?

初心者が最初に陥る罠は、`Shape.Text` プロパティに文字列を代入して「終わり」にしてしまうことです。しかし、これでは「一部だけ赤文字にする」「特定の単語だけ太字にする」といった表現ができません。

Visioにおける文字列は、単なるテキストの塊ではなく、Characterオブジェクトが連なる「配列に近い構造体」として管理されています。この構造を理解することが、自動化の第一歩です。

2. Characterオブジェクトによる部分装飾のメカニズム

`Characters` プロパティを使うと、シェイプ内の「何文字目から何文字目まで」という指定が可能になります。

実践コード:特定の文字列だけを強調する

Sub FormatSpecificText()
Dim shp As Visio.Shape
Dim charObj As Visio.Characters

Set shp = ActivePage.Shapes(1) ‘ ターゲットのシェイプを取得
shp.Text = “ステータス:完了”

‘ Charactersオブジェクトを取得(引数は開始位置と文字数。-1は全選択を意味する)
‘ ここでは「完了」という文字(7文字目から2文字)を操作
Set charObj = shp.Characters(7, 2)

‘ 文字色を赤に設定(ColorプロパティはRGB値)
charObj.CharProps(visCharacterColor) = RGB(255, 0, 0)

‘ 太字にする
charObj.CharProps(visCharacterStyle) = visBold
End Sub

【知的な先輩のワンポイント】

`shp.Characters(0, 0)` と書くと「テキストの末尾」を指し示します。これを利用すると、既存のテキストを消さずに、末尾にどんどん情報を追記していく「ログ出力のようなテキスト生成」が可能になります。

3. 自動流し込み:レイアウト崩れを防ぐテクニック

動的にテキストを生成する際、最も恐ろしいのが「文字数オーバーでシェイプからはみ出る」ことです。これを防ぐには、テキストを流し込む前に「テキストの自動調整(Text Block)」のプロパティを制御しておく必要があります。

Sub DynamicTextInjection()
Dim shp As Visio.Shape
Set shp = ActivePage.DrawRectangle(1, 5, 4, 3)

‘ テキストの自動調整設定:テキストに合わせて図形を伸ばすか、そのままにするか
‘ TextBlockプロパティを調整することで、レイアウトを安定させる
shp.Cells(“TxtWidth”).Formula = “Width0.9” ‘ テキスト幅をシェイプの90%に固定

‘ 文字列の流し込み
shp.Text = “プロジェクト名:VBA自動化プロジェクト” & vbCrLf & _
“進捗:80%”

‘ 改行後のテキストを操作するなら…
‘ InStr関数でvbCrLfの位置を探し、そこから先のCharactersを操作するのが定石
End Sub

4. 陥りやすいエラーと回避策

エンジニアとして、現場で何度も見てきた「よくある失敗」を共有します。

1. シェイプがテキストを持たない場合:
`shp.Characters` を呼び出す前に、そのシェイプがテキストを保持できるか確認してください。テキストを持たないシェイプに対して実行すると、実行時エラーが発生します。

  • 解決策: `If shp.OneD = False Then …` などで図形の種類を確認するか、エラーハンドリングを必ず入れましょう。

2. Charactersの範囲指定ミス:
存在しない文字数を指定するとエラーになります。特に日本語(全角文字)は、Visioの内部処理でインデックスが複雑に感じることがあります。

  • 解決策: 文字数を取得する際は `Len(shp.Text)` を必ず使い、現在格納されている文字数を超えないようにループを制御してください。

最後に:自動化の先にある景色

ここをクリアすれば、あなたはもう「マクロの記録」に頼る初心者ではありません。

`Characters` を使いこなすということは、Visioの中に「動的なレポート機能」を組み込むことと同義です。例えば、Excelからデータを読み込み、進捗状況に応じて「完了なら青、遅延なら赤」と自動で色を変えるような、生きた図面を作成することも可能です。

Visioのオブジェクトモデルは一見複雑ですが、一度「シェイプはデータの入れ物である」という本質を掴んでしまえば、どんなに巨大な図面であっても、あなたのコードで自在に操ることができます。

次は、`ShapeSheet` との連携に挑戦してみませんか? それをマスターすれば、もう怖いものはありませんよ。頑張ってください!

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