【テクニカル・上級編】図形の変形・削除を安全に保護する:Shape.Lock系セル(LockWidth/LockDelete等)の一括制御VBAマクロ – Visio VBA解析バイブル

スポンサーリンク

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

”’

”’ 指定されたページ内の全Shapeの保護状態を一括設定する
”’

”’ 対象となる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を使わされている」に過ぎない。コードで図面の状態を完全に定義し、実行する。この姿勢こそが、自動化エンジニアとして次のステージへ進むための第一歩だ。

次は、これをイベントドリブン(図形がドロップされた瞬間に自動ロックする等)に拡張し、システムに組み込む実装へと踏み込んでいこう。

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