【実務・中級編】Page.Layersのセキュリティ保護:特定の重要レイヤー(回路図・躯体図など)の全図形を一括ロック・編集不可にするマクロ – Visio VBA解析バイブル

スポンサーリンク

Visio VBAを掌握する極限の知見:Page.Layersで重要図形を「絶対に誤操作させない」要塞化レイヤー制御

図面管理の現場において、最も恐ろしい瞬間は何か。
それは、綿密に計算された回路図や、法的根拠のある躯体図の基準線が、誰かの無意識のドラッグ操作によって数ミリずらされることだ。そしてその変更が上書き保存され、誰も気づかぬまま下流工程へと流れていく……。

「Ctrl + Z」で戻せばいい? いや、大規模な設計図において、何時間も気づかれずに蓄積された誤操作の検知と修復は、エンジニアにとって地獄のような無駄骨だ。

Visioの標準機能にも「レイヤーのロック」はある。しかし、数百枚におよぶ図面を管理する企業インフラや自動化パイプラインにおいて、GUIのポチポチ作業に依存するのはプロの仕事ではない。

今回は、Visio VBAの骨髄まで知り尽くしたアーキテクトの視点から、特定の重要レイヤーをプログラムによって一網打尽にし、誤操作の余地すら残さない「要塞化(Lock)」の極意を伝授する。

なぜ「図形ごとのロック」では破綻するのか?

初学者が陥る最大のアンチパターンは、`Shape.Lock` プロパティを全図形に対してループで回して設定することだ。

‘ 【非効率なアンチパターンの例】
Dim shp As Visio.Shape
For Each shp in ActivePage.Shapes
shp.CellsU(“LocPinX”).Locked = True ‘ 愚の骨頂
Next shp

このアプローチがなぜ実務で破綻するのか?理由は3つある。
1. パフォーマンスの著しい劣化:形状(Shape)の数が増えるほど、COMを介したプロパティ書き換えのオーバーヘッドが蓄積し、マクロがフリーズしたような重さになる。
2. 保守性の欠如:後から新しい配線図形を追加した際、再度その図形に対して個別にロック処理を走らせなければならない。
3. カオスな状態管理:どの図形がロックされていて、どれが編集可能なのかが、図形単位のメタデータに依存するため、全貌が見えなくなる。

解決策:レイヤー(Layer)という「概念」をロックせよ

Visioのレイヤーは、単なる「表示・非表示の切り替えスイッチ」ではない。図形群のライフサイクルと権限を管理する論理コンテナである。
レイヤーオブジェクト自体のロック状態を制御すれば、そこに属する数千の図形を一瞬で、かつ不可逆に「編集不可」の要塞へと変貌させることができる。

プロダクションコード:重要レイヤー一括ロックマクロ

以下のコードは、実務の現場でそのまま稼働できる堅牢性を持たせたプロダクションコードだ。
指定したレイヤー名(例:「【厳禁】躯体・基幹配線」)が存在するかを検証し、そのレイヤーに属するすべての図形(およびレイヤー自体)の保護を一括で掛け、さらに視覚的なフィードバックとして色調をグレーアウトさせる高度な処理を行う。

Option Explicit

‘ ==============================================================================
‘ 担当者モジュール: 業務自動化アーキテクト
‘ 概要: 指定した重要レイヤーの完全ロック(要塞化)と視覚的保護を行う実務マクロ
‘ ==============================================================================
Public Sub SecureCriticalLayer()
‘ エラーハンドリングの標準武装
On Error GoTo ErrorHandler

Dim vsoPage As Visio.Page
Set vsoPage = ActivePage

‘ ターゲットとする重要レイヤーの名称(要件定義に応じて変更すること)
Const TARGET_LAYER_NAME As String = “【厳禁】躯体・基幹配線”

Dim vsoLayer As Visio.Layer
Set vsoLayer = GetTargetLayer(vsoPage, TARGET_LAYER_NAME)

If vsoLayer Is Nothing Then
MsgBox “指定された重要レイヤー ‘” & TARGET_LAYER_NAME & “‘ がこのページに存在しません。”, _
vbCritical, “要塞化処理 中断”
Exit Sub
End If

‘ トランザクションの開始(処理の高速化とアトミック性の確保)
Application.ScreenUpdating = False

‘ 1. レイヤー自体のロック(レイヤーに属する図形全体の移動・変形を禁止)
‘ LayerCells(visLayerLock) を True に設定
vsoLayer.CellsC(Visio.visLayerLock).FormulaU = “1”

‘ 2. レイヤー内の全図形に対して個別のセーフティロック(シェイプシートの保護)を適用
Dim vsoShp As Visio.Shape
For Each vsoShp in vsoPage.Shapes
‘ 該当レイヤーに所属している図形か判定
If vsoShp.IsMember(vsoLayer, True) Then
‘ 位置、サイズ、削除、テキスト編集を完全にロック
Call ApplyStrictShapeLocks(vsoShp)
End If
Next vsoShp

Application.ScreenUpdating = True

MsgBox “レイヤー [” & TARGET_LAYER_NAME & “] の要塞化が完了しました。” & vbCrLf & _
“これよりこのレイヤーの図形は誤操作から保護されます。”, _
vbInformation, “セキュリティ保護 完了”

Exit Sub

ErrorHandler:
Application.ScreenUpdating = True
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
End Sub

‘ ——————————————————————————
‘ 補助関数: ページ内から指定名のレイヤーを安全に取得する
‘ ——————————————————————————
Private Function GetTargetLayer(ByVal targetPage As Visio.Page, ByVal layerName As String) As Visio.Layer
Dim lyr As Visio.Layer
For Each lyr In targetPage.Layers
If lyr.Name = layerName Then
Set GetTargetLayer = lyr
Exit Function
End If
Next lyr
Set GetTargetLayer = Nothing
End Function

‘ ——————————————————————————
‘ 補助プロシージャ: 図形のシェイプシートを操作し、編集を完全に封じる
‘ ——————————————————————————
Private Sub ApplyStrictShapeLocks(ByVal shp As Visio.Shape)
On Error Resume Next ‘ グループ図形内のサブシェイプ等で保護セルがない場合の対策

With shp
.CellsU(“LockMove”).FormulaU = “1” 移動禁止
.CellsU(“LockVtxEdit”).FormulaU = “1” 頂点編集禁止
.CellsU(“LockRotate”).FormulaU = “1” 回転禁止
.CellsU(“LockAspect”).FormulaU = “1” 縦横比固定
.CellsU(“LockDelete”).FormulaU = “1” 削除禁止
End With

On Error GoTo 0
End Sub

開発現場で生きる「プロの設計思想」

上記のコードには、単なる「動くコード」を超えた、現場でトラブルを起こさないためのアーキテクチャが組み込まれている。

1. `Application.ScreenUpdating = False` による描画負荷の排除

数千個にお及ぶシェイプに対して個別に `.CellsU` を叩くとき、画面描画(UIの再描画)が走ると、処理速度が数十倍から数百倍に低下する。これを明示的にオフにすることで、バックグラウンド処理として瞬時に完了させる。プログラミングの基本だが、Visio VBAではこれがシステムの生死を分ける。

2. 二重の防御壁(Layer Lock + Shape Lock)

レイヤー自体の `visLayerLock` だけでは、ユーザーが強引にレイヤー所属を変更したり、個別にプロパティをイジった場合に隙が生まれる可能性がある。
そのため、このマクロでは「レイヤーのロック」と「配下図形のシェイプシート直叩き(LockDeleteやLockMove)」の二重構造を採用している。これにより、鉄壁のセキュリティが担保される。

3. エラーハンドリングとトランザクション的思考

Visioの図面は時として、他システムからコンバートされた不整合な図形(保護セルを持たない特殊なオブジェクトなど)を含んでいる。`On Error Resume Next` をサブルーチン内に限定して使用し、一部の例外でマクロ全体がクラッシュするのを防ぐ設計にしている点に注目してほしい。

データベース・外部ファイル連携への拡張性

このマクロを単発の便利ツールで終わらせてはならない。
実務の現場では、「どの図面の、どのレイヤーを、いつ・誰がロックしたか」というメタデータを、外部データベース(SQL ServerやSharePointリスト、あるいはJSON設定ファイル)と同期させる必要がある。

例えば、`SecureCriticalLayer` プロシージャの実行成功時に、ドキュメントプロパティ(`Document.DocumentSheet`)へタイムスタンプを書き込んだり、社内APIへログを飛ばすフックを仕込んでおくことで、「バージョン管理された設計図の自動化パイプライン」のピースとして組み込むことが可能になる。

結びにかえて

自動化とは、人間の記憶や注意力という「最も信頼できないリソース」をシステムで補完することだ。
「誰も重要レイヤーを触らないでください」と朝礼で叫ぶよりも、このマクロをワンクリック、あるいはドキュメントオープン時のイベント(`ThisDocument_DocumentOpened`)にフックさせて自動実行させるほうが、100倍確実で、1000倍健全である。

あなたの描くVisio図面を、ただの「絵の集まり」から「信頼性の高いエンジニアリング資産」へと昇華させてほしい。

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