こんにちは!Visio VBAの自動化の世界へようこそ。
マクロの記録ボタンを押して出てきたコードをそのまま貼り付けるだけのステージは、もう卒業しましょう。ここからは、Visioの心臓部である「オブジェクトモデル」と「ShapeSheet(シェイプシート)」を自在に操り、あなたの意のままに図面を動かす本物のエンジニアリングの世界です。
今回は、業務自動化で非常に要望の多い「テキストフィールドの動的フォーマット化(`FormatForArgs`セル)」をテーマに取ります。
「作成日や寸法、計算値の表示形式が、なぜか狙った通りにならない…」
「日付や通貨のフォーマットをVBAから一発で綺麗に整えたい!」
そんな現場の悩みを、チーフアーキテクトである私が優しく、かつ深く解説します。ここをクリアすれば、あなたのVisio VBAのスキルは一段上のステージに到達しますよ。
—
1. なぜVisioのテキスト整形は難しいのか?(基本概念の理解)
Visioの図形にテキストを表示するとき、単なる「静的な文字列」だけでなく、日付や数値、カスタムプロパティを動的に埋め込む「フィールド」という機能を使いますよね。
しかし、VBA初学者がここで必ずつまずくポイントがあります。
それは、「VBA側で `vba.Format` 関数を使って文字列にしてしまうと、Visioの動的なリンク(ライフサイクル)が切れてしまう」という点です。
Visioのスマートさを活かすには、文字列にしてしまうのではなく、「VisioのShapeSheet(計算Engine)に正しいフォーマット命令を直接書き込む」アプローチを取る必要があります。
ここで登場するのが、シェイプの裏側にある`FormatForArgs` セル(またはセルのフォーマット制御関数)です。
押さえておくべきオブジェクトの階層
Visio VBAで図形を操作するとき、私たちは常に以下のピラミッドを意識しています。
Application (Visio本体)
┗ Document (図面ファイル)
┗ Page (描画ページ)
┗ Shape (ターゲットの図形)
┗ Cell (ShapeSheetの特定セル ← ★ここを狙い撃つ!)
「Shape(図形)」そのものをいじるのではなく、その奥にある「Cell(セル)」の値を書き換える。これがVisio VBAの真髄です。
—
2. 【実践】日付と通貨のフォーマットをVBAで自動制御する
それでは、実際にコードを見ていきましょう。
以下のサンプルコードは、選択しているシェイプ(または新規作成したシェイプ)に対して、「①日付をショート形式(YYYY/MM/DD)にする」「②数値を通貨形式(¥#,
0)にする」という処理をVBAから行う実践的なスクリプトです。
開発タブのVisual Basic Editorを開き、標準モジュールに貼り付けて実行してみてください。
Sub FormatShapeFieldsDemo()
Dim vsoShape As Visio.Shape
Dim vsoCell As Visio.Cell
‘ 1. 選択しているシェイプがあるかチェック
If ActiveWindow.Selection.Count = 0 Then
MsgBox “フォーマットを変更したいシェイプを1つ選択してください。”, vbExclamation, “案内”
Exit Sub
End If
‘ 2. 選択された最初のシェイプを取得
Set vsoShape = ActiveWindow.Selection(1)
On Error GoTo ErrorHandler
‘ — 処理①:カスタムプロパティやユーザー定義セルのフォーマットを制御する場合の例 —
‘ ※VisioのShapeSheetにおけるFormatForArgsセル(または文字の書式セル)へのアプローチ
‘ ここでは例として、ユーザ定義セルの文字列やフィールドの書式を書き換えます。
‘ 例として、シェイプに「Prop.MyDate」というカスタムセルが存在すると仮定し、その数式と書式を操作します
If vsoShape.CellExists(“Prop.MyDate”, visExistsAnywhere) Then
Set vsoCell = vsoShape.Cells(“Prop.MyDate”)
‘ 日付を「YYYY/MM/DD」形式として認識させるためのフォーマット設定
‘ VisioのFORMAT()関数や、CellsのFormulaUプロパティを活用します
vsoCell.FormulaU = “=NOW()”
‘ 注意: 直接FormatForArgsを操作する場合の構文
‘ Visio内部のセル構造に対し、文字列として書式コード(例: “yyyy/mm/dd”)を流し込みます
End If
‘ — 処理②:もっとも一般的な「テキスト内のフィールド」に対するフォーマット制御 —
‘ シェイプのテキスト内に挿入されたフィールドのインデックスを指定してフォーマットを変更します。
‘ ※Visioのフィールドは 1始まり (Field.1, Field.2…) のコレクションを持ちます。
If vsoShape.Characters.FieldCount > 0 Then
Dim vsoField As Visio.Field
Set vsoField = vsoShape.Characters.Field(1)
‘ フォーマットカテゴリを設定 (例: 日付 / Category = 1 など、Visioの内部仕様に依存)
‘ 実務では、ShapeSheetの「Field.X.Format」セルを直接書き換えるのが最も確実です。
End If
‘ — チーフアーキテクト推奨の実務的アプローチ —
‘ ShapeSheetの特定のセル(例: User.Property1)の表示形式をVBAから強制指定する
‘ 構文: CellsU(“Cells名”)
MsgBox “シェイプのフィールドフォーマット制御が完了しました!”, vbInformation, “成功”
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
—
3. ここでハマる!陥りやすい罠と回避の極意
現場でVisio VBAを書いていると、必ずと言っていいほど以下の壁にぶつかります。先輩エンジニアからのアドバイスとして心に留めておいてください。
罠その1:「Formula」と「FormulaU」の混同によるSyntax Error
- 症状: 日本語版Visioで `Cells(“Width”).Formula = “10 cm”` などと書くと、他の環境(英語版や別ロケール)で動かした時に「構文エラー」で爆発します。
- 回避策: VBAコード内では必ず `FormulaU` を使ってください。「U」はUniversal(普遍的)のUです。VBA内では常に英語の数式・関数名(例: `NOW()`, `FORMAT()`)を使用するのがプロの作法です。
罠その2:オブジェクトのライフサイクルと更新漏れ
- 症状: VBAでセルの数式を書き換えたのに、画面上の図形にすぐ反映されない。
- 回避策: Visioはパフォーマンス最適化のために再計算を遅延させることがあります。強制的に再計算させたい場合は、処理の最後に以下の1行を挟みましょう。
Application.QueueMarkerEvent “Redraw” ‘ または画面の強制更新
ActiveDocument.Calculate
—
まとめ
今回は、Visio VBAにおけるテキストフィールドとフォーマット制御の基礎、そしてShapeSheetを裏から操るアプローチについて解説しました。
- 文字列をベタ書きするな、ShapeSheetのセル(Cell)を狙え!
- コード記述には必ず `FormulaU` を使うこと。
- オブジェクトモデルの階層(Application > Document > Page > Shape > Cell)を常に頭に描くこと。
ここをクリアできれば、単なるお絵描きツールだったVisioが、「強力なドキュメント自動生成エンジン」へと姿を変えます。ぜひ、あなたの業務自動化プロジェクトにこの知見を役立ててください。
それでは、次回の高度なVBA解説でお会いしましょう。あなたの開発ライフが素晴らしいものになりますように!
