こんにちは! Visio VBAの世界へようこそ。
マクロの記録ボタンを押して図形を動かすだけのステージから、「自分の手で完全自動化のシステムを作り上げたい」と願うあなたへ。ここをクリアすれば、Visio VBAの基本はバッチリですよ。
今回は、業務自動化の現場で必ずといっていいほど直面する「ダイアログの壁」を華麗に突破する、`Application.AlertResponse` という極上のテクニックについて解説します。
—
なぜ、あなたのマクロは夜間のバッチ処理で止まってしまうのか?
夜間、誰もいないオフィスのサーバーで、大量の図面ファイルを一括処理するVBAを走らせたとします。
「よし、これで明日には全図面の更新が終わっているはずだ!」と期待して出社してみると……画面にはこんな冷酷なメッセージボックスが。
> 「ファイルが既に存在します。上書きしますか? [はい] [いいえ]」
人間の手であれば「はい」をクリックして一件落着ですが、無人のPCの前でVBAは完全にフリーズ状態。これが、業務自動化(RPAやバッチ処理)における最大の悪夢、「ダイアログによる処理の停止」です。
Visioは非常に親切なアプリケーションなので、危険な操作や上書き保存、古い形式のコンバートなどの際、ユーザーに確認を求めようとダイアログを出します。しかし、完全自動化を目指す私たちにとって、この「親切心」は最大の邪魔者なのです。
ここで登場するのが、今回マスターする `Application.AlertResponse` です。
—
`Application.AlertResponse` とは何か?
`Application.AlertResponse` は、Visioがプログラム実行中にダイアログボックスを表示しようとした際、「ユーザーの代わりに自動でどのボタンを押すか」をあらかじめ予約しておくプロパティです。
言葉で説明するよりも、コードを見たほうが早いですね。まずは基本の構文を見てみましょう。
基本的な書き方
‘ ダイアログが出たときに「OK」または「はい (ID: 1)」を自動選択させる
Application.AlertResponse = 1
‘ ここでダイアログが出るような処理を実行
ActiveDocument.SaveAs “C:\Work\ExistingFile.vsd”
‘ 処理が終わったら、必ずデフォルト(0=自動応答なし)に戻す!
Application.AlertResponse = 0
たったこれだけです。この魔法のプロパティを設定しておくだけで、Visioはダイアログを出した瞬間、あたかもユーザーが「はい」を押したかのように高速で処理を続行します。
—
【実践】ファイル一括変換スクリプトで学ぶ活用術
それでは、実際の開発現場で使える実践的なコードを見てみましょう。
古いバージョンのVisio図面( `.vsd` )を一括して、最新の `.vsdx` に変換するバッチ処理のサンプルです。上書き保存時に発生する警告を `AlertResponse` で完全にねじ伏せます。
Sub ConvertOldVisioFiles()
Dim targetFolder As String
Dim fileName As String
Dim visApp As Visio.Application
Set visApp = Visio.Application
targetFolder = “C:\VisioData\OldFiles\”
‘ 【重要】エラーハンドリングの準備
On Error GoTo ErrorHandler
‘ 1. ダイアログの自動応答を有効化
‘ 1 は 「IDOK」または「IDYES」を意味します(上書き確認などに対応)
visApp.AlertResponse = 1
‘ 2. 画面描画を停止してパフォーマンスを極限まで引き上げる
visApp.ScreenUpdating = False
visApp.ShowWindows = False
fileName = Dir(targetFolder & “.vsd”)
Do While fileName <> “”
‘ ファイルを開く
Dim doc As Visio.Document
Set doc = visApp.Documents.Open(targetFolder & fileName)
‘ 新形式(.vsdx)で保存(同名ファイルが存在する場合、ここで上書き確認ダイアログが出るが自動応答される)
Dim newName As String
newName = Replace(targetFolder & fileName, “.vsd”, “.vsdx”)
doc.SaveAs newName
doc.Close
fileName = Dir()
Loop
CleanUp:
‘ 3. 【必須】設定を必ず元の状態に戻す
visApp.AlertResponse = 0
visApp.ScreenUpdating = True
visApp.ShowWindows = True
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
Resume CleanUp
End Sub
コードのポイント解説
1. `visApp.AlertResponse = 1` の指定
ダイアログの「はい」や「OK」に相当する応答番号 `1` をセットしています。これにより、同名ファイルの上書き確認画面でマクロが立ち往生するのを防ぎます。
2. 処理が終わったら必ず `0` に戻す(非常に重要!)
`AlertResponse` を設定したままにしておくと、後続の通常操作(ユーザーが手動で使っている時)まで勝手にダイアログがスルーされるという恐ろしいバグを引き起こします。必ず `CleanUp` ラベルなどで `0` にリセットする癖をつけてください。
3. `ScreenUpdating = False` との組み合わせ
バックグラウンド処理では画面描画を止めると劇的に速度が上がります。プロ仕様のコードの鉄則です。
—
陥りやすい罠とエンジニアの心得
ここで、初心者が絶対にハマる「落とし穴」をいくつか共有しておきます。知っているだけで、デバッグにかける時間が何時間も浮きますよ。
罠その1:返却値(ID)の番号を間違える
`AlertResponse` に設定する数値は、WindowsのメッセージボックスのボタンIDに対応しています。
- `1` : `IDOK` または `IDYES` (はい、OK)
- `2` : `IDCANCEL` (キャンセル、いいえ)
ダイアログの種類によって、Visioがどちらを期待しているか慎重に見極める必要があります。基本的には「上書きしますか?」に対しては `1`(はい)を指定します。
罠その2:エラー時に `AlertResponse` が戻らない
先ほどのサンプルコードのように、`On Error GoTo` を使って、エラーが発生した場合でも必ず `AlertResponse = 0` が実行される仕組み(クリーンアップ処理)を絶対に組み込んでください。これをサボると、Visioのインスタンスが不安定になり、最悪の場合ExcelやWordも含めたOffice全体に悪影響を及ぼします。
—
おわりに
今回は、`Application.AlertResponse` を使ったダイアログの抑制と自動応答について解説しました。
「マクロを走らせたまま安心してコーヒーを飲みに行ける」
プロの自動化エンジニアにとって、この安心感は何物にも代えがたいものです。
マクロの記録から一歩進んだあなたなら、この機能の強力さと、それを扱うための「責任(確実なリセット処理)」の重要性が痛いほど分かったはずです。ぜひ、あなたの日常業務を効率化するバッチ処理に組み込んでみてくださいね。
それでは、次回の高度なVisio VBAでお会いしましょう!
