我有一个Excel工作簿,其中包含一些直接放置在图纸上的ComboBox控件。这些是“表单”工具栏中的标准组合框。
当用户使用“另存为”以其他名称保存工作簿时,这将触发所有组合框(包括未激活的工作表上的组合框)的Change事件。这似乎是不合理的,因为选择实际上并没有改变。由于事件处理程序中的代码,这会导致各种不良行为。该事件不是通过简单的“保存”触发的。
Google suggests,这是Excel中的一个已知问题。有rumours是由于使用命名范围作为组合框的ListFillRange引起的,尽管它不是易失的名称,但我已经做到了。我正在寻找一种方法,以最小的代码和电子表格更改来防止这种情况的发生。有人有经过验证的解决方案吗?
最佳答案
我在一个只有一张工作表Sheet1的新工作簿中进行了以下操作,它似乎可以在保存之前使事件可用,然后在保存之后重新启用它们。它应该通过模仿AfterSave
事件来绕过您看到的问题。这是我在Sheet1上的事件代码(也可以是OLEObject代码)
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox Target.Address & ": " & Target.Value
End Sub
这是我的ThisWorkbook代码
Option Explicit
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
' To see the change code work before disabling
' Should show a message box
Sheet1.Range("A1") = "Before After Events Off"
Application.EnableEvents = False
Application.OnTime Now, "ThisWorkbook.Workbook_AfterSave"
' This time it will not show a message box
' You will never see this one . . .
Sheet1.Range("A1") = "After After Events Off"
End Sub
Private Sub Workbook_AfterSave()
Application.EnableEvents = True
End Sub
.OnTime
方法将AfterSave“事件”抛出到执行队列中。有用!