Excel控件事件在应用程序关闭时触发
我有一个Excel工作簿,在工作表上有ActiveX控件(不是在Userform上!)。当我关闭工作簿(不关闭Excel)时,一切正常,但当我完全关闭Excel时,它会触发工作表上ActiveX组合框的更改事件。这会产生错误,因为Excel似乎已经通过删除控件进行了一些清理Excel控件事件在应用程序关闭时触发,excel,vba,activex,Excel,Vba,Activex,我有一个Excel工作簿,在工作表上有ActiveX控件(不是在Userform上!)。当我关闭工作簿(不关闭Excel)时,一切正常,但当我完全关闭Excel时,它会触发工作表上ActiveX组合框的更改事件。这会产生错误,因为Excel似乎已经通过删除控件进行了一些清理 如何绕过或解决此问题?这些事件不应该首先触发,因为关闭时不会更改任何值 将此子模块插入模块,并使用它保存和关闭工作簿和Excel。首先禁用事件,这将防止出现问题 Sub closeNoEvents() Applicat
如何绕过或解决此问题?这些事件不应该首先触发,因为关闭时不会更改任何值 将此子模块插入模块,并使用它保存和关闭工作簿和Excel。首先禁用事件,这将防止出现问题
Sub closeNoEvents()
Application.EnableEvents = False
On Error Resume Next
ThisWorkbook.Save
Application.Quit
ThisWorkbook.Close
End Sub
您还可以检查“ThisWorkbook”中的代码;在关闭之前,可能在
工作簿中有某些内容
将此子模块插入到模块中,并使用它保存和关闭工作簿和Excel。首先禁用事件,这将防止出现问题
Sub closeNoEvents()
Application.EnableEvents = False
On Error Resume Next
ThisWorkbook.Save
Application.Quit
ThisWorkbook.Close
End Sub
您还可以检查“ThisWorkbook”中的代码;也许在关闭前的
工作簿中有什么东西
没有看到ActiveX控件的设置,我无法告诉您为什么会触发它们的更改事件。但是,假设工作簿的BeforeClose事件在ActiveX更改事件之前触发,则可以添加全局变量来跟踪工作簿何时关闭
在代码模块中:
Public g_bClosingWorkbook As Boolean
在此工作簿中:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
g_bClosingWorkbook = True
End Sub
Private Sub Workbook_Open()
g_bClosingWorkbook = False
End Sub
然后,仅在不关闭工作簿的情况下运行更改事件
Private Sub ComboBox1_Change()
If Not g_bClosingWorkbook Then
' do stuff here
End If
End Sub
如果看不到ActiveX控件是如何设置的,我无法告诉您为什么会触发它们的更改事件。但是,假设工作簿的BeforeClose事件在ActiveX更改事件之前触发,则可以添加全局变量来跟踪工作簿何时关闭 在代码模块中:
Public g_bClosingWorkbook As Boolean
在此工作簿中:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
g_bClosingWorkbook = True
End Sub
Private Sub Workbook_Open()
g_bClosingWorkbook = False
End Sub
然后,仅在不关闭工作簿的情况下运行更改事件
Private Sub ComboBox1_Change()
If Not g_bClosingWorkbook Then
' do stuff here
End If
End Sub
ActiveX中是否有任何事件会在Excel关闭时触发?ActiveX中是否有任何事件会在Excel关闭时触发?Application.EnableEvents=False不会阻止控件事件触发。Application.EnableEvents=False不会阻止控件事件触发。我现在就是这样做的。我希望会有更好的解决方案。即使这种方法对我们也不起作用,不知道为什么,尽管我会注意到在我们的案例中,工作簿提示是否保存(带有“否”响应),这导致它不起作用。在我们的例子中,全局变量在工作簿关闭期间(不知何故由Excel)被重置回False,在工作簿中设置为True之后,BeforeClose仍然会错误地触发有问题的事件处理程序。为了解决这个问题,我们颠倒了逻辑,即布尔值在_Open()方法中设置为True,_Change()handers仅在值为True时才操作。这就是我现在所做的。我希望会有更好的解决方案。即使这种方法对我们也不起作用,不知道为什么,尽管我会注意到在我们的案例中,工作簿提示是否保存(带有“否”响应),这导致它不起作用。在我们的例子中,全局变量在工作簿关闭期间(不知何故由Excel)被重置回False,在工作簿中设置为True之后,BeforeClose仍然会错误地触发有问题的事件处理程序。为了解决这个问题,我们颠倒了逻辑,即布尔值在_Open()方法中设置为True,_Change()句柄仅在值为True时才操作。