停止Sub Workbook_BeforeClose从关闭时重新运行

时间:2015-11-29 01:05:49

标签: excel vba

我的问题是关闭我的工作簿时它重新运行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)

2 个答案:

答案 0 :(得分:2)

Workbook_BeforeClose子运行只是因为工作簿正在关闭。因此,无需再次放置INWBK.Close。子结束后,工作簿窗口将关闭。

对于Wbk.Close上的错误91,错误消息为Object variable not set。因为您按上述方式两次调用Workbook_BeforeClose,因此Wbk.close也会被调用两次。第一次应该是成功,但第二次,没有对象再绑定它,因此Excel哭了Error 91

答案 1 :(得分:0)

假设:

  • INWBK是您正在关闭的工作簿(即它正在运行Workbook_BeforeClose事件),并且
  • Wbk是将“数据”复制到的辅助工作簿。

不需要在Workbook_BeforeClose事件处理程序中运行INWBK.Close,因为INWBK已经在关闭过程中。在代码中运行INWBK.Close时,您将启动另一个Workbook_BeforeClose事件,从而再次显示消息框。您可以通过在INWBK.Close命令上设置断点然后使用F8从那里逐步执行代码来确认这一点。

我建议您从代码中删除INWBK.Close

另一种方法是,在显示消息框之前添加Application.EnableEvents = False,然后在Application.EnableEvents = True之前运行End Sub,告诉Excel忽略第二次关闭事件。