【実務・中級編】図形へのデータ付与:Shape.CellsUプロパティを用いたカスタムプロパティ(シェイプデータ)の書き込み – Visio VBA解析バイブル

スポンサーリンク

Visio VBAを掌握せよ:Shape.CellsUによる「シェイプデータ」操作の極意

Visioを単なる「お絵かきツール」だと思っているなら、今すぐその認識を改めるべきだ。Visioの本質は「図形というUIを持ったデータベース」である。

業務自動化の現場において、図形にメタデータを流し込み、それを外部DBやExcelと同期させる手法は、保守運用コストを劇的に下げる鍵となる。しかし、多くの開発者が `Cells` や `CellsU` の扱いで躓き、不安定なマクロを量産している。

今回は、Visioのオブジェクトモデルを掌握し、堅牢で「壊れない」自動化ツールを構築するための知見を共有する。

—

1. なぜ「CellsU」なのか:ローカライズの罠を回避せよ

まず、前提を共有する。Visioには `Cells` と `CellsU` が存在する。
初心者は平気で `Cells(“Prop.Name”)` を使うが、これは即刻禁止すべきだ。

  • Cells: ローカル言語(日本語版なら「プロパティ」等)に依存する。OSやOfficeの言語設定が変わった瞬間に爆死する。
  • CellsU: Universal名(国際標準名)を使用する。`Prop.Name` のような定義済みの値は、言語設定に依存せず、プログラムの堅牢性を担保する。

鉄則:常に `CellsU` を使用せよ。

—

2. 実践:シェイプデータの安全な書き込み

シェイプデータを操作する際、最も多いエラーは「対象のセルが存在しない」ことによる例外だ。これに対して、毎回 `On Error Resume Next` で誤魔化すのは三流のやり方だ。

以下のコードは、対象のセルが存在するかを確認し、存在しなければ安全に処理を分岐させる「プロダクション・レベル」のコード例である。

”’

”’ 指定したシェイプの特定プロパティに値を書き込む堅牢なメソッド
”’

Public Sub SetShapeData(ByVal shp As Visio.Shape, ByVal propName As String, ByVal value As String)
Dim cellName As String
cellName = “Prop.” & propName

‘ セルが存在するかを確認
If shp.CellExistsU(cellName, Visio.VisExistsFlags.visExistsAnywhere) Then
‘ 存在する場合のみ書き込み
‘ FormulaUを使用することで、数式(=SUM等)も文字列として安全に注入可能
shp.CellsU(cellName).FormulaU = Chr(34) & value & Chr(34)
Else
‘ ここにログ出力や、動的にプロパティを追加するロジックを実装する
Debug.Print “警告: プロパティ ” & cellName & ” がシェイプ ” & shp.Name & ” に存在しません。”
End If
End Sub

このコードのポイント

  • CellExistsU: 存在しないセルを叩くという「最も愚かなランタイムエラー」を未然に防ぐ。
  • FormulaUの活用: 値を単純に代入するのではなく、 `Chr(34)`(ダブルクォーテーション)で囲うことで、Visioの数式エンジンに対して「これは文字列リテラルである」と明示的に指示している。

—

3. 大規模データ処理におけるパフォーマンスの最適化

数千個の図形を一括更新する場合、ループ内で毎回 `CellsU` を呼び出すのは非効率だ。Visioの描画リフレッシュを制御することで、処理速度を劇的に向上させることができる。

Public Sub BatchUpdateShapeData()
Dim shp As Visio.Shape

‘ 画面描画を停止してパフォーマンスを向上させる
Application.ScreenUpdating = False

For Each shp In ActivePage.Shapes
‘ 条件に合致するシェイプのみ更新するフィルタリング設計
If shp.Master Is Not Nothing Then
SetShapeData shp, “Status”, “Processed”
End If
Next shp

‘ 描画再開
Application.ScreenUpdating = True
End Sub

—

4. 現場で生き残るための「設計上の注意点」

1. 「シェイプデータ」の定義はマスターシェイプで行え
個別の図形に個別にプロパティを追加すると、ドキュメントが肥大化し、管理不能になる。プロパティ定義は必ず「マスターシェイプ」側で管理し、インスタンス(図形)側は値の流し込みに徹するべきだ。
2. データベースとの同期は「キー」を持て
DB連携を行う際は、必ず「GUID」や「一意なID」をシェイプデータとして埋め込むこと。名前(Name)はユーザーが変更できるため、識別子には向かない。
3. Undo/Redoの考慮
大量の更新を行う際は、 `Application.BeginUndoScope` を使用すること。これにより、スクリプトの実行を「一つの作業」としてまとめられ、ユーザーがCtrl+Zで一括して元に戻せるようになる。これがプロの配慮だ。

—

最後に:エンジニアとしての矜持

VisioのVBAは、一見古臭い技術に見えるかもしれない。しかし、複雑な業務プロセスを「視覚的」かつ「構造的」に管理できる唯一無二のプラットフォームだ。

今回紹介した `CellsU` の制御とエラーハンドリングは、氷山の一角に過ぎない。しかし、この基礎を疎かにするエンジニアが書くツールは必ず半年後に腐敗する。
まずは目の前の図形から、その属性を掌握せよ。自動化の先には、設計図がそのままシステムとして稼働する、そんな未来が待っている。

何かあれば、また聞きに来るといい。君のプロジェクトの成功を期待している。

タイトルとURLをコピーしました