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

スポンサーリンク

Visio VBAの深淵:図形の「完全保護」を制御する極限の設計術

業務自動化エンジニアにとって、Visioは単なる作図ツールではない。「データと図形の同期装置」である。しかし、運用現場で最も頭を抱えるのが「意図しない編集による図面破壊」だ。

ユーザーが不用意に図形をリサイズしたり、誤って削除したりする。これを防ぐためにUIの「保護」メニューをポチポチ押しているようでは、プロのエンジニアとは呼べない。今回は、ShapeSheetの深層にアクセスし、VBAで図形の保護を一括制御する「堅牢な設計」を伝授する。

1. なぜ「CellsU」での直接制御が不可欠なのか

Visioの保護機能は、ShapeSheet上の「Lock」関連セルに依存している。UI経由の保護は、ドキュメントの複雑度が増すと反映漏れや誤設定の温床となる。

VBAで制御する最大のメリットは、「状態の確定(ステート・マネジメント)」にある。処理の開始時に全図形を保護し、更新時のみ一時的に解除し、直後に再保護する。このサイクルを自動化することで、人的エラーをゼロにできる。

制御すべき主要なLockセル

  • LockWidth / LockHeight: 寸法の固定。レイアウトを崩させない。
  • LockDelete: 削除の禁止。重要インフラ図などで必須。
  • LockMove: 位置の固定。テンプレート化する際に有効。

2. 現場で「死なない」コード設計の鉄則

多くのエンジニアが陥る罠は、`ActiveWindow.Selection` に依存したコードだ。これはユーザーの操作状況に左右されるため、バグの主原因となる。

鉄則:常にコンテナ(PageやDocument)を走査し、再帰的に処理せよ。

以下のコードは、単なるプロシージャではなく、あなたの自動化ライブラリの核となる「保護コントローラー」だ。

Option Explicit

‘ ==============================================================================
‘ 機能:指定ページ内の全図形に対して保護設定を一括適用する
‘ 引数:targetPage – 対象ページ, isLocked – 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)

‘ エラーハンドリングは必須。保護済みオブジェクトへのアクセス失敗を回避
On Error Resume Next

For Each shp In targetPage.Shapes
‘ CellsUは汎用的なセルの指定手段。UはUniversal(言語非依存)の意
‘ ロック系セルは「Protection」セクションにある
With shp
.CellsU(“LockWidth”).FormulaU = val
.CellsU(“LockHeight”).FormulaU = val
.CellsU(“LockDelete”).FormulaU = val
.CellsU(“LockMoveX”).FormulaU = val
.CellsU(“LockMoveY”).FormulaU = val
End With
Next shp

On Error GoTo 0
End Sub

3. 実務で遭遇する「罠」と解決策

3.1 グループ化された図形の扱い

上記のコードはトップレベルの図形しか操作しない。グループ化された図形(`shp.Type = visTypeGroup`)も保護したい場合は、再帰関数(Recursive Function)を実装せよ。関数内で `If shp.Type = visTypeGroup Then ToggleShapeProtection(shp.Shapes, isLocked)` のように自分自身を呼び出す設計が定石だ。

3.2 データベース連携時のトランザクション管理

外部データ(ExcelやSQL Server)から図形を更新する際は、以下の手順を厳守すること。

1. 解除フェーズ: 全図形のロックをOFFにする。
2. 更新フェーズ: データに基づき図形を配置・変形する。
3. 再保護フェーズ: 再びロックをONにする。

この「更新の前後で保護状態をサンドイッチする」プロセスを徹底すれば、データ連携後の図面が「壊れて編集不可になる」という悲劇を防げる。

4. チーフアーキテクトからの助言

私が現場でよく目にするのは、保護プロパティを「権限の代わり」に使おうとする設計だ。だが、忘れないでほしい。VisioのLock系セルは「誤操作防止」のためのものであり、「セキュリティ(アクセス制御)」ではない。

本当に機密性の高い図面であれば、VBAプロジェクト自体をパスワードで保護し、さらにActive Directoryと連携したVBAレベルでの権限チェックを実装すべきだ。

次のステップへの提言

このコードを実装したら、次は「特定のメタデータを持つ図形のみロックする」というフィルタリング機能を追加してみるといい。`shp.CellExists(“User.IsProtected”, 0)` といったユーザー定義セルをチェックするように改良すれば、あなたのツールはさらに洗練されたものになるはずだ。

自動化とは、単にコードを書くことではない。「誰もが直感的に、かつ安全に扱えるシステム」を構築する思想そのものだ。 今日のコードを、あなたのエンジニアリングの武器に加えよ。

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