Visio VBAの真髄:User-Defined Cellsを操り、図形に「知性」を宿す極意
こんにちは。現場で鍛え抜かれた自動化アーキテクトです。
Visioをただの「お絵かきツール」だと思っていませんか? もしそうなら、あなたはまだVisioという巨大なエンジンが持つ真の可能性の入り口に立ったばかりです。
Visioの図形(Shape)には、座標や色といった見た目のプロパティ以外に、「User-Defined Cells(ユーザー定義セル)」という、いわば図形の「脳」とも呼べる領域が存在します。ここに独自のデータを刻み込むことで、図形はただの図形から、プログラムと対話する「インテリジェントなオブジェクト」へと進化します。
今日は、この「User-Defined Cells」をVBAで安全かつ確実に構築する極意を伝授しましょう。マクロの記録から一歩先へ進みたいあなたへ、一生モノの知見を授けます。
—
1. なぜ「User-Defined Cells」なのか?
図形に情報を付与する際、Shapeの「Name」や「Text」を書き換えるのは素人のやり方です。それらは人間が見るためのものであり、プログラムが管理するデータとしては脆すぎます。
User-Defined Cellsを使うと、以下のようなメリットがあります。
- 名前空間の分離: 既存のプロパティと干渉せず、クリーンにデータを管理できる。
- 永続性: 図形の中にデータが埋め込まれるため、ファイルを保存・閉じてもデータが消えない。
- 計算式との連動: Visioの「ShapeSheet」関数と連携し、図形の動きを自動化できる。
—
2. 破壊を防ぐ「RowExists」の魔法
初心者が陥りやすい最大の罠が、「すでに存在するセルを上書きしようとしてエラーになる」、あるいは「存在しないセルを参照しようとしてクラッシュする」という事態です。
ここで登場するのが `Shape.RowExists` メソッドです。これを使うことで、対象のセルが存在するかを事前にチェックし、存在しない場合のみ新規作成するという「防御的プログラミング」が可能になります。
実践コード:安全にユーザーセルを構築する
以下のコードは、選択した図形に「User.MyID」というセルが存在するかを確認し、なければ作成して値を代入する、実戦仕様のテンプレートです。
Public Sub EnsureUserCell()
Dim shp As Visio.Shape
Dim sectionObj As Visio.Section
Dim rowObj As Visio.Row
Dim cellName As String: cellName = “User.MyID”
‘ 選択中の図形を取得(1つだけ選択している前提)
If ActiveWindow.Selection.Count = 0 Then Exit Sub
Set shp = ActiveWindow.Selection(1)
‘ 1. セクションを取得(Visioの構造上、ユーザーセルは visSectionUser に属する)
Set sectionObj = shp.Section(visSectionUser)
‘ 2. 行(Row)が存在するかチェック
‘ RowExistsの引数: 0はセル名、visExistsAnywhereは検索範囲のフラグ
If Not shp.RowExists(cellName, visExistsAnywhere) Then
‘ 存在しなければ追加
Set rowObj = sectionObj.AddRow(visRowUser, visTagDefault, visInsertRegion)
‘ セル名を変更(デフォルトのUser.Row_1をUser.MyIDに変える)
rowObj.Name = “MyID”
Debug.Print “新規セルを作成しました。”
Else
Debug.Print “既存のセルを更新します。”
End If
‘ 3. 値の代入(Formulaプロパティを使用するのがVisioの流儀)
shp.Cells(cellName).Formula = “””ID_2023_001″””
Debug.Print “処理完了: ” & shp.Cells(cellName).ResultStr(“”)
End Sub
—
3. ここを理解すれば「脱・初心者」
コードの中で特に注目してほしいポイントを解説します。
- `visSectionUser` の意味: Visioの内部データ構造(ShapeSheet)は、「セクション」という単位で分類されています。ユーザー定義セルは必ず `visSectionUser` というセクションに住んでいます。
- `Formula` プロパティの癖: `Value` ではなく `Formula` を使うのがVisio VBAの作法です。値を代入する際、文字列であれば `”””ID_2023_001″””` のように、ダブルクォーテーションを重ねる必要があります。これは、Visioがセルの中身を「数式」として解釈するためです。
- `RowExists` の引数: `visExistsAnywhere` は、「どこを探すか」というフラグです。これを使うことで、セクションの構造を深く意識せずとも、名前さえわかれば安全に探索できます。
—
4. 最後に:エンジニアとしての心構え
VBAで図形を制御する際、最も恐れるべきは「実行時エラーによる強制終了」です。特にVisioのような描画エンジンを扱う場合、エラーで処理が中断されると、オブジェクトの状態が中途半端になり、図形が崩れたりファイルが壊れたりするリスクがあります。
`RowExists` による事前チェックは、単なるコードのテクニックではなく、「対象の状態を常に確定させてから操作する」という、堅牢なシステムを構築するための哲学です。
この手法をマスターすれば、あなたはもう「マクロの記録」に頼る必要はありません。Visioという強力なプラットフォームを、自分の意のままに操るエンジニアへの道を歩み始めたのです。
さあ、次はどんなロジックを図形に埋め込みますか? 可能性は、あなたのコードの数だけ広がっています。
