Visio自動化の「黙らせる技術」:上書きダイアログを制御し、真の無人化を実現する
業務自動化を推進する中で、VisioのVBAコードが「途中で止まる」ことほど無駄なものはありません。特に、夜間バッチや大量の図面生成処理において、画面に現れる「ファイルが既に存在します。上書きしますか?」というダイアログは、自動化を志すエンジニアにとって最大の敵です。
今日は、Visioの生存戦略において避けて通れない「AlertResponseプロパティによるダイアログ制御」について、現場で即戦力となる堅牢な実装ノウハウを伝授します。
—
1. なぜ「手作業の感覚」でコードを書いてはいけないのか
多くの初心者が陥る罠は、保存処理の直前にダイアログが出ることを予測せず、エラーハンドリングを怠ることです。
「ファイルがあれば上書きする」というUI上の動作は、VBAの世界では「対話的介入」とみなされます。自動化プロセスは「非対話的」でなければなりません。Visioの `Application.AlertResponse` を適切に制御できないシステムは、数時間放置した後に「ダイアログで止まっていた」という悲劇を招きます。
—
2. 核心技術:AlertResponseのライフサイクル管理
`Application.AlertResponse` プロパティは、Visioがユーザーへの確認を求めた際、「自動的に返すべき応答値」をあらかじめ定義するものです。
しかし、注意してください。この設定は、プロセス全体に影響を与えます。 処理が終わった後に元の状態(ダイアログを表示する設定)に戻さなければ、他の警告までも握りつぶしてしまい、重大なミスを見逃す原因となります。
プロダクションコード:サイレント保存のテンプレート
以下のコードは、エラー発生時にも確実に設定を復元する「安全な設計」に基づいています。
Public Sub SaveDrawingSilently(targetDoc As Visio.Document, savePath As String)
Dim originalAlertResponse As Long
‘ 1. 現在のAlertResponseの設定を退避(バックアップ)
originalAlertResponse = Application.AlertResponse
‘ 2. 自動応答モードに切り替え
‘ idOk(1) は「OK」ボタンを自動押下する設定
‘ ※保存ダイアログ等の「上書きしますか?」に対してYesを返す
Application.AlertResponse = 1
On Error GoTo Cleanup
‘ 3. 保存実行
‘ SaveAsではなくSaveAsExを使用することで、より細かい制御が可能
targetDoc.SaveAsEx savePath, Visio.VisSaveAsOptions.visSaveAsNoPrompt
Debug.Print “正常に保存完了: ” & savePath
Cleanup:
‘ 4. 異常終了時でも確実に設定を戻す(重要)
Application.AlertResponse = originalAlertResponse
If Err.Number <> 0 Then
MsgBox “保存中にエラーが発生しました: ” & Err.Description, vbCritical
End If
End Sub
—
3. エンジニアが守るべき3つの鉄則
コードをコピペするだけでなく、以下の設計思想を頭に叩き込んでください。
① `SaveAs` ではなく `SaveAsEx` を選べ
単なる `SaveAs` メソッドは、Visioのバージョンや環境によって挙動が揺らぐことがあります。`SaveAsEx` と `visSaveAsNoPrompt` フラグを組み合わせることで、OSレベルの干渉を最小限に抑え、コードによる強制力を高めることができます。
② エラーハンドリングは「蓋」ではなく「復旧経路」
先述のコードのように `On Error GoTo` を駆使し、エラーが発生しても必ず `Application.AlertResponse` をデフォルト値(通常は0)に戻す構造にしてください。これを怠ると、以降のVisio操作で「必要な警告」まで表示されなくなり、デバッグが困難になります。
③ ファイルシステムとの非同期を意識せよ
ネットワークドライブやクラウド同期フォルダ(OneDrive等)へ保存する場合、Visio側の保存が完了しても、OS側でファイルロックが解除されるまでわずかなラグが生じます。大量のファイルを連続処理する場合は、`Sleep` API等で数ミリ秒の余裕を持たせるか、ファイル生成後にサイズが0バイトでないことを確認するチェックロジックを入れるのが「玄人」の振る舞いです。
—
最後に:自動化の先にあるもの
このテクニックを身につければ、あなたは「Visioの画面を監視する作業」から解放されます。
自動化の真髄は、コードを動かすことではなく、「例外が発生してもシステムが自律的に正常な状態へ復帰する設計」を組み込むことにあります。今回紹介した `AlertResponse` の制御は、まさにその第一歩です。
さあ、退屈なクリック作業をコードに置き換え、よりクリエイティブな課題に時間を使ってください。あなたの自動化ツールが、現場を支える堅牢なインフラになることを期待しています。
