Visio VBAの真髄:全ページ・全シェイプの文字列を一括置換する「探索者」の作り方
こんにちは。業務自動化の深淵へようこそ。
Visioのマクロ記録機能に頼り切りだった日々を卒業し、今まさに「自動化の設計図」を描こうとしているあなたへ。
VisioのVBAは、単なる「操作の記録」ではありません。「オブジェクトモデル」という名の広大な地図を、あなたのコードで縦横無尽に駆け巡る冒険です。今日は、その第一歩として「ドキュメント内の全ページ・全シェイプを巡回し、文字列を置換する」という、実務で最も要望の多い処理を実装してみましょう。
ここをマスターすれば、Visio VBAの基本構造は完全にあなたの掌中に収まります。
—
1. Visioオブジェクトモデルの「階層構造」を理解する
コードを書く前に、Visioの世界がどう構成されているかを地図として頭に入れましょう。
- Application: Visioそのもの(神の視点)
- Document: 開いているファイル(設計図の束)
- Page: ページ(キャンバス)
- Shape: 図形(線、四角、文字…すべてはここにある)
私たちは、「Document → Page → Shape」という順序で、マトリョーシカを開くようにオブジェクトを掘り下げていくことになります。
—
2. 検索・置換マクロ:実装コード
以下のコードは、現在のドキュメント内の全てのページ、全てのシェイプを巡回し、指定した文字列を置換するエンジンです。
Sub FindAndReplaceText()
Dim doc As Visio.Document
Dim pg As Visio.Page
Dim shp As Visio.Shape
Dim strTarget As String, strReplacement As String
‘ 検索・置換したい文字列を定義
strTarget = “旧プロジェクト名”
strReplacement = “新プロジェクト名”
Set doc = ActiveDocument
‘ 1. ドキュメント内の全ページを巡回
For Each pg In doc.Pages
‘ 2. ページ内の全シェイプを巡回
For Each shp In pg.Shapes
‘ テキストが含まれているかチェック
If InStr(shp.Text, strTarget) > 0 Then
‘ Replace関数で置換して代入
shp.Text = Replace(shp.Text, strTarget, strReplacement)
End If
Next shp
Next pg
MsgBox “置換が完了しました。”, vbInformation
End Sub
—
3. このコードが「プロの第一歩」である理由
① `For Each` 文の優位性
`For i = 1 To pg.Shapes.Count` という書き方もできますが、`For Each` を使うのがプロの流儀です。これは「数え上げ」ではなく「存在するものすべてに触れる」という考え方であり、コレクションの数に依存しないため、エラーのリスクが低く、コードが格段に読みやすくなります。
② `InStr` 関数の賢い使い方
`If InStr(shp.Text, strTarget) > 0 Then`。
全てのシェイプに対して無差別に置換をかけるのではなく、「対象が含まれているか」を確認してから実行する。この「無駄な書き込みを避ける」という意識が、将来的に数千個のシェイプを扱う大規模図面を扱う際、パフォーマンスの劇的な差となって現れます。
—
4. 初学者が陥りやすい「落とし穴」
現場でよくある失敗事例と、それを回避する知恵を授けます。
- 「グループ化された図形」の罠
上記のコードは「ページに直接配置されたシェイプ」しか見ません。グループ化した図形の中にあるテキストは、このコードでは見逃してしまいます。
解決策: `If shp.Type = visTypeGroup Then …` と判定し、再帰処理(関数が自分自身を呼び出す処理)を行う必要があります。これは中級編の楽しみにとっておきましょう。
- 「保護」されたシェイプ
シェイプが「ロック」されている場合、`shp.Text = …` でエラーが出ます。これを防ぐには、事前に`shp.Protection`属性をチェックするガードコードを挟むのがプロの設計です。
—
最後に:自動化は「効率」ではなく「自由」
最初から完璧なコードを書こうとしないでください。まずは、このマクロを動かして「全ページを一瞬で書き換える」という体験をしてください。
「Visioを動かされる側」から「Visioを動かす側」へ。
あなたが書いたこの10数行のコードが、何時間もの手作業をゼロにし、あなたの創造的な時間を生み出します。さあ、VBE(Visual Basic Editor)を開いて、あなたの手でこのコードに命を吹き込んでみてください。
何か詰まったら、いつでも戻ってきてください。私たちは常に、自動化という名の冒険の途上にいるのですから。
