【実務・中級編】【初心者向け】開いている図面が保存済みかどうかを判定し、未保存の場合のみ保存を促す条件分岐 – Visio VBA解析バイブル

スポンサーリンク

【Visio VBA】「無駄な保存」を排除せよ。Document.Savedプロパティを制御する極限の設計論

Visioでの自動化において、最も初歩的でありながら、最も軽視されがちなのが「保存の制御」だ。

「とりあえず閉じる前に上書き保存」というコードを書く開発者がいる。だが、考えてみてほしい。数百の図面をバッチ処理で加工する際、一切の変更がなかったファイルに対して無意味なI/O負荷をかけ、タイムスタンプを更新し、バックアップファイルを肥大化させる行為は、エンジニアリングの観点からは「罪」に近い。

本稿では、Visioの`Document`オブジェクトが持つ真のポテンシャルを引き出し、堅牢で無駄のない保存ロジックを実装する「プロの作法」を伝授する。

—

1. なぜ「とりあえず保存」が危険なのか

VisioのVBAにおいて、`ActiveDocument.Save`を漫然と呼ぶことは、以下のリスクを内包している。

  • I/Oボトルネック: ネットワークドライブ上のファイルに対して無意味な上書きを行うことは、大規模な自動化ジョブにおいて処理速度を著しく低下させる。
  • 不要な履歴生成: バージョン管理システムやバックアップ環境において、中身が変わっていないのに「更新日時」だけが変わるファイルは、差分管理のノイズでしかない。
  • 例外処理の欠如: 保存先にアクセス権がない場合や、ファイルが読み取り専用で開かれている場合に、コードがクラッシュする。

プロフェッショナルなツールには、「必要な時に、必要な分だけ」の知性が必要だ。

—

2. 核心:`Document.Saved` プロパティの解釈

Visioの`Document`オブジェクトには、`Saved`という極めて優秀なプロパティがある。これが真(True)であれば、ドキュメントに未保存の変更はない。偽(False)であれば、変更がある。

このプロパティを「監視」し、条件分岐させるのが基本だ。しかし、ここで一つ注意点がある。「名前が付いていない新規作成ファイル」の存在だ。`Path`プロパティが空のファイルを保存しようとすると、`Save`メソッドでは例外が発生する。`SaveAs`を使う必要がある。

—

3. 実装:堅牢な保存制御モジュール

以下は、実務でそのままコピー&ペーストして使える、保守性に配慮したプロシージャだ。

‘ =================================================================
‘ 目的: ドキュメントの変更状態を判定し、必要な場合のみ保存を実行する
‘ 備考: 堅牢性を高めるため、名前なしファイルには別名保存を促す
‘ =================================================================
Public Sub SafeSaveDocument(targetDoc As Visio.Document)
‘ 1. ドキュメントの状態を確認
If targetDoc.Saved Then
Debug.Print “変更なし: ” & targetDoc.Name
Exit Sub
End If

‘ 2. ファイル名がない場合(新規作成直後)の制御
If targetDoc.Path = “” Then
MsgBox “未保存の新規ファイルです。手動で名前を付けて保存してください。”, vbExclamation
Exit Sub
End If

‘ 3. 変更がある場合のみ保存を実行
On Error GoTo ErrorHandler
targetDoc.Save
Debug.Print “保存完了: ” & targetDoc.Name
Exit Sub

ErrorHandler:
MsgBox “保存失敗: ” & Err.Description, vbCritical
End Sub

—

4. プロの現場での設計指針

このコードをベースに、さらに上を目指すための「知見」を共有する。

1. トランザクションとエラーハンドリング

ファイル操作は外部環境に依存するため、常に`On Error`によるガードが必須だ。特にネットワーク越しの場合、切断リスクを考慮し、保存失敗時にリトライを行うロジックを組み込むことも検討すべきである。

2. PDF出力との連携

多くの現場では「保存」と「PDF出力」がセットになる。PDF化の際、`ActiveDocument.ExportAsFixedFormat`を使用するが、PDF出力の直前に必ず`Saved`をチェックし、最新状態であることを担保するフローを構築せよ。未保存の状態でPDFを出力するようなツールは、業務の信頼性を損なう。

3. データベース連携への応用

もしVisio図面をメタデータとしてデータベースで管理しているなら、`Saved`フラグが`False`のままプロセスを終了させない「ガードレール」を設けるべきだ。`BeforeDocumentClose`イベントを拾い、`Saved`プロパティが`False`ならば強制的に保存ダイアログを出すか、自動的にログを残す設計にすると、運用ミスを劇的に減らせる。

—

結びに代えて

自動化とは、単に手作業をコードに置き換えることではない。「システムのリソースをいかに効率的に消費し、結果として業務の品質を底上げするか」という思想そのものだ。

`Document.Saved`という小さなプロパティ一つにこだわること。その細部への執着こそが、あなたの作るツールを「動くゴミ」から「現場を変えるプロダクト」へと昇華させる。

さあ、コードを書き換えよう。無駄な上書きを止め、真に価値ある処理にCPUサイクルを割り当てるために。

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