【问题标题】:Excel Control events trigger on application closeExcel 控件事件在应用程序关闭时触发
【发布时间】:2012-01-24 13:50:42
【问题描述】:

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

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

【问题讨论】:

  • 您的 ActiveX 中是否有任何事件会在 Excel 关闭时触发?

标签: excel vba activex


【解决方案1】:

没有看到您的 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

【讨论】:

  • 这就是我现在所做的。希望有更好的解决方案。
  • 即使这种方法对我们也不起作用,不知道为什么,尽管我会注意到在我们的案例中工作簿提示是否保存(带有“否”响应)导致在它不起作用。在我们的例子中,全局变量在工作簿关闭期间被重置回 False(通过 Excel,不知何故),之后它在 Workbook_BeforeClose 中设置为 True,导致违规事件处理程序仍然被错误地触发。为了解决这个问题,我们颠倒了逻辑,即布尔值在 _Open() 方法中设置为 True,而 _Change() 处理程序仅在值为 True 时操作。
【解决方案2】:

将此子插入模块并使用它来保存和关闭工作簿和 Excel。首先禁用事件,这应该可以防止出现问题。

Sub closeNoEvents()
   Application.EnableEvents = False
    On Error Resume Next
    ThisWorkbook.Save
    Application.Quit
    ThisWorkbook.Close
End Sub

您还可以查看“ThisWorkbook”中的代码;也许Workbook_BeforeClose 里有东西。

【讨论】:

  • Application.EnableEvents = False 不会阻止触发控制事件。
猜你喜欢
  • 1970-01-01
  • 2019-11-27
  • 2018-03-07
  • 2012-02-18
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多