Visio VBAにおける「サイレント保存」の極意:AlertResponseを制する者が自動化を制す
業務自動化の現場において、Visioの自動化ほど「ユーザーの介入」という名の不純物が忌々しく感じるものはない。特に、バッチ処理の最中に突如として画面中央に出現する「上書き確認ダイアログ」。このGUIの亡霊は、我々が積み上げた自動化のアーキテクチャを容易に砂上の楼閣へと変えてしまう。
本稿では、`Application.AlertResponse` を駆使し、Visioの保存処理を完全に「サイレント」化する極限のテクニックを伝授する。これは単なる小手先のテクニックではない。システムエンジニアとして、プロセスの不可逆性を担保するための「防御的プログラミング」の真髄である。
—
なぜ `DisplayAlerts` ではなく `AlertResponse` なのか
多くのエンジニアが「ダイアログを消す」ために `Application.DisplayAlerts = False` を使用しようとする。しかし、Visioにおいてこのプロパティは、Excelほど万能ではない。
Visioの真の制御権を握るのは `AlertResponse` プロパティだ。これは、本来ダイアログが表示されるべき状況で、Visioが自動的に選択すべき「戻り値」を整数で強制するものである。
- AlertResponse = 0: ダイアログを表示する(デフォルト)
- AlertResponse = 6 (IDYES): 「はい」を選択したとみなす
- AlertResponse = 7 (IDNO): 「いいえ」を選択したとみなす
これを活用することで、ユーザーの操作を介さず、論理的に「上書き」を確定させることができる。
—
【実装】完璧なサイレント保存のためのVBAコード
以下のコードは、単に保存するだけでなく、メモリ管理とエラーハンドリングを考慮した、「現場で即戦力となる」構成である。
‘ ————————————————————————-
‘ @brief Visioドキュメントをユーザー介入なしで上書き保存するプロシージャ
‘ @param targetDoc 保存対象のVisioドキュメントオブジェクト
‘ ————————————————————————-
Public Sub SilentSave(ByVal targetDoc As Visio.Document)
Dim originalResponse As Long
‘ 現在のAlertResponseを退避(スタック管理の基本)
originalResponse = Application.AlertResponse
On Error GoTo ErrorHandler
‘ 1. 自動応答を「はい (IDYES: 6)」に固定
Application.AlertResponse = 6
‘ 2. 保存実行
‘ SavedプロパティをFalseにすることで、変更の有無に関わらず保存を強制
If Not targetDoc.Saved Then
targetDoc.Save
End If
Cleanup:
‘ 3. 処理終了後、必ず元の状態に戻す(最重要)
Application.AlertResponse = originalResponse
Exit Sub
ErrorHandler:
Debug.Print “Error: ” & Err.Description
Resume Cleanup
End Sub
—
アーキテクトの視点:安定稼働のための3つの規律
このコードをプロダクション環境に投入する際、以下の3点に妥協してはならない。
1. 状態の復元(ステートレス性の維持)
`AlertResponse` を書き換えたまま終了すると、後続のプロセスやユーザーの手動操作に致命的な影響を与える。必ず `On Error` 構文の `Cleanup` ラベルで値を元に戻すこと。これはVBAにおける「finallyブロック」の代用であり、リソースリークを防ぐための鉄則である。
2. オブジェクトのライフサイクル管理
今回、`Visio.Document` を引数に取っているが、呼び出し元で `Set doc = Nothing` を忘れてはならない。VisioのドキュメントオブジェクトはCOMの参照カウンタで制御されている。放置すればメモリ上にゾンビプロセス(見えないVisioインスタンス)が残り、次回のバッチ実行時にファイルロックエラーを引き起こす主原因となる。
3. PDF出力時の罠
もしPDF出力も併せて行う場合、`Document.ExportAsFixedFormat` を使用することになるが、ここでも `AlertResponse` は有効だ。保存先ファイルが既に存在する場合、PDFドライバの警告を抑制できる。
—
レガシー環境とWindows APIの境界線
もし、上記コードでも制御できない「外部モジュール由来のダイアログ」に遭遇した場合は、`FindWindow` や `SendMessage` を用いたWindows APIによるダイアログの強制クローズが必要になる。
しかし、それは最後の手段だ。「APIでウィンドウを叩き割る」よりも「アプリケーションのプロパティを正しく制御する」ほうが、はるかに堅牢である。 APIの呼び出しはOSのバージョンやビット数(32bit/64bit)に依存し、技術的負債になりやすいからだ。
結論:自動化は「静寂」と共に
自動化の完成度は、その処理がいかに「無音」であるかで決まる。ユーザーが気づかないうちに、膨大な図面ファイルが最新化され、PDFがサーバーに吐き出される。この「神の視点」に近い制御を可能にするのが、`AlertResponse` を掌握したエンジニアの武器である。
さあ、あなたのVisio自動化システムから、不要なダイアログという名のノイズを徹底的に排除せよ。それが、システムアーキテクトとしての矜持だ。
