Stop Sub Workbook_BeforeЗакрыть от повторного запуска при закрытии

Моя проблема заключается в том, что при закрытии моей книги она перезапускает Workbook_BeforeClose Macro. Когда пользователь нажимает «Нет», он закрывает ActiveWorkbook и другой, к которому он вводит данные. Когда рабочая книга закрывается, она повторно запускает окно сообщения. Он делает это, потому что это часть близкой последовательности. Как я могу сказать excel, чтобы запустить код и закрыть, не запуская код еще раз. Пожалуйста, дайте мне знать, могу ли я объяснить что-либо более ясно.

Private Sub Workbook_BeforeClose(Cancel As Boolean) MSG1 = MsgBox("Are you ready to email to MFG?", vbYesNo, "EMAIL MFG") If MSG1 = vbYes Then 'Attaches current worksheet to new message in Outlook If MSG1 = vbNo Then ' Enter data into separate work and close all Workbooks INWBK.Close Wbk.Close End Sub 

Я также получаю сообщение об ошибке 91 на Wbk.Close, это справочник по активации.

INWBK:

 INWBK = ThisWorkbook 

ВБК:

 Const kPath As String = "C:\" Const kFile As String = "QUOTE REQUEST LOG 2015.xlsm" Rem Set Wbk in case it's open On Error Resume Next Set Wbk = Workbooks(kFile) On Error GoTo 0 Rem Validate Wbk If Wbk Is Nothing Then Set Wbk = Workbooks.Open(kPath & kFile) 

Workbook_BeforeClose работает только потому, что рабочая книга закрывается. Следовательно, нет необходимости INWBK.Close снова. После завершения отделки окно рабочей книги будет закрыто.

Для ошибки 91 в Wbk.Close сообщение об ошибке Object variable not set . Поскольку вы вызываете Workbook_BeforeClose дважды, как описано выше, таким образом, Wbk.close также вызывается дважды. Первый раз должен быть успешным, но во второй раз больше нет привязки к объекту, и, таким образом, Excel плакал Error 91 .

Предполагая, что:

  • INWBK – это рабочая книга, которую вы закрываете (т.е. она имеет запущенное Workbook_BeforeClose) и
  • Wbk – это вторичная книга, в которой копируются данные.

Нет необходимости запускать INWBK.Close внутри обработчика Workbook_BeforeClose, поскольку INWBK уже находится в процессе закрытия. При запуске INWBK.Close в себе код, вы запускаете другое событие Workbook_BeforeClose, поэтому окно сообщения отображается снова. Вы можете подтвердить это, поставив точку прерывания на свою команду INWBK.Close затем используя F8, чтобы выполнить код.

Я рекомендую удалить INWBK.Close из вашего кода

Альтернативой было бы сказать Excel игнорировать второе событие закрытия, добавив Application.EnableEvents = False перед отображением вашего окна сообщения, а затем запустить Application.EnableEvents = True перед вашим End Sub .

Давайте будем гением компьютера.