我有一个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“事件”抛出到执行队列中。有用!

10-08 15:25