えくせるちゅんちゅん

ことりがエクセルをちゅんちゅんするブログ

ExcelVBAでBeforeSaveでApplication.DisplayAlertsが働かない

今回は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・)

プライバシーポリシー