こんにちは!Visioの自動化の世界へようこそ。
マクロの記録ボタンを押して「なんだか動いたけれど、中身がよく分からない……」という段階を卒業し、自分の手でVisioを自在にコントロールしたいあなたへ。
今回は、業務用の図面テンプレートや最終成果物の納品前によく使われる「図面の保護(ロック)制御」をテーマに解説します。
「せっかく綺麗にレイアウトした図面を、他の人がうっかり動かしてしまって泣く泣く直した……」
そんな悲劇を防ぐために、VBAを使って一瞬で図形やスタイルをガチガチにロックする方法をマスターしましょう。ここをクリアすれば、Visio VBAのオブジェクトモデルの基本はバッチリですよ!
—
1. Visio VBAの階層構造(オブジェクトモデル)を掴もう
VisioのVBAを書く上で、絶対に避けて通れないのが「オブジェクトの親子関係」です。Visioの世界は、ロシアの民芸品「マトリョーシカ」のように、大きな入れ物の中に小さな入れ物が入っています。
今回のテーマに関わる階層を、視覚的に捉えてみましょう。
Application (Visioアプリ全体)
┗ ActiveDocument (現在開いているドキュメント)
┣ Pages (ページコレクション)
┃ ┗ Page (個別のページ)
┃ ┗ Shapes (図形コレクション)
┃ ┗ Shape (個別の図形)
┗ StyleSheets (スタイルシートのコレクション)
今回の主役である `Document.ProtectShapes` と `ProtectStyles` は、この中の `Document`(ドキュメント自体) のプロパティとして存在します。つまり、「そのファイル全体のルールをどうするか」を司る強力なスイッチなのです。
—
2. なぜUIではなくVBAでロックするのか?
Visioの標準機能でも、図形の保護を行うことはできます。しかし、数百個の図形がある複雑なフローチャートや組織図で、一つひとつの図形を選んで「保護」にチェックを入れるのは……考えただけでも気が遠くなりますよね。
VBAを使えば、「ボタン一つで、図面全体のすべての図形とスタイルを一括ロック・一括解除」することが可能です。業務の標準化や、品質管理の観点からもVBAによる自動化は非常に大きな武器になります。
—
3. 実装コード:一括ロック&解除マクロ
それでは、実際の現場でそのままコピペして使える実用的なコードをお見せします。
VisioのVBAエディタ(`Alt + F11`)を開き、標準モジュールに以下のコードを貼り付けてみてください。
Option Explicit
‘ ==============================================================================
‘ 担当エンジニア直伝:図面保護コントロールモジュール
‘ ==============================================================================
‘ 【機能1】図面の全図形とスタイルを完全にロックする
Public Sub LockActiveDocument()
Dim targetDoc As Document
Set targetDoc = ActiveDocument
‘ エラーハンドリングの基本:ドキュメントが開かれていない場合の対策
If targetDoc Is Nothing Then
MsgBox “アクティブな図面が存在しません。”, vbExclamation, “エラー”
Exit Sub
End If
On Error GoTo ErrorHandler
‘ 1. 図形の位置変更やテキスト編集などを一括ロック
‘ Trueを設定することで、ドキュメント内の全シェイプが保護されます
targetDoc.ProtectShapes = True
‘ 2. スタイル(線の太さ、塗りつぶし色など)の変更をロック
targetDoc.ProtectStyles = True
MsgBox “図面の保護を有効化しました。” & vbCrLf & _
“これより図形の位置やスタイルの変更はできません。”, vbInformation, “保護完了”
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
‘ 【機能2】図面のロックを解除する(修正作業用)
Public Sub UnlockActiveDocument()
Dim targetDoc As Document
Set targetDoc = ActiveDocument
If targetDoc Is Nothing Then
MsgBox “アクティブな図面が存在しません。”, vbExclamation, “エラー”
Exit Sub
End If
On Error GoTo ErrorHandler
‘ ロックの解除(Falseを代入)
targetDoc.ProtectShapes = False
targetDoc.ProtectStyles = False
MsgBox “図面の保護を解除しました。” & vbCrLf & _
“編集作業を行うことができます。”, vbInformation, “解除完了”
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
—
4. コードの深掘り解説:ここがプロのポイント
たった数行のコードですが、実務で使うための重要なエッセンスが詰まっています。初心者から一歩抜け出すために、以下のポイントを意識してください。
① `ActiveDocument` の危険性と変数への格納
コードの冒頭で `Set targetDoc = ActiveDocument` と一度変数に受けています。
VBAでは単に `ActiveDocument.ProtectShapes = True` と書いても動きますが、処理の途中でユーザーが別のVisioウィンドウアクティブにしたりすると、意図しないドキュメントをロックしてしまう「事故」が起きる可能性があります。
処理対象を最初にはっきり変数に固定(バインド)するのが、堅牢なプログラムを書くプロの作法です。
② `ProtectShapes` と `ProtectStyles` の違い
- `ProtectShapes`: 図形の移動、リサイズ、回転、テキストの編集、削除などを禁止します。
- `ProtectStyles`: 図面内で定義されているマスターのスタイル(見た目の定義)の変更を禁止し、デザインの統一性を守ります。
この2つをセットで制御することで、図面の「完全な保全」が可能になります。
—
5. 陥りやすい罠とエラー対策
ここで、Visio VBA初心者が必ずと言っていいほどハマる「落とし穴」をシェアしておきます。
- 罠:「あれ?コードを実行したのに、図形が動かせるぞ?」
- 原因と対策: `Document.ProtectShapes = True` は強力ですが、もし個別の図形側(ShapeSheet)で特殊な保護設定が競合している場合や、グループ化の階層構造によっては挙動が異なる場合があります。また、ドキュメントが「読み取り専用」で開かれている場合はプロパティの変更が拒否されます。必ず通常の編集可能状態でテストしてください。
- 罠:マクロ有効図面(.vsdm)として保存し忘れる
- 原因と対策: VBAコードを書いた図面を通常のVisio図面(.vsdx)として保存すると、次に開いたときにコードがすべて消滅します。必ずファイル保存時は「Visio マクロ有効図面 (.vsdm)」を選択するクセをつけましょう。
—
まとめ
今回は、`Document` オブジェクトを使った図面の保護制御について解説しました。
- Visioのオブジェクト階層(Application > Document > Shape)を意識する。
- `ProtectShapes` と `ProtectStyles` で、誤操作や不正改ざんを防ぐ。
- 処理対象は変数に格納して安全に扱う。
この基本さえ押さえておけば、図面の品質管理を自動化する強力なツールを自分で生み出すことができます。
「ここを自動化できたら便利だな」というあなたのアイデアを、ぜひVBAで形にしてみてください。応援しています!
