Excel VBA:另存为触发器在ComboBox中更改事件

我有一个Excel工作簿包含一些ComboBox控件直接放置在工作表上。 这些是“表单”工具栏中的标准combobox。

当用户使用“另存为”保存具有不同名称的工作簿时,会触发所有combobox上的更改事件,包括未激活的工作表上的更改事件。 由于select并没有真正改变,这似乎是不合理的。 由于事件处理程序中的代码,这会导致各种不良行为。 事件不会在简单的“保存”中触发。

谷歌build议这是Excel中的一个已知问题。 有传言说,这是由于使用命名范围作为ListFillRangecombobox,我已经做了,虽然它不是一个易变的名字。 我正在寻找一种方法来防止这种情况发生,只需对代码和电子表格进行微小的更改。 有没有人有一个成熟的解决scheme

我在一个新的工作簿中只用了一张工作表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“事件”引发到执行队列中。 有用!

您可以在工作簿的BeforeSave事件中设置一个标志,然后在处理每个combobox中的更改事件之前检查该标志。 似乎没有AfterSave事件,因此您需要在combobox内更改事件后清除标志。 该标志将需要比一个简单的布尔值,因为它不能被closures,直到所有combobox更改事件处理。 以下是一些示例代码:

 Public ComboBoxChangeCounter As Integer Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Const NumOfComboBoxChangeEvents As Integer = 5 ComboBoxChangeCounter = NumOfComboBoxChangeEvents End Sub Function JustSaved() As Boolean If ComboBoxChangeCounter > 0 Then ComboBoxChangeCounter = ComboBoxChangeCounter - 1 JustSaved = True End If End Function Private Sub Combo1_Change() If JustSaved Then Exit Sub 'Your existing code ' ' ... ' ' ... ' ' ... ' End Sub 

我将combobox更改事件的数量设置为常量,但是可能有一些方法可以让您以编程方式确定该数字。 此变通办法不需要向每个combobox更改事件添加代码,但它应该很容易,因为您只需复制并粘贴行If JustSaved Then Exit Sub每个事件的开始的If JustSaved Then Exit Sub

此变通办法假定Workbook BeforeSave事件将在combobox更改事件之前被调用。 我不知道事实如果是这样的话。