我有一组ActiveX控件和子组合在一起,如下所示:
这是它崩溃的地方。
现在我只是测试名称ListBox1和ListBox2之间的切换。
这个想法是,当用户键入TextBox1时,ListBox1会在每次击键时更新。因此,键入“g”,列表显示数据库表中第一个“g”开头的20个名称。然后键入“ge”,列表显示20个名称,从数据库表中的第一个“ge”开始等。用户单击一个名称,ListBox1_click执行一些独特的操作。如果用户在TextBox2中输入,他们会在ListBox中看到不同的数据(我想将其重命名为ListBox2),如果他们单击一组唯一的代码则由ListBox2_Click执行。
#5中的问题是我第一次尝试执行时得到错误'对象不支持此属性或方法'。第二次没问题。如果我在工作表上做了其他事情并回到它,我再次收到错误。
以下是模块中#5的代码:
Sub PutListInListBox()
Dim OBJ As Object
On Error Resume Next
Set OBJ = ActiveSheet.OLEObjects("ListBox1")
On Error GoTo 0
If OBJ Is Nothing Then
ActiveSheet.ListBox2.Name = "ListBox1"
End If
ActiveSheet.ListBox1.Clear
ActiveSheet.ListBox1.List = Sheets("Search Criteria Control").Range("G1:G21").Value
End Sub
我不知道我做错了什么,感谢任何帮助。
我希望我能说清楚。
更新代码 我有一堆ActiveX Lables和Text box,所以我使用了你建议搜索特定名称Case的第一个表单。我一直在读它,看不出我错在这里。输入TB5后,LB不会更新。我点击返回设计模式,可以看到名称仍然是ListBox2。
有什么想法吗?
Private Sub TextBox5_Change()
Call UpdateValues(TextBox5.Value)
Call CopyTable
Dim OLEOBJ As OLEObject
For Each OLEOBJ In ActiveSheet.OLEObjects
Select Case OLEOBJ.Name
Case "ListBox1", "ListBox2", "ListBox3"
OLEOBJ.Name = "ListBox1"
OLEOBJ.ListFillRange = Sheets("Search Criteria Control").Range("G1:G21").Address(external:=True)
End Select
Exit For
Next
End Sub
答案 0 :(得分:0)
我将专注于你的第5号代码。
首先,如果您要更改ListBox Object
的名称,最好迭代它所属的Object Collection
,因为您不确定它的名称。像这样:
Dim oleobj As OLEObject
Dim sh As Worksheet: Set sh = ActiveSheet
For Each oleobj In sh.OLEObjects
Select Case oleobj.Name
Case "LB1", "LB2", "ListBox1", "ListBox2" 'put the possible names here
oleobj.Name = "ListBox1" 'change it to the name you want
End Select
Exit For 'if you have more than 1 ListBox
Next
如果您只想更改现有ListBox
的名称,请跳过检查。
For Each oleobj In sh.OLEObjects
oleobj.Name = "ListBox1"
Exit For 'if you have more than 1 ListBox
Next
现在,要为其指定值或列表,您可以在更改名称后使用ListFillRange Property
直接指定源范围。
oleobj.ListFillRange = Sheets("Search Criteria Control") _
.Range("G1:G21").Address(, , , True) 'add this line within the loop
请注意,您无需清除上一个列表。它会自动更新。
由于我不确定你想要完全实现什么,我会停在这里。 HTH虽然。