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のアーキテクチャについて聞きたいことがあれば、いつでも質問してくださいね。あなたのコードがよりエレガントになることを応援しています。
