こんにちは! Visioの自動化の世界へようこそ。
マクロの記録ボタンを押して図形をポチポチ動かすフェーズを卒業し、「いざVBAで本格的なツールを作ろう!」と意気込んでいるあなたへ。
今回は、実務で絶対に避けて通れない「ドキュメントの安全管理」、その中でも最もクリティカルな罠である「ステンシルファイルの誤書き換えを防ぐ保護ガード」の極意をお伝えします。
ここをクリアすれば、あなたは単なる「マクロの記録ユーザー」から、組織の資産を守る「チーフアーキテクト」への第一歩を踏み出せますよ。それでは、熱いエンジニア魂を込めて解説していきましょう!
—
なぜ、ステンシル(.vssx)の誤操作は「恐怖」なのか?
Visio VBAを書いていると、うっかり開いているすべてのドキュメントに対して同じ処理をループさせたり、アクティブなウィンドウを対象に一括処理を書いたりすることがあります。
ここで問題になるのが、「図面ファイル(.vsdm)」と「ステンシルファイル(.vssx)」の決定的な違いです。
- 図面 (.vsdm):あなたが自由にレイアウトし、データを埋め込む「キャンバス」。
- ステンシル (.vssx):図面で使うパーツ(マスターシェイプ)を供給する「型枠(マザーシップ)」。
もし、開発中のテストマクロが暴走し、ステンシルファイルに対して直接、不要な図形を書き込んだり、不正なプロパティを上書き保存してしまったらどうなるでしょうか?
企業で共有しているマスターステンシルが破壊され、チームメンバー全員の作業がストップするという大惨事になりかねません。
「開いているのが図面なのか、ステンシルなのか」をVBAの起動時にコンマ数秒で判別し、ステンシルであれば即座に処理を中断・保護するガードロジック。これがプロのエンジニアの必須作法なのです。
—
Visio VBAの心臓部:`Document.Mode` を知る
Visioのオブジェクトモデルにおいて、現在開いているファイル(Document)がどういう状態にあるのかを示すのが `Document.Mode` プロパティ です。
Visio VBAの世界では、`ActiveDocument` やループ中の `VisDoc` といった `Document` オブジェクトが頻繁に登場しますが、この子が「今どんな顔をしているか(モード)」を教えてくれるのが `Mode` プロパティなのです。
`Document.Mode` が返す値の正体
Visioの裏側では、ドキュメントのモードによって以下のような定数(または数値)が割り当てられています。
- `visModeStencil`(数値:1):ステンシルモード(.vssx / .vss)
- `visModeDrawing`(数値:0):図面モード(.vsdm / .vsd / .vdx など)
※他にもグループ編集モードなどがありますが、ファイル単位で最も重要なのはこの2つです。
つまり、マクロの冒頭で `ActiveDocument.Mode` を覗き見して、それが `visModeStencil` であれば、「おっと、ここは触っちゃいけない聖域だ!」と判定して `Exit Sub` すればいいわけです。
—
実装コード:ステンシル誤操作を完全に防ぐ「番人マクロ」
それでは、実際の現場でそのままコピペして使える実用的なコードをプレゼントしましょう。
このコードを標準モジュールに貼り付けて、万が一ステンシルを開いている状態で実行してみてください。
Option Explicit
‘ =====================================================================
‘ @Title: ドキュメントタイプ自動判定ガード付きメインマクロ
‘ @Description: 実行対象がステンシル(.vssx)の場合に処理を強制停止する
‘ =====================================================================
Public Sub SafeExecuteMacro()
‘ 1. ドキュメントが開かれているかどうかの基本チェック
If Application.Documents.Count = 0 Then
MsgBox “現在、開いているVisioドキュメントがありません。”, vbExclamation, “ガードシステム”
Exit Sub
End If
Dim targetDoc As Visio.Document
Set targetDoc = ActiveDocument
‘ =====================================================================
‘ 2. 【核心】Document.Modeによるステンシル判定ガード
‘ =====================================================================
If targetDoc.Mode = visModeStencil Then
‘ 警告メッセージを出して、即座に処理をフック(中止)する
MsgBox “【警告:ステンシル保護発動】” & vbCrLf & _
“対象ファイルはステンシル(.vssx)です。” & vbCrLf & _
“直接の書き換えやマクロの実行は禁止されています。” & vbCrLf & _
“処理を中断しました。”, _
vbCritical, “Visio Architect Guard”
‘ オブジェクトの解放
Set targetDoc = Nothing
Exit Sub
End If
‘ =====================================================================
ニセのメイン処理(ここから下が本来の安全な処理)
‘ =====================================================================
MsgBox “チェッククリア!” & vbCrLf & _
“対象ドキュメントは安全な図面ファイルです (” & targetDoc.Name & “)。” & vbCrLf & _
“業務自動化処理を開始します。”, _
vbInformation, “実行確認”
‘ —- ここに実際の処理を書いていく —-
‘ 例: Dim shp As Visio.Shape …
‘ 後片付け
Set targetDoc = Nothing
End Sub
—
コードのここがポイント!優しく解説
1. `Option Explicit` の徹底
変数の宣言漏れによるバグを防ぐため、常にモジュールの先頭にはこれを書きましょう。プログラマとしての最初の身だしなみです。
2. `ActiveDocument` の安全な取得
`ActiveDocument` は便利ですが、何も開いていない状態で呼び出すと実行時エラー(エラー91など)でマクロがクラッシュします。そのため、最初に `Application.Documents.Count = 0` で「そもそもファイルが開かれているか」を確認するのが定石です。
3. `targetDoc.Mode = visModeStencil` による直球判定
ここでファイルのアイデンティティを見抜きます。もしステンシルであれば、愛ある警告(`vbCritical`)を出して、`Exit Sub` で華麗に撤退します。これにより、間違えてステンシルを上書き保存してしまう事故を100%防ぐことができます。
—
陥りやすい罠:ファイル拡張子だけで判断してはいけない
初心者の方によくある間違いが、「ファイル名の右後ろ4文字(`Right(Doc.Name, 4) = “vssx”`)を見て判断しようとする」アプローチです。
これは非常に危険です。なぜなら:
- ユーザーがファイル名をリネームしているかもしれない。
- 拡張子の表示設定がPCによって異なり、判定がすり抜ける可能性がある。
- Visioの内部オブジェクトモデル的には「ステンシルとしてロードされたドキュメント」であるにもかかわらず、拡張子チェックでは見落とすバグの温床になる。
だからこそ、VisioのAPIが公式に提供している `Document.Mode` (`visModeStencil`) を使うべきなのです。APIを信じること、これがエンジニアとしての正しい道です。
—
まとめ:ここをクリアすれば、Visio VBAの基本はバッチリ!
今回は、`Document.Mode` を使ったステンシル誤書き換え防止のガードロジックについて解説しました。
- 図面 (.vsdm) と ステンシル (.vssx) は役割が全く違う。
- `targetDoc.Mode` を使えば、現在のドキュメントの「顔」が一発でわかる。
- 危険を察知したら、マクロの冒頭(`Exit Sub`)で勇気を持って止めることが、最高品質の自動化ツールへの第一歩。
このガードの考え方を、あなたがこれから作るすべてのツール(一括シェイプ置換、データ流し込み、図形整理マクロなど)の「第1行目」に組み込んでみてください。
ミスを未然に防ぐ堅牢なコードを書けるようになったあなたなら、どんな複雑なVisio自動化の要求も、軽やかにクリアできるはずです。
それでは、次回の極限の知見でお会いしましょう。Happy Coding!
