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

スポンサーリンク

Visio VBAを制する:Shape.CellsUによる「シェイプデータ」完全攻略ガイド

Visioを単なる「お絵描きツール」だと思っているなら、今すぐその認識を捨てろ。Visioの本質は、「図形というインターフェースを備えたデータベース」だ。

業務効率化において、図形にメタデータ(部品番号、担当者、単価など)を埋め込み、それをVBAで一括制御するスキルは、現場のエンジニアにとって最強の武器になる。しかし、多くのプログラマは`CellsU`の扱いで躓き、不安定なコードを量産している。

今日は、伝説的なアーキテクトの視点から、堅牢で保守性の高い「シェイプデータ操作」の真髄を伝授する。

1. なぜ「CellsU」なのか:Uの重みを理解せよ

Visio VBAには `Cells` と `CellsU` が存在する。初心者は迷わず `CellsU` を選べ。

  • Cells: ローカル環境の言語設定(ロケール)に依存する。日本語環境で書いたコードが、海外拠点や英語OSで動かした瞬間に全滅する。
  • CellsU (Universal): 言語非依存のユニバーサル名を使用する。これこそが、グローバル環境でも動く堅牢なコードの最低条件だ。

シェイプデータ(旧カスタムプロパティ)にアクセスする場合、`Prop.ラベル名` という指定方法を用いるが、これも必ずUniversal名を意識せよ。

2. 堅牢な設計:データアクセスの「掟」

シェイプデータを操作する際、最も多いバグは「対象のデータ行が存在しない」ことによるエラーだ。これを防ぐための設計指針を提示する。

1. 存在確認を怠るな: `CellExistsU` メソッドで、対象のセルが存在するか必ずチェックする。
2. 型を意識せよ: データを書き込む際は、文字列であっても明示的に `FormulaU` プロパティを叩くのが鉄則だ。
3. 例外処理を包み込め: 大量処理を行う際は、エラーハンドラで処理を中断させず、ログを残す設計にする。

3. 実践:プロダクションコード例

以下は、シェイプデータを安全に読み書きするためのクラス的関数だ。これをそのままモジュールにコピーして使え。

‘ —————————————————————————–
‘ @brief 指定したシェイプのシェイプデータ(Prop)を読み書きするユーティリティ
‘ —————————————————————————–
Option Explicit

‘ データの書き込み
Public Sub SetShapeData(shp As Visio.Shape, propName As String, val As String)
Dim cellName As String
cellName = “Prop.” & propName

‘ セルが存在するか確認(なければ書き込まない、あるいは新規追加処理へ)
If shp.CellExistsU(cellName, Visio.VisExistsFlags.visExistsAnywhere) Then
‘ FormulaUで書き込む(ロケール依存を回避)
shp.CellsU(cellName).FormulaU = Chr(34) & val & Chr(34)
Else
Debug.Print “Warning: Prop not found: ” & propName
End If
End Sub

‘ データの読み出し
Public Function GetShapeData(shp As Visio.Shape, propName As String) As String
Dim cellName As String
cellName = “Prop.” & propName

If shp.CellExistsU(cellName, Visio.VisExistsFlags.visExistsAnywhere) Then
‘ ResultStrで値を取得(単位などを無視して生の文字列を取得)
GetShapeData = shp.CellsU(cellName).ResultStr(Visio.VisUnitCodes.visNoPreference)
Else
GetShapeData = “”
End If
End Function

4. 現場で「死なない」ための3つの忠告

1. 外部連携(Excel/DB)との同期タイミング

VBAで外部DBと連携する際、`Page.Shapes` をループで回して一括更新するケースが多いだろう。その際、画面描画を停止(`Application.ScreenUpdating = False`)させるのは必須だ。これを行わないと、Visioが再描画のたびにCPUを食いつぶし、処理速度が10倍以上遅延する。

2. シートの保護とロック

シェイプデータが「読み取り専用」になっている場合、`CellsU.FormulaU` は実行時エラーを吐く。`Cell.Locked` プロパティを確認し、必要であれば書き込み前に一時的に解除するガード節を組み込んでおけ。

3. 名前空間の汚染を防げ

シェイプデータのラベル名は、ユーザーがGUIから変更可能だ。VBAでコードを書く際は、「GUI上のラベル」ではなく「セクション名(Prop.xxxx)」で管理することを、仕様としてプロジェクトメンバーと握っておくこと。これが保守性の分岐点だ。

最後に:自動化は「思想」である

ツールは作って終わりではない。あなたが書いたコードは、後任のエンジニアが「なぜこう書いたのか」を読み解くドキュメントでもある。

`CellsU` を使い、存在確認を徹底し、ロケールに依存しないコードを書く。この小さなこだわりが、数年後のあなたの手元に「壊れないシステム」として返ってくる。

さあ、Visioを単なる作図ソフトから、真の設計・管理エンジンへと進化させよう。君ならできるはずだ。

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