Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel控件事件在应用程序关闭时触发_Excel_Vba_Activex - Fatal编程技术网

Excel控件事件在应用程序关闭时触发

Excel控件事件在应用程序关闭时触发,excel,vba,activex,Excel,Vba,Activex,我有一个Excel工作簿,在工作表上有ActiveX控件(不是在Userform上!)。当我关闭工作簿(不关闭Excel)时,一切正常,但当我完全关闭Excel时,它会触发工作表上ActiveX组合框的更改事件。这会产生错误,因为Excel似乎已经通过删除控件进行了一些清理 如何绕过或解决此问题?这些事件不应该首先触发,因为关闭时不会更改任何值 将此子模块插入模块,并使用它保存和关闭工作簿和Excel。首先禁用事件,这将防止出现问题 Sub closeNoEvents() Applicat

我有一个Excel工作簿,在工作表上有ActiveX控件(不是在Userform上!)。当我关闭工作簿(不关闭Excel)时,一切正常,但当我完全关闭Excel时,它会触发工作表上ActiveX组合框的更改事件。这会产生错误,因为Excel似乎已经通过删除控件进行了一些清理


如何绕过或解决此问题?这些事件不应该首先触发,因为关闭时不会更改任何值

将此子模块插入模块,并使用它保存和关闭工作簿和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时才操作。