Visio図面を「要塞化」せよ:Document.ProtectShapesとProtectStylesによる誤操作・改ざん完全防止の実装術
開発プロジェクトの現場において、Visioで作成したフローチャートやネットワーク図、プラント図を関係者に配布した瞬間、こんな悲劇が起きたことはないだろうか。
- 「誰かがうっかり図形をドラッグして動かしまい、配線がグチャグチャになった」
- 「マスタとして共有しているはずの図面のスタイル(色やフォント)が勝手に変更されていた」
- 「レビュー中の図面が意図せず書き換えられ、どれが最新か分からなくなった」
Visioはビジュアル表現に優れる反面、プレーンな状態のファイルは「誰でも・どこでも・簡単に」編集できてしまう。これが業務インフラや監査対象のドキュメントであれば致命傷だ。
今回は、Visio VBAの根幹をなすドキュメント保護プロパティ `Document.ProtectShapes` と `Document.ProtectStyles` を駆使し、図面の編集完了と同時にファイルを「要塞化(ロック)」するプロダクションコードを伝授する。
単にプロパティを叩くだけの幼稚なコードではない。オブジェクトのライフサイクル、ユーザーの利便性を考慮したトグル制御、そして実務で必ず直面する「保護解除のパスワード運用」まで踏み込んだ、プロのための実践知を公開しよう。
—
1. なぜ「個別の図形ロック」ではダメなのか?
初学者が陥りやすい罠が、`Shape.MsoTriState` や個別のプロパティ(`LockMove`, `LockText` など)で全図形を走査してロックしようとするアプローチだ。
‘ 【アンチパターン】絶対にやってはいけない実装
Dim shp As Visio.Shape
For Each shp in ActivePage.Shapes
shp.CellsU(“LockMove”).ResultIU = True ‘ 意味のない泥沼コード
Next shp
このやり方は、以下の理由から現場の業務効率を確実に破壊する。
1. パフォーマンスの絶望的な劣化: ページ内の図形数(Shape)が数百個を超えた瞬間、VBAのループ処理が重くなり、Visioがフリーズしたかのような挙動を示す。
2. 保守性の欠如: 後から動的に追加された図形がすべて「無防備」になるため、イベントハンドラ等で監視し続けなければならず、コードベースがスパゲッティ化する。
3. 二度手間の温床: 修正が必要になった際、全図形のロックを一つずつ解除する地獄のデバッグ作業が待っている。
解法:ドキュメントレベルでの一括制御
Visioのアーキテクチャには、ドキュメント全体に対して強力な歯止めをかけるフラグが用意されている。それが `Document` オブジェクトの保護プロパティだ。
文書全体をレイヤーの如く包み込むため、パフォーマンスへの影響はゼロに等しく、新規追加される図形も含めて一網打尽にロックできる。
—
2. 保護制御のコアメカニズム
今回制御する主要なプロパティは以下の2つである。
- `Document.ProtectShapes`
- `True`に設定すると、図形の位置変更、サイズ変更、回転、テキストの編集、新規図形の追加・削除が一切禁止される。
- `Document.ProtectStyles`
- `True`に設定すると、スタイルの定義変更や、図形への新しいスタイルの適用が禁止される。デザインの統制を維持するために極めて有効。
これらを組み合わせることで、「見る・読む」ことは自由だが、「壊す・歪める」ことは絶対に許さない読み取り専用の堅牢なキャンバスが完成する。
—
3. 【コピペ即実戦】要塞化・解除をトグル制御するプロダクションコード
以下のコードは、現在の保護状態を判定し、ロック(要塞化)とアンロック(編集モード)をボタンひとつで切り替える実用モジュールだ。
エラーハンドリング、画面描画の凍結(パフォーマンス最適化)、イミディエイトウィンドウへのログ出力など、現場のプレッシャーに耐えうる堅牢な設計を取り入れている。
Option Explicit
‘ ==============================================================================
アクティブ図面の保護状態(Shapes / Styles)をトグル制御するプロシージャ
‘ 業務フローの完了時(ロック)と改修時(アンロック)の切り替えに使用する。
‘ ==============================================================================
Public Sub ToggleDocumentProtection()
‘ 画面描画を停止し、処理速度を劇的に向上させる(Visio VBAの鉄則)
Application.ScreenUpdating = False
Dim targetDoc As Visio.Document
Set targetDoc = ActiveDocument
‘ ドキュメントが開かれていない、またはステンシル等の場合は処理を中断
If targetDoc Is Nothing Then
MsgBox “アクティブな図面が存在しません。”, vbCritical, “エラー”
GoTo CleanUp
End If
On Error GoTo ErrorHandler
‘ 現在の保護状態を判定(ShapesとStylesの双方がロックされているか)
Dim isCurrentlyProtected As Boolean
If (targetDoc.ProtectShapes = True) And (targetDoc.ProtectStyles = True) Then
isCurrentlyProtected = True
Else
isCurrentlyProtected = False
End If
If isCurrentlyProtected Then
‘ ==========================================
‘ 【アンロック処理】 編集モードへ移行
‘ ==========================================
‘ ※実務ではここでパスワード入力を挟むことを強く推奨します
If ConfirmPassword(“編集モードへ移行します。パスワードを入力してください:”) = True Then
targetDoc.ProtectShapes = False
targetDoc.ProtectStyles = False
MsgBox “図面の保護を解除しました。編集が可能です。”, vbInformation, “保護解除”
Debug.Print “[” & Now & “] Document Unlocked: ” & targetDoc.Name
Else
MsgBox “パスワードが一致しないため、保護を維持します。”, vbExclamation, “認証失敗”
End If
Else
‘ ==========================================
‘ 【ロック処理(要塞化)】 完了モードへ移行
‘ ==========================================
targetDoc.ProtectShapes = True
targetDoc.ProtectStyles = True
MsgBox “図面を要塞化しました(位置・スタイル変更ロック完了)。”, vbInformation, “保護完了”
Debug.Print “[” & Now & “] Document Locked: ” & targetDoc.Name
End If
CleanUp:
‘ 画面描画の復元
Application.ScreenUpdating = True
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “システムエラー”
Resume CleanUp
End Sub
‘ ==============================================================================
‘ 簡易パスワード認証関数(必要に応じてハッシュ化や外部設定に置き換え可能)
‘ ==============================================================================
Private Function ConfirmPassword(ByVal promptMessage As String) As Boolean
Const ADMIN_PASSWORD As String = “VisioMaster2024” ‘ ※プロダクション環境では環境変数等で隠蔽推奨
Dim inputStr As String
inputStr = InputBox(promptMessage, “セキュリティ認証”)
If inputStr = ADMIN_PASSWORD Then
ConfirmPassword = True
Else
ConfirmPassword = False
End If
End Function
—
4. チーフアーキテクトからの実践アドバイス:ファイル運用上の注意点
このVBAを組み込んだVisio図面( `.vsdm` マクロ有効図面)を運用する際、以下の3点を必ずプロジェクトメンバーに周知してほしい。
1. 保存のタイミングに注意せよ
`ProtectShapes = True` を実行した後に図面を上書き保存(`ActiveDocument.Save`)すると、その状態が永続化される。次回ファイルを開いたときから編集がロックされるため、「提出前最終版の作成フロー」のトリガーとして組み込むのが最も美しい。
2. 自動保存(AutoRecover)との兼ね合い
厳重なセキュリティが求められる環境では、マクロ無効形式(`.vsdx`)として別名保存された際に保護が無効化されるリスクを考慮し、ドキュメントを開いた際のイベント(`ThisDocument_DocumentOpened`)で強制的に保護を再適用する防御的コードを合わせて実装しておくと完璧だ。
3. チーム開発におけるバージョン管理
バイナリに近いVisioファイルをGit等で差分管理するのは困難を極める。だからこそ、「レビュー完了=要塞化」のルールをこのVBAで強制し、誰も中身を狂わせることができない状態を作ることが、プロジェクト破綻を防ぐ最大の防衛策となる。
プロフェッショナルなツールとは、単に動くだけでなく、「ユーザーのうっかりミス」や「不正な改ざん」をシステム側で完封するものでなければならない。
このコードをあなたのVisioソリューションに組み込み、ドキュメントの品質と信頼性を極限まで高めてほしい。
