Visioの「聖域」を守る:ShapeSheetを掌握し、図形の破壊的変更をVBAで完封する
Visioで大規模なダイアグラムを設計する際、最も恐ろしいのは「ユーザーによる意図せぬ位置移動」や「誤操作によるShapeの削除」だ。GUIの保護機能は限定的であり、業務フローの自動生成やマスターシェイプの配置を行うシステムにおいて、これらはもはや欠陥になり得る。
今回は、Visioのオブジェクトモデルの深淵、ShapeSheetのLock系セルをVBAで制御し、図面を「堅牢なシステム」へと昇華させるためのアーキテクチャを提示する。
—
1. 脆弱性を排除する:ShapeSheetとLockセルの本質
Visioの図形は、単なるグラフィックオブジェクトではない。その本質は「ShapeSheet」というデータテーブルそのものだ。`LockWidth`, `LockHeight`, `LockDelete`といったプロパティは、GUI上のチェックボックスと連動しているが、VBAから`CellsU`経由で直接書き込むことで、GUIを超えた厳密な制御が可能となる。
制御すべき主要なLock系セル
- LockDelete: 削除を禁止する。マスターの整合性を保つための最重要項目。
- LockWidth / LockHeight: サイズ固定。レイアウト崩れを物理的に防ぐ。
- LockMoveX / LockMoveY: 位置固定。動的配置を確定させた後に適用する。
—
2. 実装コード:堅牢性を担保する一括制御モジュール
単にプロパティを書き換えるだけのコードは素人仕事だ。実務において重要なのは、「対象のShapeが保護可能か」という検証プロセスと、メモリリークを防ぐオブジェクト管理である。
以下のコードは、指定したページ内の全図形を一括制御するためのプロフェッショナル・テンプレートだ。
Option Explicit
”’
”’
”’ 対象となるVisio Pageオブジェクト
”’ True:保護を有効化, False:保護を解除
Public Sub ToggleShapeProtection(ByVal targetPage As Visio.Page, ByVal isLocked As Boolean)
Dim shp As Visio.Shape
Dim val As Integer
val = IIf(isLocked, 1, 0)
‘ 画面描画の停止によるパフォーマンス最適化
‘ 大規模図面では必須のテクニック
Application.ScreenUpdating = False
On Error Resume Next ‘ 予期せぬ保護制限エラーを回避
For Each shp In targetPage.Shapes
‘ LockDelete: 削除防止
‘ LockWidth/Height: サイズ固定
‘ 重要なのは CellsU を使用し、ユニバーサル名(英語名)で指定すること
‘ ローカル言語設定に依存しない安定した動作を保証する
Call SetLock(shp, “LockDelete”, val)
Call SetLock(shp, “LockWidth”, val)
Call SetLock(shp, “LockHeight”, val)
Call SetLock(shp, “LockMoveX”, val)
Call SetLock(shp, “LockMoveY”, val)
Next shp
Application.ScreenUpdating = True
‘ 明示的なオブジェクト解放
Set shp = Nothing
End Sub
Private Sub SetLock(ByRef shp As Visio.Shape, ByVal cellName As String, ByVal val As Integer)
‘ セルが存在するか確認してから書き込むのがアーキテクトの矜持
If shp.CellExistsU(cellName, 0) Then
shp.CellsU(cellName).FormulaU = val
End If
End Sub
—
3. シニアエンジニアが意識すべき「極限の知見」
① ScreenUpdating の重要性
VisioのVBA実行中、画面描画を放置するのはメモリとCPUの無駄遣いだ。`Application.ScreenUpdating = False` を利用し、描画負荷を極限まで下げる。これは数千のShapeを扱うインフラ構成図等では、数秒単位の高速化に繋がる。
② FormulaU と Formula の使い分け
`Cells(“LockWidth”)` はローカル言語設定に依存し、多国籍な開発環境では即座にエラーを吐く。必ず `CellsU` および `FormulaU` を使用すること。これは Visio VBA の鉄則中の鉄則である。
③ 継承と例外処理
`On Error Resume Next` をループ内で濫用してはならない。上記のように「特定のセルが存在するかどうか」を `CellExistsU` で判定し、セーフティネットを張るのが正しい。ShapeSheetは図形の種類(Groupか単体か)によって構造が異なるため、この事前検証が安定性を左右する。
—
4. 最後に:レガシーとの共存
Visioは古い技術スタックに見えるかもしれないが、そのオブジェクトモデルは極めて堅牢だ。今回紹介した手法は、API連携やデータベース駆動の図面生成システムにおいても、図面の「完全性」を守る最後の砦となる。
GUIでポチポチと保護設定を行っているようでは、まだ「Visioを使わされている」に過ぎない。コードで図面の状態を完全に定義し、実行する。この姿勢こそが、自動化エンジニアとして次のステージへ進むための第一歩だ。
次は、これをイベントドリブン(図形がドロップされた瞬間に自動ロックする等)に拡張し、システムに組み込む実装へと踏み込んでいこう。
