今回はTwitterで見かけたWorkbook_BeforeSave
の中でApplication.DisplayAlerts = False
を実行しても、保存時の確認ダイアログが消えないというVBAの質問にお答えします。
質問内容
次のようなコードを実行しても、保存時にダイアログが表示されてしまうとのことです。
どのダイアログの事か分からなかったのですが、例えば「互換性チェック」などに相当すると思います。
解決策
状況によるので、有効な対策を一つに絞れません。
VBAからWorkbook.Saveしている場合
それならWorkbook_BeforeSave
の中ではなく、Save
メソッドをApplication.DisplayAlert = False / True
ではさみましょう。
Sub ブックの保存() Application.DisplayAlerts = False ThisWorkbook.Save Application.DisplayAlerts = True End Sub
互換性チェックだけを回避したい場合
VBAを使わなくとも、互換性確認をOFFにしてしまえば二度と聞かれることはないです。
それでも、初めてバッチ処理するブックでVBAからOFFにしたいこともあるでしょう。
専用のプロパティCheckCompatibility
があります。これを該当のブックに対して行って下さい。
Sub 互換性チェックを無効化する() ActiveWorkbook.CheckCompatibility = False End Sub
ユーザーからの保存でダイアログ表示を回避したい
前述の方法で対処できない場合に、強引に行いたいということであればこのような方法があります。
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If Application.DisplayAlerts Then Cancel = True Application.EnableEvents = False Application.DisplayAlerts = False ThisWorkbook.Save Application.DisplayAlerts = True Application.EnableEvents = True End If End Sub
Workbook_BeforeSave
を呼ばれた時はCancel = True
で保存を握りつぶして、Application.DisplayAlerts
を止めてからSaveメソッド
を再コールしてやれば良いです。
Application.EnableEvents = False / True
は書かなくても良いのですが、個人的に関数を再帰的に呼ぶのが怖いので安全のため自身のSaveメソッド
によってイベントが起こらないように止めています。
保存させたくない(おまけ)
たまに保存させたくない。終了時に保存メッセージを出したくないという話を聞きます。
Cancel = True
を使いつつ、ThisWorkbook.Saved = True
にすると幸せになれると思います。
まとめ
保存時のダイアログメッセージはいくつかあると思いますが、Application.DisplayAlerts
は全てを握りつぶしてしまいます。
全てを握りつぶしてしまうとバグの発見が遅れたりするので、出来るだけピンポイントに潰すようにしましょう。
で、どんな時にダイアログメッセージが出るんだっけ・・・?
以上
何か御座いましたらコメント欄、またはTwitterからどうぞ♪
それではまた来週♪ ちゅんちゅん(・8・)