【Visio VBA】その「ダイアログ」が自動化を殺す:AlertResponseで無人処理を完遂せよ
業務自動化エンジニアとして多くの現場を見てきたが、Visioのバッチ処理において最も「素人臭い」ミスは、ダイアログによる停止を軽視することだ。
数千枚の図面変換処理を仕掛けて翌朝確認したら、初めの1枚目で「この図面を保存しますか?」というダイアログが出て止まっていた――。この悲劇を二度と繰り返してはならない。
今日は、Visio VBAにおいて「完全な無人運用」を実現するための必須スキル、`Application.AlertResponse` を掌握するための極限の知見を授ける。
—
1. なぜ「GUIの割り込み」は自動化の敵なのか
Visioのオブジェクトモデルは、本来ユーザーがGUIを介して操作することを前提に設計されている。そのため、ファイル形式の変換、複雑な図形の削除、あるいは外部データのインポート処理において、Visioは親切心から「確認ダイアログ」を表示する。
このダイアログは、VBAのコードから見れば「プログラム実行の中断」を意味する。`DoEvents`で回避しようとするのはナンセンスだ。ダイアログが出た瞬間に制御はOSに奪われる。
これを解決する唯一の正攻法が、`Application.AlertResponse` プロパティによる対話の強制上書きである。
—
2. 堅牢な自動化のためのベストプラクティス
`AlertResponse` を使う際は、以下の「鉄の掟」を守らなければならない。
1. 必ず元の値を保持する: 処理が終わったら必ず元の状態に戻すこと。さもないと、その後のVisio操作でダイアログが一切出なくなり、重要な警告を見落とす危険がある。
2. エラーハンドリングとセットにする: `On Error GoTo` で囲い、異常終了時にも必ず `AlertResponse` をリセットする設計にせよ。
3. 定数を知る: `0` はダイアログを表示(デフォルト)、`1` は「OK」や「はい」を自動選択させる。
—
3. 実践コード:プロダクション環境のためのテンプレート
以下は、私が大規模な図面マイグレーションツールを組む際に必ず使用する「安全装置付き」のコードテンプレートだ。これをそのままモジュールの骨格として活用してほしい。
‘ @brief Visioバッチ処理用テンプレート
‘ @author Chief Architect
Public Sub ExecuteBatchProcess()
Dim originalResponse As Long
‘ 1. 現在のAlertResponse状態を退避
originalResponse = Application.AlertResponse
‘ 2. エラー発生時でも確実に復元するためのガード処理
On Error GoTo ErrorHandler
‘ 3. ダイアログを強制的に「OK/はい」で応答させる
‘ 0: ユーザー介入あり, 1: 全てのダイアログに「はい」で応答
Application.AlertResponse = 1
‘ — ここにメインの業務処理を記述 —
Call ProcessDiagrams
‘ ———————————-
CleanExit:
‘ 4. 処理終了後、必ず元の設定に戻す
Application.AlertResponse = originalResponse
Exit Sub
ErrorHandler:
Debug.Print “Error: ” & Err.Description
Resume CleanExit
End Sub
Private Sub ProcessDiagrams()
‘ 例:全ページを巡回し、特定の処理を行う
Dim pag As Visio.Page
For Each pag In ActiveDocument.Pages
‘ ここで重い処理や、ダイアログが出そうな処理を行う
pag.Delete ‘ 例えばページ削除等は確認ダイアログが出るが、これで無視される
Next pag
End Sub
—
4. チーフアーキテクトからの助言:さらに先へ
この手法を極めるエンジニアは、以下の点も考慮している。
- データベース連携時の注意点: 外部データベース(SQL Server等)との接続でエラーダイアログが出る場合、`AlertResponse` だけでは制御しきれないことがある。この場合、データベース側の接続タイムアウト設定や、VBA側での `On Error Resume Next` を活用した「静かなエラー処理」を併用する必要がある。
- ログ出力の徹底: ダイアログを抑制するということは、言い換えれば「ユーザーへの警告を隠蔽する」ことと同義だ。必ず `FileSystemObject` 等を用いて、処理結果をログファイルに書き出す設計を忘れてはならない。
- AlertResponseの限界: 一部の「Visioの内部エラー」は `AlertResponse` を無視して表示される。これらはコードで制御するのではなく、エラーハンドリング(`Err`オブジェクト)で捕捉し、ログに記録して処理をスキップするように設計せよ。
まとめ
`Application.AlertResponse` は、単なるプロパティではない。君が書いたコードを「単なるスクリプト」から「堅牢な業務システム」へと昇華させるためのセキュリティゲートだ。
自動化の目的は、楽をすることではなく、人間が介在しなくても「確実に、正確に」処理を完遂させることにある。このテンプレートを叩き台に、止まらない自動化システムを構築してほしい。
健闘を祈る。
