Visio VBAの深淵へ:共有環境で「読み取り専用」を強制し、衝突をゼロにする排他制御術
こんにちは。現場で泥臭く、しかし美しく自動化を突き詰めているエンジニアです。
Visioを業務で使っていると必ずぶつかる壁があります。それは「誰かがファイルを開いている間に、別の誰かが開いて上書き保存しようとしてエラーになる」という、あの忌々しい競合問題です。
今日は、ネットワーク共有フォルダにあるファイルを、VBAを使って「安全に、かつ確実に読み取り専用で開き、意図しない編集を物理的に遮断する」ための極意を伝授します。
マクロの記録から一歩先へ進みたいあなたへ。この制御をマスターすれば、チーム開発のクオリティが劇的に変わりますよ。
—
1. なぜ「ただ開くだけ」ではダメなのか?
通常、`Documents.Open` メソッドでファイルを開くと、Visioはデフォルトで「書き込み可能な状態」を目指します。もし誰かがそのファイルを開いていれば、Visioは「読み取り専用で開きますか?」とユーザーにダイアログを出しますよね。
自動化の現場でこのダイアログが出るのは「詰み」を意味します。バックグラウンドで動いているプログラムがダイアログで停止しては、業務効率化どころではありません。
そこで登場するのが、`OpenEx` メソッドです。
—
2. 鋼鉄の防御:OpenEx メソッドによる排他制御
`OpenEx` メソッドは、ただファイルを開くだけではなく、「どのような状態で開くか」をビットフラグで細かく指定できる強力な武器です。
実装コード:読み取り専用で確実に開く
まずは以下のコードを見てください。これが現場でそのまま使える「安全なオープン」の雛形です。
Public Sub OpenReadOnlyVisioFile()
Dim vsoApp As Visio.Application
Dim vsoDoc As Visio.Document
Dim filePath As String
‘ 対象ファイルのフルパス(ネットワークドライブ上のパス)
filePath = “\\Server\SharedFolder\NetworkDiagram.vsdx”
‘ 既に開いているかどうかの判定(例外処理の一種)
On Error Resume Next
Set vsoDoc = Application.Documents.OpenEx(filePath, visOpenRO Or visOpenNoTemplates)
If Err.Number <> 0 Then
MsgBox “ファイルのオープンに失敗しました。パスを確認してください。”, vbCritical
Exit Sub
End If
On Error GoTo 0
‘ 読み取り専用で開けたかを確認
If vsoDoc.ReadOnly Then
Debug.Print “成功:ファイルは読み取り専用で保護されています。”
Else
‘ 万が一書き込み可能で開いてしまった場合の強制措置
vsoDoc.ReadOnly = True
End If
End Sub
コードの重要ポイント解説
1. `visOpenRO` (ReadOnly):
これが今回の主役です。明示的に「読み取り専用で開く」という意志をVisioに伝えます。これにより、ダイアログを無視して静かに開くことが可能です。
2. `visOpenNoTemplates`:
テンプレートを読み込ませないオプションです。余計な読み込みを省くことで、ネットワーク経由のファイル読み込みを高速化し、メモリ消費を抑えます。
3. `vsoDoc.ReadOnly = True` (念押し):
開いた後に念のためプロパティを再確認し、もし書き込み可能なら強制的に読み取り専用に切り替えます。二重の安全策ですね。
—
3. 陥りやすい罠:そのファイル、本当に閉じていますか?
初学者がよくやるミスは、ファイルを操作した後に「閉じ忘れ」ることです。
共有フォルダにあるファイルを読み取り専用で開いたとしても、プログラムがバックグラウンドで開きっぱなしにしていると、他のユーザーがファイルを編集できなくなることがあります。
必ず処理の最後には、以下のクリーンアップを行いましょう。
‘ 処理が終わったら確実に閉じる
‘ visDoNotSaveChanges を指定して、編集内容を保存させずに閉じる
vsoDoc.Close
—
4. ステップアップ:PDF出力への応用
読み取り専用で開く理由は、多くの場合「図面をPDFとして書き出すため」ではないでしょうか?
書き込み権限がない状態でPDF出力を行えば、元のファイルを汚すリスクはゼロになります。
‘ PDFへのエクスポート処理
vsoDoc.ExportAsFixedFormat visFixedFormatPDF, “C:\Temp\Output.pdf”
このように、「読み取り専用で開く」+「PDFに出力」+「即座に閉じる」のコンボを組むことで、誰に対しても迷惑をかけない堅牢な自動化ツールが完成します。
—
最後に:エンジニアとしての心構え
Visio VBAは古い言語だと思われがちですが、図面という「資産」を扱う以上、その制御は非常に繊細で知的です。
今回紹介した `OpenEx` を使いこなせれば、あなたはもう「マクロを動かす人」から「システムの安全性を設計する人」へと成長しています。
ネットワーク環境での競合は、今後も避けて通れない課題です。ぜひこの排他制御を自分のコードに組み込み、自信を持って現場へ送り出してください。
もしコードが動かない、あるいはもっと複雑な排他制御が必要になったら、またいつでも聞いてくださいね。応援しています!
