Visio自動化の真髄:Shape.CellsUによるデータ連携を「破壊」から「資産」へ変える設計術
業務自動化の世界において、Visioは単なる「お絵描きツール」ではない。それは、構造化されたデータと図形が対話する「動的なデータベース」だ。
多くの初学者がここで躓く。Excelからデータを読み込み、図形に流し込む。一見単純なこのプロセスで、なぜ多くのプロジェクトが「図形が壊れた」「再実行するとデータが重複する」という惨事に陥るのか。それは、ShapeSheetの構造を理解せず、ただメソッドを叩いているからに他ならない。
今日は、Visio VBAにおいて最も基本であり、かつ最も奥が深い『Shape.CellsU』を介したシェイプデータ(旧カスタムプロパティ)の操作について、プロの現場で通用する「堅牢な設計」を伝授する。
—
1. なぜ「CellsU」なのか? — 開発者が知るべき絶対原則
Visioのセル操作には`Cells`と`CellsU`がある。結論から言えば、`CellsU`以外を使ってはならない。
- Cells: 実行環境の言語設定(ローカル設定)に依存する。日本語環境で書いたコードが、英語環境のPCで動かした瞬間に死ぬ原因だ。
- CellsU: Universal(ユニバーサル)のU。言語設定に左右されない不変の識別子。グローバルな環境で配布するツールを作るなら、迷う余地はない。
—
2. 実践:プロダクションレベルの「データ書き込み」コード
単に値を代入するコードは誰でも書ける。だが、プロは「図形にそのプロパティが存在しない場合」を想定し、さらにエラーをハンドリングする。
以下は、指定したシェイプの特定プロパティを更新する、再利用可能な関数だ。
‘ @brief シェイプデータを安全に更新する関数
‘ @param shp 対象のVisio.Shapeオブジェクト
‘ @param propName プロパティ名(Prop.XXXX)
‘ @param value 代入する値
Public Sub UpdateShapeData(ByRef shp As Visio.Shape, ByVal propName As String, ByVal value As String)
Dim cell As Visio.Cell
‘ 存在確認:CellsUは存在しないセルにアクセスするとエラーを吐く
‘ 開発中のデバッグコストを抑えるため、プロパティの存在チェックを挟むのが定石
If shp.CellExistsU(“Prop.” & propName, visExistsAnywhere) = 0 Then
Debug.Print “Warning: Property ‘” & propName & “‘ not found in ” & shp.Name
Exit Sub
End If
Set cell = shp.CellsU(“Prop.” & propName & “.Value”)
‘ 読み取り専用セルでないことを確認し、値をセット
If Not cell.ReadOnly Then
cell.FormulaU = Chr(34) & value & Chr(34)
End If
End Sub
この設計のポイント
1. FormulaUの活用: `ResultStr`ではなく`FormulaU`を使う。Visioのデータは数式として管理されているため、文字列を代入する際は`Chr(34)`(ダブルクォーテーション)で囲うのが仕様上の作法だ。
2. CellExistsU: 実行時に「そんな名前のセルはない」というエラーで全処理を停止させないための防波堤である。
—
3. 大規模データ連携における「3つの鉄則」
Excel等から数千個の図形へデータを流し込む際、以下の設計を怠ると、Visioは途端に重くなり、クラッシュを誘発する。
① 画面更新の停止(ScreenUpdating)
VBA実行中、Visioが逐一画面を描画すると処理速度は10倍以上低下する。
Application.ScreenUpdating = False
‘ … 処理本体 …
Application.ScreenUpdating = True
これを忘れるのは、エンジニアとして失格に近い。
② イベントを抑制する
図形にデータを流し込むと、ShapeSheetの依存関係により再計算が走る。大量の図形を扱う際は、一時的にイベントを無効化する設計を検討せよ。
③ トランザクション管理
複数のシェイプを更新する場合、`Application.BeginUndoScope` を使用すること。これにより、万が一途中でエラーが発生しても、`EndUndoScope`の逆順で一括ロールバックが可能になり、データ破損を防げる。
—
4. 最後に:エンジニアとしての心構え
「コードが動いた」ことと、「システムが堅牢である」ことは別物だ。
今回紹介した`CellsU`を用いた実装は、いわばVisio自動化の「作法」に過ぎない。しかし、この作法を疎かにする者が、複雑な図面構造を制御できるはずもない。
Visioを単なる作図ソフトと見るか、データを構造化するプラットフォームと見るか。貴方の書くコードが、その分かれ目になる。まずはこの関数を自らのライブラリに加え、手作業から脱却する第一歩を踏み出してほしい。
次回の記事では、`User-defined Cells`(ユーザー定義セル)を活用した、より高度なロジック制御について深掘りする予定だ。準備はいいか。
