こんにちは! Visioの自動化の世界へようこそ。
マクロの記録ボタンを押して「動いたはいいけれど、中身が呪文のようで手直しできない……」そんなモヤモヤを抱えていませんか?
大丈夫、今日その壁を華麗に突破しましょう。
今回は、Visio VBA中級者への登竜門であり、業務効率化で最も差がつく「`Shape.Characters`プロパティを使ったテキストの動的装飾」を徹底解説します。
「シェイプ内の文字の一部だけを赤字にする」「特定のキーワードだけフォントサイズを変える」――これが自由自在になると、アラート表示やステータス管理図の自動生成など、作図の自動化レベルが一段と跳ね上がります。
さあ、知的でスマートなVisio自動化の旅を始めましょう!
—
1. なぜ「Shape.Characters」が必要なのか?(基本概念の理解)
通常、Visioのシェイプに文字を入れるとき、私たちは次のようなコードを書きますよね。
‘ シェイプ全体のテキストを一括設定する(基本)
myShape.Text = “ステータス: 正常”
これでも文字は入ります。しかし、この `myShape.Text` というプロパティは、「シェイプ全体という1つの塊(かたまり)」に対してしか文字や書式を設定できません。「『正常』の文字だけを赤くして、他は黒のままにしたい」というリクエストには、残念ながら答えてくれないのです。
そこで登場するのが、`Shape.Characters`(キャラクターズ)オブジェクトです。
これは、シェイプの中に流し込まれた文字列の「文字位置(どこからどこまで)」を指し示す、いわばテキストの編集用カーソルのようなものです。これを使うと、文字列の中の一部分だけを切り出し、フォントの色、サイズ、太字などの書式を自由自在にコントロールできるようになります。
—
2. 【実践】文字列の一部だけを赤字にするメカニズム
文字の一部を装飾する手順は、VBAの世界では非常にシンプルです。
1. ターゲットのシェイプを特定する
2. `Characters` プロパティの範囲(何文字目から何文字目まで)を指定する
3. その範囲に対して `Color` などのプロパティを適用する
言葉だけだと難しく感じるかもしれないので、まずは「シェイプ内の特定のキーワード(例: `[ERROR]`)を検出し、その部分だけを赤字にする」という実用的なコードを見てみましょう。
実用VBAコード例
Sub HighlightKeywordRed()
Dim shp As Visio.Shape
Dim charObj As Visio.Characters
Dim targetText As String
Dim keyword As String
Dim startPos As Long
‘ 1. アクティブウィンドウで選択されている最初のシェイプを対象とする
If ActiveWindow.Selection.Count = 0 Then
MsgBox “シェイプを選択してください。”, vbExclamation, “処理中断”
Exit Sub
End If
Set shp = ActiveWindow.Selection(1)
‘ 2. キーワードの定義
keyword = “[ERROR]”
targetText = shp.Text
‘ 3. シェイプのテキスト内にキーワードが含まれているか検索
startPos = InStr(1, targetText, keyword, vbTextCompare)
If startPos > 0 Then
‘ — ここが今回の核心! —
‘ Characters(開始位置, 文字数) で装飾したい範囲を指定する
Set charObj = shp.Characters(startPos, Len(keyword))
‘ フォントの色を赤(RGB: 255, 0, 0)に変更
charObj.Font.Color = RGB(255, 0, 0)
‘ ついでに太字にしてみる
charObj.Style = visBold
MsgBox “‘” & keyword & “の部分を赤字に装飾しました!”, vbInformation, “完了”
Else
MsgBox “指定されたキーワード ‘” & keyword & “‘ が見つかりませんでした。”, vbInformation, “通知”
End If
End Sub
—
3. コードの注目ポイントと「現場の罠」
上記のコードで、Visio VBAのテキスト操作の基本はバッチリですが、実務で使う際にはいくつか「知っていないとハマる罠」があります。シニアエンジニアからのアドバイスとして、心に留めておいてほしいポイントを3つ伝授します。
罠①:改行コードや文字数のカウントズレ
Visioのシェイプ内で改行(`Chr(13)` など)が含まれている場合、`InStr` 関数での位置ズレや、意図しない範囲が装飾される原因になります。テキストを処理する際は、事前にシェイプのテキストから余計な改行や前後の空白(`Trim`関数など)を整理する癖をつけておくと安全です。
罠②:Charactersプロパティの「重み」
`Shape.Characters` は非常に強力ですが、ループ処理の中で何千回も呼び出すと、画面の描画更新(画面のチラつき)が発生し、マクロの実行速度が著しく低下します。
もし大量のシェイプを一度に処理する場合は、マクロの実行前に以下のコードを挟んで画面描画をロックするのがプロの技です。
‘ 処理速度を爆発的に上げるおまじない
Application.ScreenUpdating = False
‘ — 大量処理のコードをここに記述 —
Application.ScreenUpdating = True
罠③:一度設定した書式の上書き
`Characters` オブジェクトで部分的に色を変えた後で、もう一度 `shp.Text = “新しい文字列”` などとシェイプ全体のテキストを再代入すると、せっかく設定した部分的な色や太字の装飾はすべてリセットされてしまいます。 テキストの更新と装飾は「テキストを確定させてから最後に装飾する」という順序を守りましょう。
—
まとめ:ここをクリアすればVisio VBAの基本はバッチリ!
今回は `Shape.Characters` プロパティを使って、シェイプ内の一部文字列を動的に赤字にする方法を解説しました。
- `shp.Text` は全体を扱うもの。
- 部分的な装飾には `shp.Characters(開始位置, 文字数)` を使う。
- 大量処理のときは `Application.ScreenUpdating = False` で高速化する。
この3つさえ押さえておけば、単なる「お絵描きツール」としてのVisioではなく、「データ連動型のダイナミックなビジュアルシステム」としてVisioを自在に操ることができるようになります。
日々の資料作りや、ステータス管理図の自動更新などの現場で、ぜひこのテクニックを活かしてみてください。あなたのVBAスキルが、また一段と輝くはずです。それでは、次回の高度な自動化の世界でお会いしましょう!
