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
真的有两个选择。
不要使用 ListFillRange。除非您需要列 headers,否则无需使用此 属性 - 您已经在使用代码,因此您可以使用如下代码重新填充代码列表:
control_name.List = Sheets("Sheet name").Range("some range").Value
使用布尔标志停止事件。作为每个事件的第一行,使用:
If flag_variable then exit sub
然后,每当您需要做某事但不想 运行 控制事件时,只需将变量设置为 True,执行您的操作,然后将其设置回 False。 (有点像使用Application.EnableEvents
,对ActiveX控件事件不起作用)
我有一个带有 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
真的有两个选择。
不要使用 ListFillRange。除非您需要列 headers,否则无需使用此 属性 - 您已经在使用代码,因此您可以使用如下代码重新填充代码列表:
control_name.List = Sheets("Sheet name").Range("some range").Value
使用布尔标志停止事件。作为每个事件的第一行,使用:
If flag_variable then exit sub
然后,每当您需要做某事但不想 运行 控制事件时,只需将变量设置为 True,执行您的操作,然后将其设置回 False。 (有点像使用Application.EnableEvents
,对ActiveX控件事件不起作用)