我有一个Excel工作簿,其中包含直接放在工作表上的一些ComboBox控件.这些是"表单"工具栏中的标准组合框.
当用户使用"另存为"以使用其他名称保存工作簿时,这会在所有组合框上触发Change事件,包括非活动工作表上的组件.这似乎是不合理的,因为选择并没有真正改变.由于事件处理程序中的代码,这会导致各种不良行为.该事件不是通过简单的"保存"触发的.
Google建议这是Excel中的一个已知问题.有传闻说它是由于我使用了命名范围作为组合框的ListFillRange引起的,尽管它不是一个易变的名称.我正在寻找一种方法来防止这种情况发生,只需对代码和电子表格进行最少的更改.有没有人有成熟的解决方案?
您可以在工作簿的 BeforeSave 事件中设置一个标志,然后在处理每个组合框中的更改事件之前检查该标志。似乎没有 AfterSave 事件,因此您需要在组合框更改事件中检查该标志后清除该标志。该标志需要不仅仅是一个简单的布尔值,因为在处理所有组合框更改事件之前无法关闭它。这是一些示例代码:
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
Run Code Online (Sandbox Code Playgroud)
我将组合框更改事件的数量设置为常量,但您可能有某种方法可以通过编程确定该数量。此解决方法确实需要向每个组合框更改事件添加代码,但它应该很容易,因为您需要做的就是复制并粘贴If JustSaved Then Exit Sub每个事件开头的行。
此解决方法假设 Workbook BeforeSave 事件将在组合框更改事件之前调用。我不知道事实是否如此。