我的问题是关闭我的工作簿时它重新运行Workbook_BeforeClose宏。当用户单击“否”时,它会关闭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
我在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)
答案 0 :(得分:2)
Workbook_BeforeClose
子运行只是因为工作簿正在关闭。因此,无需再次放置INWBK.Close
。子结束后,工作簿窗口将关闭。
对于Wbk.Close上的错误91,错误消息为Object variable not set
。因为您按上述方式两次调用Workbook_BeforeClose
,因此Wbk.close
也会被调用两次。第一次应该是成功,但第二次,没有对象再绑定它,因此Excel哭了Error 91
。
答案 1 :(得分:0)
假设:
不需要在Workbook_BeforeClose事件处理程序中运行INWBK.Close
,因为INWBK已经在关闭过程中。在代码中运行INWBK.Close
时,您将启动另一个Workbook_BeforeClose事件,从而再次显示消息框。您可以通过在INWBK.Close
命令上设置断点然后使用F8从那里逐步执行代码来确认这一点。
我建议您从代码中删除INWBK.Close
另一种方法是,在显示消息框之前添加Application.EnableEvents = False
,然后在Application.EnableEvents = True
之前运行End Sub
,告诉Excel忽略第二次关闭事件。