停止子Workbook_Beforeclosures从closures重新运行

我的问题是closures我的工作簿时重新运行Workbook_BeforeClosemacros。 当用户点击“否”时,会closuresActiveWorkbook,另一个将数据input到ActiveWorkbook。 活动工作簿closures时重新运行消息框。 这是因为它是紧密序列的一部分。 我如何告诉excel运行代码并closures而无需再次运行代码。 请让我知道,如果我能更清楚地解释任何事情。

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 

我也得到Wbk.Close错误91,这是Activeworkbook。

INWBK:

 INWBK = ThisWorkbook 

WBK:

 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子只运行,因为工作簿正在closures。 因此没有必要把INWBK.Close再次。 子完成后,工作簿窗口将被closures。

对于Wbk.Close上的错误91,错误消息是Object variable not set 。 因为您如上所述调用Workbook_BeforeClose两次,所以Wbk.close也被调用两次。 第一次应该是成功的,但是第二次再也没有任何对象了,于是Excel喊了Error 91

假设:

  • INWBK是您正在closures的工作簿(即,它具有正在运行的Workbook_BeforeClose事件),以及
  • Wbk是将“数据”复制到的辅助工作簿。

没有必要在Workbook_BeforeClose事件处理程序中运行INWBK.Close ,因为INWBK已经处于closures过程中。 在运行INWBK.Close您的代码中,您正在开始另一个Workbook_BeforeClose事件,因此消息框被再次显示。 你可以通过在INWBK.Close命令中加一个断点来确认,然后使用F8从这里开始执行代码。

我build议从代码中删除INWBK.Close

另一种方法是通过在显示消息框之前添加Application.EnableEvents = False来指示Excel忽略第二个closures事件,然后在End Sub之前运行Application.EnableEvents = True