【入門編】保存確認ダイアログを出さずに閉じる:Document.Savedプロパティとサイレントクローズ – Visio VBA解析バイブル

スポンサーリンク

こんにちは!Visio VBAの世界へようこそ。
マクロの記録ボタンを押して「なんとなく動くコードはできたけれど、実務で大量のファイルを処理させようとすると、なぜか画面が固まったり、余計なダイアログが出てイライラする……」そんな壁にぶつかっていませんか?

大丈夫、その壁を突破するのは簡単です。今回は、大量の図面ファイルをバックグラウンドで一網打尽に処理するための極意、「保存確認ダイアログを出さずにファイルをスマートに閉じる(サイレントクローズ)」というテクニックを伝授します。

ここをクリアすれば、あなたのVisio VBAスキルは「おもちゃのマクロ作成」から「プロの業務自動化」へと一気にステップアップしますよ。さあ、一緒に本質を学んでいきましょう!

1. なぜVisioは勝手に「保存しますか?」と聞いてくるのか?

大量のVisioファイルをVBAで開き、色を変えたりテキストを書き換えたりして閉じる――そんなバッチ処理を組んだとします。
コードの最後に `ActiveDocument.Close` と書いただけだと、ファイルごとにこんなダイアログがポップアップしていませんか?

> 「変更を保存しますか? [はい] [いいえ] [キャンセル]」

……これ、100ファイルあったら100回クリックしなきゃいけないの?
地獄ですよね。夜間に自動実行させたいのに、このダイアログ1枚で処理が完全にストップしてしまいます。

なぜこの現象が起きるかというと、Visio(およびExcelやWordなどのOfficeアプリ)は、「ユーザーが意図しないうちに大切な変更データが消えてしまわないように守る」という親切心(お節介)機能を持っているからです。

このお節介をピタッと止め、完全に無言で(サイレントに)ファイルを閉じるための鍵が、`Document.Saved` プロパティ です。

2. 魔法のフラグ:`Document.Saved` の正体

Visioの裏側では、すべてのドキュメント(`Document` オブジェクト)が心の中にフラグを持っています。それが `Saved` フラグ です。

  • `Saved = False` : 「最後に保存してからの間に、何か変更が加えられました!」(=閉じるときに確認が必要)
  • `Saved = True` : 「変更は一切ない(あるいは、もう保存済みです)」(=安心してそのまま閉じられる)

つまり、VBAでプログラム的に「このファイルはもう保存する必要はない状態だよ(あるいはもう保存したよ)」とVisioに嘘偽りなく教えてやれば、Visioは安心し、あの面倒な確認ダイアログを出さずにスッと閉じてくれるのです。

3. 実践!サイレントクローズを実装するコードパターン

それでは、実際の現場で即戦力となるコードを見てみましょう。
今回は、「特定のフォルダにあるVisioファイルをすべて開き、何らかの処理をしたあと、変更を保存して(あるいは保存せずに)静かに閉じる」というシナリオを想定します。

Sub SilentCloseSample()
Dim doc As Visio.Document
Dim targetPath As String

‘ 処理対象のファイルパス(環境に合わせて書き換えてください)
targetPath = “C:\Work\SampleDrawing.vsdm”

‘ 1. ドキュメントを開く
Set doc = Documents.Open(targetPath)

‘ ==========================================
‘ ここで何かしらの自動化処理を行うとする
‘ 例:図面のタイトルを変更する
‘ doc.Pages(1).Shapes(1).Text = “自動更新された図面”
‘ ==========================================

‘ パターンA:変更を保存して、ダイアログを出さずに閉じる場合
‘ ——————————————
‘ ① まずファイルを上書き保存する
doc.Save

‘ ② 「保存済み」の状態であることをVisioに明示する(超重要!)
doc.Saved = True

‘ ③ ダイアログなしで閉じる
doc.Close

‘ 【別解】パターンB:変更を破棄して(保存せずに)、ダイアログを出さずに閉じる場合
‘ ——————————————
‘ ① 「もう保存済み(変更を無視していい)」とフラグを偽装する
‘ doc.Saved = True

‘ ② そのまま閉じる
‘ doc.Close

MsgBox “処理が完了しました!”, vbInformation
End Sub

コードの急所:なぜ `doc.Save` の後でも `doc.Saved = True` が必要なのか?

「`doc.Save` を実行したんだから、自動的に `Saved` は `True` になるんじゃないの?」と思いますよね。
基本的にはその通りですが、Visioのオブジェクトモデルの挙動や、複雑なアドイン・シェイプのイベントが絡むと、保存直後であっても内部フラグがズレることが稀にあります。

「閉じる直前に、自らの手で `doc.Saved = True` を叩き込む」
これが、百戦錬磨のエンジニアが実践する、泥臭くも確実な防衛策(ベストプラクティス)です。この一手間で、予期せぬダイアログの割り込みを100%封じ込めることができます。

なにか疑問点や、「こういう複雑な一括処理をさせたいんだけど…」といった実務での悩みがあれば、いつでも気軽にエンジニア仲間を頼るように質問してくださいね。応援しています!

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