【入門編】【中級】Shape.CellsSRCによるShapeSheetの直接操作:名前依存を脱却したインデックス指定の高速アクセス – Visio VBA解析バイブル

スポンサーリンク

【Visio VBA極意】CellsUはもう卒業!CellsSRCによるShapeSheet高速アクセスで「名前依存」の呪縛を解き放て

こんにちは。自動化エンジニアの世界へようこそ。

「マクロの記録」で生成されたコードを見て、「なぜこんなに遅いのか?」「なぜプロパティ名が変わると動かなくなるのか?」と悩んだことはありませんか?

VisioのShapeSheetは、いわばVisioの「心臓部」です。多くの初学者は、この心臓部に触れる際、`CellsU(“Width”)` のように名前(文字列)でアクセスします。しかし、これはプロのやり方ではありません。

今日は、大規模図面を一瞬で書き換えるための「CellsSRC」という最強の武器を授けます。これをマスターすれば、あなたのVBAコードは一段上のステージへ昇華します。

—

1. なぜ「名前指定(CellsU)」ではダメなのか?

`Shape.CellsU(“Width”)` という書き方は、コードが読みやすい反面、2つの致命的な問題を抱えています。

1. 文字列検索のコスト: 実行のたびにVisioは内部の辞書を引いて「Widthとはどのセルか?」を検索します。数千個のシェイプを処理する際、この「検索時間」が積もり積もってボトルネックになります。
2. 言語依存のリスク: VisioのUI言語が変わると、プロパティ名が変わってしまう場合があります(例:日本語版と英語版の差異)。

これに対し、CellsSRC は、ShapeSheet上の「座標(セクション・行・列)」を直接指定します。これはメモリ上のアドレスを直接叩くようなもので、圧倒的なパフォーマンスを誇ります。

—

2. CellsSRCの地図を読み解く:セクション・行・列

ShapeSheetはExcelのような表です。`CellsSRC` は以下の3つの数値で場所を特定します。

  • Section (セクション): データの大きな分類(例:形状変換、ジオメトリ、フィルなど)
  • Row (行): セクション内の行番号
  • Column (列): 属性の列番号

これらは `visSectionObject` や `visRowWidth` といった「定数」としてVisio VBAに定義されています。

—

3. 実践:CellsSRCによる高速一括書き換え

例えば、「図面内の全シェイプの幅を50mmに統一する」というタスクを考えてみましょう。

Sub UpdateShapeWidth_PerformanceMode()
Dim shp As Visio.Shape
Dim pg As Visio.Page

‘ プロパティの定数を指定するための変数
Dim sec As Integer: sec = Visio.VisSectionIndices.visSectionObject
Dim row As Integer: row = Visio.VisRowIndices.visRowXFormOut
Dim col As Integer: col = Visio.VisCellIndices.visXFormWidth

‘ 画面描画を停止して高速化(重要!)
Application.ScreenUpdating = False

For Each pg In ActiveDocument.Pages
For Each shp In pg.Shapes
‘ CellsSRCで直接アクセス。名前検索をスキップするため爆速です
‘ “50mm” という値を直接ShapeSheetに書き込みます
shp.CellsSRC(sec, row, col).FormulaU = “50mm”
Next shp
Next pg

Application.ScreenUpdating = True
MsgBox “全シェイプの幅を更新しました。”
End Sub

このコードの「賢いポイント」

  • `FormulaU` の使用: `Formula` ではなく `FormulaU` を使うのが鉄則です。`U` はUniversal(普遍的)の略。言語設定に左右されない記述が可能です。
  • `ScreenUpdating = False`: これを忘れると、Visioがシェイプを書き換えるたびに画面を再描画しようとし、処理速度が10倍以上遅くなります。

—

4. 陥りやすい罠と対策

① 「インデックスが範囲外です」エラー

CellsSRCは強力ですが、存在しないセクションや行を叩くと即座にクラッシュします。
特定のセクションが存在するかどうかは、事前に `shp.SectionExists` や `shp.RowExists` で確認する癖をつけましょう。

② コードが読みづらい問題

`CellsSRC(2, 1, 3)` と書かれても、何をしているか分かりませんよね。
解決策は「定数化」です。上記コードのように、意味のある変数名に格納してから使うのが、保守性を保つ唯一の道です。

—

最後に:先輩エンジニアからのアドバイス

CellsSRCを使いこなすことは、Visioの「構造」を理解することと同意義です。

最初は `CellsU` でプロトタイプを作り、動作が確認できたら `CellsSRC` に書き換えて最適化する。この「二段構え」の開発フローを身につけてください。大規模な図面データになればなるほど、この手法があなたの開発時間を劇的に短縮し、PCのフリーズという悪夢からあなたを救ってくれるはずです。

Visio VBAは奥が深い。しかし、この「心臓部を叩く感覚」さえ掴めば、もう怖いものはありません。
さあ、エディタを開いて、あなたのコードを「爆速」に変えてみましょう!

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