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

スポンサーリンク

こんにちは!Visioでの図面作成、いつもお疲れ様です。
回路図や建築の躯体図、ネットワークの基幹配線など、「絶対に動かされては困る背景やベース図面」の上に、レイアウトや機器配置を書き込んでいく……というシチュエーション、実務では本当によくありますよね。

「うっかりクリックしてしまい、大事な基幹配線がズレてしまった!」
「後から修正が入った時に、どれが動かしていい図形で、どれが固定すべき図形分からなくなった!」

そんなヒヤリ・ハットを防ぐために、今回は「特定の重要レイヤーに属する全図形を一括でロック(編集不可)にする」という、実務で即戦力になるVisio VBAマクロの作り方を解説します。

ここをクリアすれば、Visioオブジェクトモデルの基礎と、レイヤー制御の極意がバッチリ身につきますよ。一緒にマスターしていきましょう!

1. Visio VBAの階層構造をイメージしよう

まず、VisioのVBAを書く上で絶対に知っておかなければならない「オブジェクトの階層(ツリー構造)」を確認します。Visioの世界は、ロシアの民芸品「マトリョーシカ」のように、大きな入れ物の中に小さな入れ物が入っています。

Application (Visioアプリ全体)
└── Document (開いているファイル)
└── Page (現在見ているページ)
├── Layer (レイヤー:図形を分類するグループ)
└── Shape (実際の図形たち)

今回のミッションは、「特定のPageの中にある、特定のLayerを探し出し、そこに属するShapeたちを一網打尽にしてロックする」ことです。

2. 実践!レイヤー一括ロックマクロのコード

それでは早速、実際のコードを見てみましょう。
以下のコードをVisioのVBAエディタ(`Alt` + `F11`)に貼り付けて実行するだけで、指定したレイヤーを完全に保護することができます。

Sub LockCriticalLayer()
Dim vsoPage As Visio.Page
Dim vsoLayer As Visio.Layer
Dim vsoShape As Visio.Shape
Dim targetLayerName As String
Dim isLayerFound As Boolean

‘ — 設定エリア —
‘ ロックしたい重要レイヤーの名前をここに指定します(例:「躯体図」「基幹配線」)
targetLayerName = “基幹配線”
isLayerFound = False

‘ アクティブなページを取得
Set vsoPage = ActivePage

‘ 1. ページ内の全レイヤーを走査し、目的のレイヤーを探す
For Each vsoLayer in vsoPage.Layers
If vsoLayer.Name = targetLayerName Then
isLayerFound = True

‘ 2. そのレイヤーに属する図形をすべて取り出す
For Each vsoShape in vsoLayer.Shapes

‘ 3. 図形の保護プロパティを設定(位置とサイズの変更を禁止)
‘ visSLockLocX, visSLockLocY などのフラグをONにします
‘ ここでは「全般的なロック」として主要なプロパティを1に設定
vsoShape.CellsU(“LockCrop”).ResultIU = 1
vsoShape.CellsU(“LockDelete”).ResultIU = 1
vsoShape.CellsU(“LockMoveX”).ResultIU = 1
vsoShape.CellsU(“LockMoveY”).ResultIU = 1
vsoShape.CellsU(“LockRotate”).ResultIU = 1
vsoShape.CellsU(“LockWidth”).ResultIU = 1
vsoShape.CellsU(“LockHeight”).ResultIU = 1

Next vsoShape

MsgBox “レイヤー「” & targetLayerName & “」の全図形をロックしました。”, vbInformation, “処理完了”
Exit For
End If
Next vsoLayer

‘ 4. 該当するレイヤーが見つからなかった場合のハンドリング
If Not isLayerFound Then
MsgBox “指定されたレイヤー「” & targetLayerName & “」が見つかりませんでした。”, vbExclamation, “エラー”
End If

End Sub

3. コードのポイントと「知っておくべき極意」

初学者のうちは、「えっ、図形を1つずつループで回してロックするの?」と驚いたかもしれません。ここにはVisio VBAを使いこなすための重要なポイントが詰まっています。

① `vsoLayer.Shapes` という隠れた強力なコレクション

Visioのレイヤーは、単なる「表示・非表示のスイッチ」だけではありません。「そのレイヤーに所属している図形のコレクション(集まり)」を保持しています。これを利用することで、ページ全体から「このレイヤーの図形はどれだっけ…?」と探す手間が省け、一発でターゲットの図形群にアクセスできます。

② なぜ `.CellsU` でロックするのか?

Visioの図形(Shape)は、位置やサイズ、色など、あらゆるプロパティを「シェイプシート(ShapeSheet)」という表形式のデータで管理しています。
VBAからこのシェイプシートのセル(Cell)にアクセスするのが `CellsU` メソッドです。

  • `LockMoveX` / `LockMoveY`: 縦横の移動を禁止
  • `LockDelete`: 誤削除を禁止
  • `LockRotate`: 回転を禁止

これらをプログラムから `1`(Trueの意味)に書き換えることで、ユーザーがマウスで触ってもビクともしない鉄壁の図形が完成します。末尾の `U` は「Universal(言語に依存しない内部名)」のUで、英語以外の環境でもバグらないためのエンジニアの常識です。

4. 陥りやすいエラーと実務での注意点

実際にこのマクロを現場で運用する際、初心者がハマりがちなポイントをいくつかシェアしておきますね。

エラー①:レイヤー名が一致しない(実行時エラーにならない罠)

変数 `targetLayerName = “基幹配線”` と指定したついでに、図面側のレイヤー名が「基幹配線図」になっていたりすると、コードはエラーを出さずにスルーしてしまいます。「動かしたのにロックされない!」という時は、大文字・小文字、全角・半角、前後のスペースの入力を真っ先に疑ってください。(上記のコードでは、見つからなかった場合にちゃんと警告が出るように `isLayerFound` フラグを仕込んであるので安心ですね)

解除用マクロ(アンロック)もセットで作っておこう

ロックするマクロを作ったら、当然「やっぱり修正が入ったからロックを解除するマクロ」も必要になります。解除する場合は、先ほどのコードの `ResultIU = 1` を `ResultIU = 0` に書き換えたマクロをもう一つ用意しておけば完璧です。

まとめ

今回は、Visioの`Page.Layers`と`Shape`のプロパティを組み合わせて、特定の重要レイヤーを完全保護するマクロをご紹介しました。

「マクロの記録」ボタンを押すだけでは絶対に辿り着けない、オブジェクトモデルを理解した者だけが書けるスマートな自動化コードです。これをベースに、例えば「ファイル保存時に自動で重要レイヤーをロックする(`ThisDocument_BeforeSave` イベントの活用)」といった応用へ進んでいくと、さらにVisio自動化のマスターに近づけますよ。

日々の図面作成の安全性を高め、手戻りのストレスをゼロにするために、ぜひ現場の業務に導入してみてください。それでは、また次回の知見でお会いしましょう!

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