停止子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
。