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

Mar*_*rkJ 7 excel vba

我有一个Excel工作簿,其中包含直接放在工作表上的一些ComboBox控件.这些是"表单"工具栏中的标准组合框.

当用户使用"另存为"以使用其他名称保存工作簿时,这会在所有组合框上触发Change事件,包括非活动工作表上的组件.这似乎是不合理的,因为选择并没有真正改变.由于事件处理程序中的代码,这会导致各种不良行为.该事件不是通过简单的"保存"触发的.

Google建议这是Excel中的一个已知问题.有传闻说它是由于我使用了命名范围作为组合框的ListFillRange引起的,尽管它不是一个易变的名称.我正在寻找一种方法来防止这种情况发生,只需对代码和电子表格进行最少的更改.有没有人有成熟的解决方案?

mwo*_*e02 2

您可以在工作簿的 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 事件将在组合框更改事件之前调用。我不知道事实是否如此。