我有一组 ActiveX 控件和子控件,它们像这样组合在一起:
- 用户在 ActiveX 文本框中键入内容,
- TextBox_Click 触发 3 个子程序的执行。
- 第一个子更新工作表上命名范围的值;根据更新后的值,使用偏移函数在 Excel 中创建表格
- 第二个子将 3 中更新的表格范围复制并粘贴。值到工作表上的范围(以消除公式)
这就是它崩溃的地方。
- 当我设置工作表时,我创建一个列表框(ListBox1)。上面 #2 中提到的三个子程序中的第三个子程序测试工作表中是否存在 ActiveX“ListBox1”。如果不是,代码的目的是确定 ListBox 的名称(LB1 或 LB2 或 LB2 等),将名称更改为“ListBox1”,并将上面#4 中的表粘贴到 ListBox1 中。然后 ListBox1_Click 命令可以触发一组独特的代码来执行。
现在我只是测试名称 ListBox1 和 ListBox2 之间的切换。
这个想法是,例如,当用户在 TextBox1 中键入内容时,ListBox1 将在每次击键时更新。因此,输入“g”,列表会显示数据库表中以第一个“g”开头的 20 个名称。然后输入“ge”,列表显示 20 个名称,从数据库表中的第一个“ge”开始,等等。用户单击一个名称,ListBox1_click 会执行一些独特的操作。如果用户在 TextBox2 中输入,他们会在 ListBox(我想将其重命名为 ListBox2)中看到不同的数据,如果他们单击,则由 ListBox2_Click 执行一组唯一的代码。
#5 中的问题是我第一次尝试执行时收到错误“对象不支持此属性或方法”。第二次就ok了。如果我在工作表上做了其他事情并返回到它,我会再次收到错误。
这是模块中 #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 标签和文本框,因此我使用您建议的第一个表单来搜索特定名称案例。我一直在阅读有关它的内容,但看不出我在这里有什么问题。输入 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
我将专注于您的代码#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
请注意,您无需清除之前的列表。它会自动更新。
由于我不确定您想要完全实现什么,所以我就到此为止。不过。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)