こんにちは! Visioの自動化の世界へようこそ。
マクロの記録ボタンを押して、生成されたコードを眺めてみたものの、「なんだかよく分からない呪文のようだぞ…」と途方に暮れていませんか?
大丈夫です。その気持ち、よく分かります。
今回は、Visio VBAの基礎のキモであり、ドキュメント自動化において最強の武器となる「図形テキストへの自動更新フィールド(Page番号やファイル名など)の動的挿入」について徹底解説します。
ここをクリアすれば、単なる「お絵描きツール」としてのVisioではなく、「データと連動するスマートな図面生成エンジン」としてのVisio VBAの基本はバッチリです。一緒にマスターしていきましょう!
—
1. なぜ「Shape.Characters.AddCustomField」なのか?
図形のテキストを変更したいとき、通常は `Shape.Text = “Hello”` のように書きますよね。しかし、これだと「固定の文字列」しか入りません。
図面を別の名前に保存したり、ページが増減したりしたとき、「ファイル名」や「ページ番号」がそのまま固定文字だったら困ってしまいますよね。そこで登場するのが、カスタムフィールド(Custom Field)です。
Visioの画面上で、リボンの「挿入」>「フィールド」から、ファイル名や日付を埋め込んだ経験はありませんか? あの操作をVBAで完璧に再現するのが、`Shape.Characters.AddCustomField` メソッドです。
Visioオブジェクト階層のイメージ
このメソッドを理解するには、Visioのオブジェクトがどういう階層構造になっているかを知る必要があります。
Application (Visioアプリ)
┗ Document (図面ファイル)
┗ Page (ページ)
┗ Shape (図形)
┗ Characters (文字の流し込み口)
┗ AddCustomField (自動更新フィールドの挿入)
「シェイプの中にある文字(Characters)に対して、自動更新するフィールドをねじ込む」というイメージです。この道筋さえ見えていれば、怖くありません。
—
2. 【実践】ファイル名とページ番号を自動挿入するVBAコード
百聞は一見にしかず。まずは、現在選択している図形に「ファイル名」と「作成日時」のフィールドを流し込む実用的なコードを見てみましょう。
開発タブのVisual Basic Editorを開き、標準モジュールに以下のコードを貼り付けてみてください。
Sub InsertAutoFieldsToSelectedShape()
Dim vsoShape As Visio.Shape
Dim vsoChars As Visio.Characters
‘ 1. 選択している図形があるかチェック
If ActiveWindow.Selection.Count = 0 Then
MsgBox “テキストを挿入したい図形を選択してください。”, vbExclamation, “入力エラー”
Exit Sub
End If
‘ 2. 選択中の先頭の図形を取得
Set vsoShape = ActiveWindow.Selection(1)
‘ 3. 図形がテキストを受け入れ可能か確認(保護されていないか等)
If vsoShape.CellExists(“LockTextEdit”, visExistsLocally) Then
If vsoShape.Cells(“LockTextEdit”).ResultIU <> 0 Then
MsgBox “この図形はテキスト編集がロックされています。”, vbCritical
Exit Sub
End If
End If
‘ 4. Charactersオブジェクトを取得し、テキストを初期化
Set vsoChars = vsoShape.Characters
vsoChars.Text = “【自動更新ドキュメント】” & vbCrLf & “ファイル名: ”
‘ 文字列の末尾(フィールドを挿入したい位置)に移動
vsoChars.Begin = vsoChars.End
vsoChars.End = vsoChars.End
‘ 5. 【核心】ファイル名フィールドの挿入
‘ FormulaLang:=visFmlaLangUI, Format:=visFCtlFormatGeneral 等を指定
vsoChars.AddCustomField “DocName()”, visFCtlFormatGeneral
‘ 改行を挟んで、今度はページ番号を追加
vsoChars.Text = vsoChars.Text & vbCrLf & “ページ番号: ”
vsoChars.Begin = vsoChars.End
vsoChars.End = vsoChars.End
‘ 6. ページ番号フィールドの挿入
vsoChars.AddCustomField “PageNumber()”, visFCtlFormatGeneral
MsgBox “図形へのフィールド挿入が完了しました!”, vbInformation, “成功”
End Sub
—
3. コードの急所:ここが分かると一気に深まるポイント
上記のコードで、特に重要なポイントを先輩エンジニアの視点で解説します。
① `Characters.Begin` と `Characters.End` の概念
VBAで文字を操作するとき、`Begin` と `End` は「カーソルの位置(選択範囲)」を表します。
フィールドを挿入したいときは、「文字の末尾にカーソルを合わせてから、そこにフィールドを埋め込む」という手順を踏む必要があります。
コード内で `vsoChars.Begin = vsoChars.End` と書いているのは、「カーソルを一番後ろに移動させ、選択範囲の幅をゼロ(単なる挿入点)にする」というお作法です。ここをサボると、既存の文字が上書きされて消えてしまいます。
② `AddCustomField` の引数の正体
`vsoChars.AddCustomField “DocName()”, visFCtlFormatGeneral`
この第一引数に渡している `”DocName()”` は、Visioのシェイプシート(ShapeSheet)関数そのものです。
Visioでは、`.Visio` が内部で持っている数式エンジンを使って動的データを取得しています。他にも以下のような関数が使えます:
- `”DocName()”` : ファイル名
- `”PageNumber()”` : 現在のページ番号
- `”NumberOfPages()”` : 総ページ数
- `”Time()”` または `”Date()”` : 現在の日付・時刻
—
4. 初学者が必ずハマる「罠」と回避策
Visio VBAで自動フィールドを扱う際、多くの人が次のようなエラーや現象に直面します。事前に知っておけば怖くありません。
罠1:文字が文字化けではなく「関数名そのもの」で表示されてしまう
- 原因: `AddCustomField` の第一引数を日本語や間違った文字列で指定した場合や、数式としての評価タイミングの問題。
- 対策: 第一引数は必ずVisioが認識する英語の関数名(`DocName()` や `PageNumber()` など)を文字列として渡してください。
罠2:図形にテキストボックスが含まれていない・またはグループ図形である
- 原因: グループ化された親シェイプに対して直接 `Characters` を操作しようとすると、テキストを持てずにエラーになることがあります。
- 対策: テキストを持たせたい「子シェイプ(正確にはテキストフレームを持つシェイプ)」を指定しているか確認してください。
—
おわりに:ここから先の世界へ
今回は `Shape.Characters.AddCustomField` を使って、図形の中に動的な情報を流し込む手法を解説しました。
このテクニックが使えるようになると、例えば以下のような「完全自動化された業務図面システム」が作れるようになります。
- 社内データベースから取得した案件情報を、VBAで一括して図形に流し込み、ファイル名や更新日を自動で刻印する。
- 何百ページもあるプラント図やネットワーク図のページ番号を一瞬で整える。
「マクロの記録」の向こう側にある、オブジェクトを意図通りに操る爽快感。ぜひ自分の手でコードを動かして、体感してみてください。
あなたのVisio自動化ライフが、よりスマートで快適なものになりますように。それでは、次のステップでお会いしましょう!
