ActiveX TextBox_Change with ListBox_Click 然后清除 TextBox 导致递归行为

ActiveX TextBox_Change with ListBox_Click then clear TextBox causes recursive behavior

我有一个带有 TextBox_Click 代码的 ActiveX 文本框,这样我输入的每个字符都会触发另一个子程序执行,然后通过更新命名单元格来更新 table 作为其中的公式它驱动 table。然后我有一个 ListBox,其中 ListFillRange 链接到 table。结果是我在 TextBox 中键入的每个字符都会导致 ListBox 更新。这工作正常。

我放置的下一件事是 ListBox_Click 代码,这样当我单击 ListBox 中的项目时,它会更新 Label.Caption 然后设置 ListBox.Value=""。这也很好用。

我现在想要的是在分配 Label.Caption 后清除文本框。问题是 TextBox clear 导致 ListBox 更新,然后 Label 得到错误的值。这看起来很奇怪,因为分配标题的命令发生在设置重置列表框的 TextBox = "" 之前。但是,标题分配先发生似乎无关紧要。 ListBox 似乎仍处于选中状态,因此 TextBox 的更新更新了 ListBox,因此 Label 获得了错误的值。

非常感谢任何想法。

这在 Sheet 的模块中

Private Sub TextBox5_Change()

    Call UpdateValues(TextBox5.Value)

End Sub

这是一个通用模块

Sub UpdateValues(SearchString As String)
    Range("mySearchString").Value = SearchString
    Range("myStartPosition").Value = Range("myOverwriteProtection").Value
End Sub

这在 Sheet 的模块中

Private Sub ListBox1_Click()

    ActiveSheet.OLEObjects("Label33").Object.Caption = ActiveSheet.OLEObjects("ListBox1").Object.Value

    ActiveSheet.OLEObjects("ListBox1").Object.Value = ""

    ActiveSheet.OLEObjects("TextBox5").Object.Text = ""

End Sub

真的有两个选择。

  1. 不要使用 ListFillRange。除非您需要列 headers,否则无需使用此 属性 - 您已经在使用代码,因此您可以使用如下代码重新填充代码列表:

    control_name.List = Sheets("Sheet name").Range("some range").Value

  2. 使用布尔标志停止事件。作为每个事件的第一行,使用:

    If flag_variable then exit sub

然后,每当您需要做某事但不想 运行 控制事件时,只需将变量设置为 True,执行您的操作,然后将其设置回 False。 (有点像使用Application.EnableEvents,对ActiveX控件事件不起作用)