Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel ActiveX文本框\u随列表框更改\u单击然后清除文本框会导致递归行为_Excel_Activex_Vba - Fatal编程技术网

Excel ActiveX文本框\u随列表框更改\u单击然后清除文本框会导致递归行为

Excel ActiveX文本框\u随列表框更改\u单击然后清除文本框会导致递归行为,excel,activex,vba,Excel,Activex,Vba,我有一个ActiveX文本框,其背后有文本框单击代码,这样我键入的每个字符都会触发另一个子项来执行,该子项随后通过更新一个命名的单元格来更新一个表,该单元格作为驱动该表的公式。然后我有一个ListBox,它将ListFillRange链接到该表。结果是,我在文本框中键入的每个字符都会导致列表框更新。这很好用 下一件我要做的事情是ListBox\u单击代码,这样当我单击ListBox中的一个项目时,它会更新一个标签。Caption然后设置ListBox.Value=。这也很有效 我现在想做的是在标

我有一个ActiveX文本框,其背后有文本框单击代码,这样我键入的每个字符都会触发另一个子项来执行,该子项随后通过更新一个命名的单元格来更新一个表,该单元格作为驱动该表的公式。然后我有一个ListBox,它将ListFillRange链接到该表。结果是,我在文本框中键入的每个字符都会导致列表框更新。这很好用

下一件我要做的事情是ListBox\u单击代码,这样当我单击ListBox中的一个项目时,它会更新一个标签。Caption然后设置ListBox.Value=。这也很有效

我现在想做的是在标签。标题被指定后清除文本框。问题是文本框清除导致列表框更新,然后标签获取错误的值。这看起来很奇怪,因为分配标题的命令发生在设置TextBox=之前,这将重置列表框。但标题分配是否首先发生似乎并不重要。ListBox似乎仍处于选中状态,因此文本框的更新会更新ListBox,以便标签获得错误的值

任何想法都非常感谢

这在工作表的模块中

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
这在工作表的模块中

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。除非您需要列标题,否则不需要使用此属性-您已经在使用代码,因此可以使用如下代码在代码中重新填充列表:

control_name.List=图纸名称。范围一些范围。值

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

如果标志_变量,则退出sub


然后,当您需要执行某些操作并且不想运行控制事件时,只需将变量设置为True,执行操作,然后将其设置为False。这有点像使用Application.EnableEvents,它不适用于ActiveX控件事件

谢谢Rory。1。您的意思是不是说不使用LIstFillRange直接填充图纸?另外,我不确定如何实现2。Application.EnableEvents=False对于单击事件不起作用。我是否会通过设置您建议的标志退出单击子项,然后测试该标志是否为真,如果为真,则执行另一个子项复制值并清除文本框?Re 1,请参阅我的编辑关于使用列表属性。Re 2,每个事件代码都需要检查该标志变量,如果该变量为真,则只需退出即可。然后,您可以通过将变量设置为True,执行您需要执行的任何操作,然后将其设置为False来防止事件触发。我想我理解2,谢谢。对于1号,你能说得更具体一点吗?我是新手,还是给我指一个推荐人?我试图创建一个原型,我可以提供给开发人员,以更清楚地显示我的想法。这一部分的目的是在用户键入一个框(如用于查找名称)时更新列表,当用户看到名称出现在列表中时,他们可以单击该框,从而触发检索地址等其他事件。看起来我无法使用ListBox2.list=Sheetsname.Rangerng.Value。你还有其他的想法吗?我一直遵循这个概念:但我并不执着于它。我很乐意使用任何工具来实现这一功能。最终,如果我有了这个想法,它将被用Java或PHP或类似的语言编码成一个网页。为什么你不能使用.List属性呢?