Visio VBAの深淵へ:CellsSRCで「名前依存」の呪縛から解き放たれる極限の高速化術
やあ、Visioの自動化という荒野に足を踏み入れた君へ。
これまで「マクロの記録」で生成されたコードを見て、「なぜこんなに遅いのか」「なぜ言語設定を変えると動かなくなるのか」と頭を抱えたことはないかな?
`shp.CellsU(“Width”).Formula = “50mm”` といった記述は便利だが、それはまだVisioの「表層」をなぞっているに過ぎない。
今日は、プロのエンジニアだけが知る「CellsSRC」という禁断の扉を開こう。これを使えば、名前解決のオーバーヘッドを完全に排除し、Visioの心臓部であるShapeSheetを直接叩くことができる。
—
1. なぜ「名前指定」がプロの現場で嫌われるのか
`CellsU(“Width”)` や `Cells(“Prop.Cost”)` という書き方は、実は非常に「コストの高い」処理だ。
- 文字列検索の負荷: Visioは実行のたびに「Width」という名前がどのセルかを検索しに行く。
- 言語依存の罠: VisioのUI言語(日本語版・英語版など)が変わると、特定のセル名がローカライズされてしまい、コードが突然エラーを吐くことがある。
一方、`CellsSRC`は、ShapeSheetの住所を「セクション・行・列」の数値で直接指定する。住所をピンポイントで指し示すため、検索の必要がなく、爆速で動作するのだ。
—
2. CellsSRCの地図:3つの座標系
ShapeSheetは3つの要素で構成されている。これを覚えるだけで、君はVisioの全セルを支配できる。
1. Section (セクション): データの種類(位置、書式、ユーザー定義など)
2. Row (行): そのセクションの中の具体的な行
3. Column (列): セルそのもの
これらを指定するのが `visSectionObject` や `visRowXFormOut` といったEnum(列挙型)だ。
—
3. 実践:CellsSRCを用いた爆速シェイプ操作
では、実際に「選択したシェイプの幅を50mmに変更する」という処理を、`CellsSRC`で書いてみよう。
Sub FastShapeResize()
Dim shp As Visio.Shape
‘ 選択中のシェイプを取得
Set shp = ActiveWindow.Selection(1)
‘ セクション: 変換(visSectionObject)
‘ 行: XFormOut(visRowXFormOut)
‘ 列: 幅(visXFormWidth)
‘ この3つの座標で直接指定する
shp.CellsSRC(visSectionObject, visRowXFormOut, visXFormWidth).FormulaU = “50mm”
Debug.Print “高速処理完了:住所直打ちによるセル更新”
End Sub
このコードがなぜ「賢い」のか?
- 名前解決がゼロ: `CellsU`のように文字列解析をしないため、数千個のシェイプを処理する際に圧倒的な速度差が出る。
- 言語不変: どの国の言語版Visioで走らせても、このEnumは変わらない。堅牢性が段違いだ。
—
4. プロのTips:ShapeSheetの「住所」を調べる方法
「じゃあ、このセルのSRCインデックスはどうやって調べればいいの?」と疑問に思うだろう。答えはシンプルだ。
1. Visioで対象のシェイプを右クリックし、「ShapeSheetを表示」を選択する。
2. 調べたいセルのヘッダーを見る。
3. VBAのイミディエイトウィンドウで、そのセルがどのSectionにあるか確認する(例:`? shp.Cells(“Width”).Section` と打てば、インデックスが返ってくる)。
—
5. 陥りやすい罠と解決策
罠:インデックスがずれる?
Visioの標準的なセクションは固定だが、「ユーザー定義セル(User-defined Cells)」や「シェイプデータ(Prop)」は、追加・削除によって行インデックスが動的に変わる。
解決策:
固定位置のセル(位置・サイズ)には `CellsSRC` を使い、動的なセクション(PropやUserなど)には `CellsU` を併用する「ハイブリッド戦略」が最も実用的だ。全てをSRCで縛ろうとしてコードの可読性を下げる必要はない。
—
最後に:エンジニアとしてのマインドセット
自動化において重要なのは、単に「動く」ことではない。「いかにメンテナンスしやすく、いかにシステムに優しいか」だ。
`CellsSRC` を使いこなす君は、もう「マクロ記録」に頼る初心者ではない。Visioの内部構造を理解し、計算資源を最適化できるアーキテクトの一歩を踏み出したんだ。
さあ、次は君のライブラリにこの手法を組み込んでみてくれ。何か詰まったら、いつでも戻っておいで。Visio VBAの道は、まだまだ奥が深いぞ。
