Visio VBAの「守りの極意」:読み取り専用でファイルを開き、資産を物理的に保護する
こんにちは。業務自動化の現場でVisioと格闘し続けている皆さんに、今日は「Visio VBAの基本にして最強の防御策」を伝授しましょう。
マクロを組んでいると、ついやってしまうのが「テスト実行中に元の図面ファイルを誤って上書き保存してしまう」というミスです。大切なテンプレートやマスタ図面が書き換わってしまった時の絶望感……エンジニアなら誰もが一度は通る道ですよね。
今回は、そんな悲劇を物理的に防ぐための「読み取り専用で開く(OpenEx)」という強力なメソッドを解説します。これをマスターすれば、あなたの自動化コードは一段とプロフェッショナルなものになります。
—
なぜ「ただ開く」だけではダメなのか?
通常の `Documents.Open` を使うと、Visioは「編集する気満々」でファイルを開きます。この状態で誤って `ActiveDocument.Save` を呼んでしまうと、修正前のデータは跡形もなく消え去ります。
私たちが目指すべきは、「どれだけコードが暴走しても、元のファイルには一切指一本触れさせない」という、堅牢なガードを敷くことです。
—
魔法のメソッド:`Documents.OpenEx`
Visio VBAでファイルを操作する際、最も信頼できるのが `OpenEx` メソッドです。これには「フラグ」という設定項目があり、ここを操作することでファイルの開き方を自由自在に制御できます。
【極限の実装コード】
まずは、以下のコードを標準モジュールに貼り付けてみてください。
Sub OpenDrawingReadOnly()
‘ 変数の宣言:Visioのオブジェクトを扱うための基本です
Dim vsoApp As Visio.Application
Dim vsoDoc As Visio.Document
Dim filePath As String
‘ 対象となるファイルのパスを指定してください
filePath = “C:\Projects\Template_Master.vsdx”
‘ エラーハンドリング:ファイルが存在しない場合などに備えます
On Error Resume Next
‘ OpenExの真骨頂:フラグ設定で「読み取り専用」を強制します
‘ visOpenRO: 読み取り専用で開く
‘ visOpenDocked: ドッキングウィンドウを表示しない(高速化)
Set vsoDoc = Application.Documents.OpenEx(filePath, visOpenRO + visOpenDocked)
‘ エラーチェック
If vsoDoc Is Nothing Then
MsgBox “ファイルのオープンに失敗しました。パスを確認してください。”, vbCritical
Exit Sub
End If
‘ ここで処理を記述します
‘ 例:vsoDoc.Pages(1)…
MsgBox “読み取り専用モードで開きました。安心して操作してください。”
‘ ※注意:読み取り専用なのでSaveは実行されません(物理的に防がれます)
End Sub
—
コードのここがポイント!
1. `visOpenRO` (Read Only)
これが今回の主役です。このフラグを立てるだけで、Visioは対象ファイルを「読み取り専用」として扱います。ユーザーが手動で上書き保存しようとしても、システムが警告を出して拒否してくれます。
2. `visOpenDocked` の恩恵
初心者のうちは見落としがちですが、図面を開く際に「ウィンドウをドッキングさせる」処理は、描画負荷を下げ、マクロの実行速度を劇的に向上させます。パフォーマンスを意識するなら必須のフラグです。
3. エラーハンドリングの重要性
`On Error Resume Next` を活用し、ファイルがない場合や権限がない場合にプログラムが突然停止(クラッシュ)するのを防いでいます。現場で動くコードとは、常に「失敗すること」を前提に書かれています。
—
陥りやすい罠と対策
- 「読み取り専用」なのに保存しようとしてしまう
`vsoDoc.Save` を書いてしまうと、Visioは「名前を付けて保存」ダイアログを表示させようとします。これでは自動化が止まってしまいます。読み取り専用で開いた後は、`Save` メソッドを一切書かないか、もし変更内容を保存したい場合は `SaveAs` で別のファイル名に出力するように設計しましょう。
- パスの指定ミス
パスにスペースや日本語が含まれる場合、エラーになりやすいです。必ずダブルクォーテーションで囲むか、変数を経由させてください。
—
さあ、次のステップへ
この `OpenEx` を使いこなせるようになれば、あなたのVisio VBAは「実験場」から「安全な製造ライン」へと進化します。
「読み取り専用で開いて、抽出したデータだけを別の場所に保存する」
これが、大規模な自動化システムにおける基本原則です。
もしコードが期待通りに動かない、あるいは「もっと複雑な図面操作を自動化したい」という野望が芽生えたなら、それはあなたがエンジニアとして一段階上のステージに上がった証拠です。いつでもここへ相談に来てくださいね。
皆さんの自動化ライフが、より堅牢で快適なものになりますように!
