【入門編】Shape.CellsUの存在チェック(CellExistsU):未定義プロパティによる実行時エラーを完全にブロックする – Visio VBA解析バイブル

スポンサーリンク

Visio VBAの「見えない壁」を突破せよ:CellExistsUで実現する堅牢なデータ処理

こんにちは。Visioの自動化という深淵な世界へようこそ。

マクロの記録ボタンを押して、生成されたコードを眺めて「よし、動いた!」と喜ぶ段階は、もう卒業しましょう。実務の現場でVisio VBAを扱うとき、私たちは常に「予測不能な図形」と対峙しなければなりません。

特に、異なるステンシルからドラッグ&ドロップされた図形たちは、それぞれが持つ「データ(カスタムプロパティ/シェイプデータ)」の構成がバラバラです。ある図形にはあるデータが、別の図形には存在しない。そんな状況で無理やりデータを読み書きしようとすれば、Visioは無慈悲にも「実行時エラー」を吐き出し、プログラムを停止させます。

今日は、そんな「未定義プロパティによるエラー」を完封する、プロフェッショナル必須のテクニックをお伝えします。

1. なぜ「直接アクセス」は危険なのか?

Visioの図形は、`Shape.CellsU(“Prop.Price”)` のようにしてデータにアクセスします。しかし、もしその図形に「Price」という項目が定義されていなかったら?

Visioは即座にエラーを発生させます。これは、ビル建設現場で「図面にない壁を叩こうとしている」ようなもの。プログラムは迷子になり、強制終了します。

これを防ぐための「確認作業」こそが、今回紹介する `CellExistsU` メソッド です。

2. CellExistsU:魔法の「事前確認」メソッド

`CellExistsU` は、その名の通り「そのセル(データ項目)が、その図形の中に存在するか?」を判定する関数です。

  • 引数: セル名(文字列)
  • 戻り値: 存在すれば `True`、なければ `False`

この戻り値を使って、if文でガードをかける。これだけで、あなたのコードは格段に安定します。

実践コード:エラーを100%回避する書き方

以下は、選択した図形から「Prop.Cost」というデータを安全に読み取るためのテンプレートです。

Sub SafeReadShapeData()
Dim shp As Visio.Shape
Dim cellName As String

cellName = “Prop.Cost” ‘ 読み取りたいデータ項目名

‘ 選択図形を取得
Set shp = ActiveWindow.Selection(1)

‘ 【重要】CellExistsUで「存在確認」を行う
‘ 第2引数の 0 は「ローカル設定のみを確認する」という意味です
If shp.CellExistsU(cellName, 0) Then
‘ 存在する場合のみ、値を取得する
Debug.Print “Costの値は: ” & shp.CellsU(cellName).ResultStr(“”)
Else
‘ 存在しない場合のハンドリング(ログ出力や無視など)
Debug.Print “警告: この図形には ” & cellName & ” が定義されていません。”
End If
End Sub

3. なぜ `CellExistsU` なのか?(プロの視点)

初心者のうちは、「エラーが起きたら `On Error Resume Next` で無視すればいいのでは?」と考えるかもしれません。しかし、それは「火災報知器の線を切って火災を隠蔽する」ような行為です。

  • デバッグの困難化: 想定外のバグまで隠してしまい、原因特定が不可能になります。
  • パフォーマンスの低下: エラー発生時の例外処理はオーバーヘッドが大きく、大量の図形を処理する際に遅延の原因となります。

`CellExistsU` を使うことは、「コードの先を読み、予期せぬ事態を自ら定義する」というエンジニアの姿勢そのものです。

4. さらなる高みへ:堅牢なデータセット関数

応用として、データが存在する場合のみ値をセットする、汎用的な「書き込み関数」も紹介しておきましょう。これをモジュールに一つ入れておくだけで、開発スピードと品質が劇的に向上します。

‘ プロパティの存在確認をして、安全に値を書き込む関数
Sub SafeSetCellValue(shp As Visio.Shape, cellName As String, val As String)
If shp.CellExistsU(cellName, 0) Then
shp.CellsU(cellName).Formula = Chr(34) & val & Chr(34)
Else
Debug.Print “対象セルが見つかりませんでした: ” & cellName
End If
End Sub

※ `Chr(34)` はダブルクォーテーション(”)です。VisioのFormulaプロパティは文字列をダブルクォーテーションで囲む必要があるため、こう記述するのが作法です。

まとめ:あなたのコードは「生き物」である

Visio VBAは、ただ動けばいいというものではありません。図面という「不安定な環境」の中で、いかに自分以外の誰が使ってもエラーを起こさないか。その追求こそが、自動化エンジニアとしての腕の見せ所です。

今日から `CellExistsU` をコードのいたるところに忍ばせてください。最初は冗長に感じるかもしれませんが、それが「世界最高峰の堅牢性」への第一歩です。

何か不明な点や、さらに深いVisioのアーキテクチャについて聞きたいことがあれば、いつでも質問してくださいね。あなたのコードがよりエレガントになることを応援しています。

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