Visio VBAの真髄を掴め:Shape.CellsUで「図形」を「データ」に変える技術
こんにちは。Visioの世界へようこそ。
あなたは今、「マクロの記録」という安全な岸辺を離れ、Visioの深淵なるオブジェクトモデルの世界に足を踏み入れようとしています。素晴らしい決断です。
多くの人がVisioを単なる「お絵かきツール」だと思っています。しかし、私たちエンジニアにとって、Visioは「データと図形が数学的に結合された、巨大なリレーショナルデータベース」に他なりません。
今日は、その心臓部である「シェイプデータ(旧カスタムプロパティ)」をVBAで自在に操るための、最も重要かつ基本的な技術をお教えします。
—
1. なぜ「CellsU」なのか? —— Visioの構造を理解する
Visioの図形(Shape)には、無数の属性情報が隠されています。位置、サイズ、色、そして私たちが今日扱う「シェイプデータ」。
これらにアクセスするための共通言語が `CellsU` です。なぜ `Cells` ではなく `CellsU` なのか? それは、`U` が Universal(ユニバーサル) を意味するからです。
- Cells: ローカル設定(PCの言語環境に依存する)
- CellsU: 世界共通の内部名称(言語が変わっても壊れない)
プロとしてコードを書くなら、必ず `CellsU` を使ってください。これが「動かないコード」を産まないための最初の鉄則です。
—
2. 実践:シェイプデータの読み書き
シェイプデータは、Visio内部では `Prop.` というセクションで管理されています。例えば「部品番号」という名前のフィールドにアクセスする場合、内部パスは `Prop.部品番号` となります。
【ステップ1】シェイプデータを書き込む(値をセットする)
以下のコードは、選択した図形のシェイプデータ「Prop.PartNumber」に値を書き込む基本形です。
Sub SetShapeData()
Dim shp As Visio.Shape
‘ 選択中の図形を取得(エラーハンドリングは実戦の基本です)
If ActiveWindow.Selection.Count = 0 Then
MsgBox “図形を選択してください。”
Exit Sub
End If
Set shp = ActiveWindow.Selection.PrimaryItem
‘ プロパティの値を更新
‘ ResultStrは文字列、Resultは数値などを入れる際に使用します
‘ “Prop.PartNumber” はシェイプシート上の行名です
If shp.CellExistsU(“Prop.PartNumber”, 0) Then
shp.CellsU(“Prop.PartNumber”).FormulaU = Chr(34) & “TECH-001” & Chr(34)
Else
MsgBox “指定したプロパティが存在しません。”
End If
End Sub
【解説:ここがプロのポイント】
- Chr(34): Visioの数式内では、文字列はダブルクォーテーションで囲む必要があります。コード上で `”` を扱うのは煩雑なので、アスキーコードの `34` を使うのがスマートな書き方です。
- CellExistsU: 存在しないプロパティにアクセスしようとすると、Visioは無慈悲にエラーを吐きます。必ず事前に存在チェックを行うのが、堅牢なコードへの第一歩です。
—
3. 初学者が必ずハマる「3つの落とし穴」
コードを書いていると、必ず「なぜか動かない」という壁にぶつかります。主な原因はこれらです。
1. 「ローカル名」と「行名」の混同
- 画面上の表示名は「部品番号」でも、内部名(行名)は `Prop.Row_1` のような英数字かもしれません。右クリックして「シェイプシートを表示」し、正確な名前を確認してください。
2. 数式(Formula)と値(Result)の使い分け
- `FormulaU` は「=1+1」のような数式をそのまま入力できます。
- `ResultStr` は計算済みの「結果」を文字列として取得・設定します。用途に応じて使い分けましょう。
3. 保護(Protection)
- 図形がロックされていると、VBAから書き込もうとしても無視されます。エラーにならないだけに厄介です。
—
4. 次のステップへ:Excelとの連携
この基本をマスターすれば、次はExcelからデータを読み込み、Visioの図形に流し込む「自動作図システム」が見えてきます。
- Excelの行をループで回す
- `ActivePage.Shapes(“図形名”).CellsU(“Prop.Data”).FormulaU = …` で流し込む
このサイクルを回せるようになると、これまで数時間かかっていた図面修正が、わずか1秒で終わるようになります。これが、Visio VBAを学ぶ最大の報酬です。
—
最後に:エンジニアとしてのマインドセット
Visio VBAは古い言語だと言われることもあります。しかし、「図形というUIと、データというロジックを融合させる」という概念において、これほど完成されたオブジェクトモデルは他にありません。
まずは今日紹介したコードを、コピー&ペーストではなく、自分の手で打ち込んでみてください。シェイプシートの奥底を覗き込み、図形と対話できたとき、あなたはもう「お絵かきユーザー」から「システムアーキテクト」へと進化しています。
何か不明な点があれば、いつでも聞いてください。ここをクリアすれば、Visio VBAの基本はバッチリですよ。応援しています。
