Я думаю, что попытка отменить событие закрытия является неправильным подходом к тому, что вы пытаетесь сделать. Лучшим подходом было бы иметь функцию, которая only вызывается, когда рабочая книга фактически закрывается.
Спасибо за комментарии о том, что OnTime не вызывается, пока открыто диалоговое окно, поскольку оно указало мне в правильном направлении. Нам нужно проверить время между деактивацией рабочей книги и закрытием самой рабочей книги или диалогового окна сохранения. Использование функции Excel.Application.OnTime для установки этого времени закрытия означает, что это возможно, поскольку оно может быть отложено до закрытия диалога сохранения.
Когда у нас есть это время, простое сравнение со временем деактивации позволяет намчтобы решить, вызывать ли функцию выхода или нет.
Сначала я столкнулся с проблемами при повторном открытии книги, чтобы запустить процедуру .OnTime, поэтому необходимо добавить искусственную задержку в функцию деактивации, чтобы книга не "t закрыт, пока не будет установлено время закрытия. Используя код отсюда - Задержка макроса, чтобы завершить события , мы можем выполнить это.
В ThisWorkbook
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Excel.Application.OnTime EarliestTime:=Now, Procedure:="SetCloseTime"
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If Timer < CloseTime + 0.2 Then Call CloseProcedure
End Sub
Private Sub Workbook_Deactivate()
Delay (0.3)
If Timer < CloseTime + 0.4 Then Call CloseProcedure
End Sub
В модуле
Option Explicit
Public CloseTime As Single
Function SetCloseTime()
CloseTime = Timer
End Function
Function Delay(Seconds As Single)
Dim StopTime As Single: StopTime = Timer + Seconds
Do While Timer < StopTime
DoEvents
Loop
End Function
Function CloseProcedure()
MsgBox "Excel is closing"
End Function
.OnTime, кажется, работает в течение одной секунды, что определяет продолжительность задержки, а тест разницы во времени имеет небольшую задержку, добавленную с дополнительной 1/10 отвторой (который я нашел необходимым). Возможно, эти временные интервалы могут потребовать небольшой доработки, но до сих пор они работали с разными сценариями при закрытии книги.