【入門編】【中級者向け】読み取り専用で開いた図面から情報を抽出し、別名で保存する際の排他制御 – Visio VBA解析バイブル

スポンサーリンク

こんにちは。業務自動化の深淵へようこそ。
「マクロの記録」ボタンを押すだけの世界から、Visioという巨大なオブジェクトモデルを自在に操るエンジニアへと進化しようとしているあなたを、私は心から歓迎します。

今回は、現場で最も頭を悩ませる「共有環境下でのファイル操作と排他制御」についてお話しします。

「他人が開いている図面からデータを吸い出し、自分用のレポートを別名保存したい」。これは自動化における登竜門であり、ここを突破できればあなたの自動化ツールは「おもちゃ」から「プロの道具」へと変貌します。

—

1. なぜ「読み取り専用」で開く必要があるのか?

Visioファイル(VSDX)は、誰かが開いていると「ロックファイル(~$…)」を作成し、書き込みを制限します。無理やり排他制御を無視しようとすればエラーで止まる。だからこそ、私たちは「相手の作業を邪魔せず、かつ確実にデータを吸い上げる」という紳士的なアプローチをとる必要があります。

陥りやすい罠:単なる `Open` メソッド

初心者はこう書きがちです。
`Set doc = Visio.Documents.Open(“path.vsdx”)`

これでは、相手が開いている場合に「使用中です」とダイアログが出て処理が止まります。自動化の敵は「ダイアログ」です。人間がクリックしなきゃいけないツールは、自動化とは言いません。

—

2. 鋼鉄の排他制御:読み取り専用オープンの実装

Visioの `Documents.OpenEx` メソッドを使います。これこそが、アーキテクトが愛する「制御の要」です。

Sub OpenDrawingReadOnly()
Dim doc As Visio.Document
Dim filePath As String
filePath = “C:\Projects\Design_Master.vsdx”

‘ OpenExを使うことで、明示的に読み取り専用(visOpenRO)を指定する
‘ さらに、VisioのUIを抑制(visOpenDontBotherWithUI)することで
‘ 不意のダイアログを無視する「サイレント実行」が可能になります
Set doc = Visio.Documents.OpenEx(filePath, _
Visio.VisOpenSaveArgs.visOpenRO + _
Visio.VisOpenSaveArgs.visOpenDontBotherWithUI)

‘ ここで情報を抽出する処理を行う
Debug.Print “図面タイトル: ” & doc.Title

‘ 処理が終わったら必ず閉じる(メモリリークを防ぐ鉄則)
doc.Close
End Sub

このコードの「本質」

  • `visOpenRO`: 読み取り専用として開くフラグ。これで競合を回避します。
  • `visOpenDontBotherWithUI`: ダイアログを表示させない。これが「無人実行」の鍵です。

—

3. 「別名保存」という名のバトンタッチ

情報を抽出した後、別のファイルとして保存する場合、単なる `SaveAs` ではなく、「名前をつけて保存」のプロセスを意識してください。

実践:読み取り専用から安全に別名保存するロジック

Sub SaveAsWithSafety()
Dim sourcePath As String: sourcePath = “C:\Data\Master.vsdx”
Dim exportPath As String: exportPath = “C:\Data\Report_” & Format(Now, “yyyymmdd_hhnn”) & “.vsdx”
Dim doc As Visio.Document

‘ 1. 読み取り専用で開く
Set doc = Visio.Documents.OpenEx(sourcePath, Visio.visOpenRO + Visio.visOpenDontBotherWithUI)

‘ 2. ここで図面データに対して何か加工や抽出を行う想定
‘ (例: 特定のシェイプのテキストを変更するなど)

‘ 3. 別名で保存(SaveAs)
‘ 注意:読み取り専用で開いているため、Saveは失敗します。必ずSaveAsを使います。
On Error Resume Next ‘ 万が一の権限エラーに備える
doc.SaveAs exportPath
If Err.Number <> 0 Then
MsgBox “保存に失敗しました。パスを確認してください。”
Else
MsgBox “別名保存完了: ” & exportPath
End If
On Error GoTo 0

doc.Close
End Sub

—

4. 知っておくべき「Visioエンジニアの心得」

最後に、一つだけ覚えておいてください。「オブジェクトは必ず解放せよ」です。

VBAにおいて `Set doc = Nothing` を書かないエンジニアは、ゴミを捨てない住人と同じです。特にVisioのような巨大なCOMオブジェクトは、正しく閉じないとバックグラウンドで「ゾンビプロセス」として残り続け、次に開こうとしたときに「ファイルがロックされています」という悪夢を見ることになります。

成功へのチェックリスト

1. OpenExを使っているか?(標準のOpenは卒業しましょう)
2. `doc.Close` を忘れていないか?(Closeしないとロックが残り続けます)
3. エラーハンドリングを入れたか?(`On Error` を使い、異常終了時にプロセスが残らないようにする)

—

先輩からのメッセージ

Visioの自動化は、最初はパズルのように感じるかもしれません。しかし、今回紹介した「OpenExによる制御」をマスターすれば、あなたはもう「マクロ記録」の奴隷ではありません。

図面という「静的な情報」を、コードによって「動的な資産」に変える。これこそがエンジニアの醍醐味です。まずはこのコードをコピーして、あなたのPCで動かしてみてください。何か動かないことがあれば、それは「あなたのコードが悪い」のではなく「Visioという巨人と対話するためのプロトコルを学んでいる最中」だと思ってください。

次は「シェイプの深層構造」についてお話ししましょうか。準備ができたら、またここへ戻ってきてください。応援していますよ。

タイトルとURLをコピーしました