【実務・中級編】【初心者】Shape.CellsUを用いたシェイプデータ(カスタムプロパティ)の読み書き入門 – Visio VBA解析バイブル

スポンサーリンク

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`(ユーザー定義セル)を活用した、より高度なロジック制御について深掘りする予定だ。準備はいいか。

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