更改 Excel ActiveX 列表框的名称
Changing the Name of an Excel ActiveX ListBox
我有一组像这样组合在一起的 ActiveX 控件和子程序:
- 用户在 ActiveX 文本框中输入内容,
- TextBox_Click 触发执行 3 个子程序。
- 第一个子更新 sheet 上命名范围的值;基于该更新值,使用偏移函数
在 excel 中创建 table
- 第二个子复制在3和paste.values中更新的table范围到sheet上的范围(以消除公式)
这是它崩溃的地方。
- 当我设置 sheet 时,我创建了一个列表框 (ListBox1)。上面 #2 中提到的三个子程序中的第三个子程序测试 sheet 中是否存在 ActiveX 'ListBox1'。如果不是,目的是代码将确定 ListBox 的名称(LB1 或 LB2 或 LB2 等),将名称更改为 'ListBox1',并将上面 #4 中的 table 粘贴到 ListBox1 中。然后 ListBox1_Click 命令可以触发一组独特的代码来执行。
现在我正在测试名称 ListBox1 和 ListBox2 之间的切换。
例如,当用户在 TextBox1 中键入内容时,ListBox1 会在每次击键时更新。因此键入 "g",列表显示 20 个名称,这些名称从数据库 sheet 中的第一个 "g" 开始。然后键入 "ge",列表显示 20 个名称,从数据库中的第一个 "ge" 开始 sheet 等等。用户单击一个名称,然后 ListBox1_click 会执行一些独特的操作。如果用户在 TextBox2 中键入,他们会在 ListBox(我想将其重命名为 ListBox2)中看到不同的数据,如果他们单击一组独特的代码,则由 ListBox2_Click.
执行
#5 中的问题是我第一次尝试执行时收到错误“对象不支持此 属性 或方法”。第二次就ok了。如果我在 sheet 上执行其他操作并返回它,我会再次收到错误。
这是模块中#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
请注意,您无需清除之前的列表。它会自动更新。
因为我不确定你想要完全实现什么,我会在这里停下来。不过 HTH。
我有一组像这样组合在一起的 ActiveX 控件和子程序:
- 用户在 ActiveX 文本框中输入内容,
- TextBox_Click 触发执行 3 个子程序。
- 第一个子更新 sheet 上命名范围的值;基于该更新值,使用偏移函数 在 excel 中创建 table
- 第二个子复制在3和paste.values中更新的table范围到sheet上的范围(以消除公式)
这是它崩溃的地方。
- 当我设置 sheet 时,我创建了一个列表框 (ListBox1)。上面 #2 中提到的三个子程序中的第三个子程序测试 sheet 中是否存在 ActiveX 'ListBox1'。如果不是,目的是代码将确定 ListBox 的名称(LB1 或 LB2 或 LB2 等),将名称更改为 'ListBox1',并将上面 #4 中的 table 粘贴到 ListBox1 中。然后 ListBox1_Click 命令可以触发一组独特的代码来执行。
现在我正在测试名称 ListBox1 和 ListBox2 之间的切换。
例如,当用户在 TextBox1 中键入内容时,ListBox1 会在每次击键时更新。因此键入 "g",列表显示 20 个名称,这些名称从数据库 sheet 中的第一个 "g" 开始。然后键入 "ge",列表显示 20 个名称,从数据库中的第一个 "ge" 开始 sheet 等等。用户单击一个名称,然后 ListBox1_click 会执行一些独特的操作。如果用户在 TextBox2 中键入,他们会在 ListBox(我想将其重命名为 ListBox2)中看到不同的数据,如果他们单击一组独特的代码,则由 ListBox2_Click.
执行#5 中的问题是我第一次尝试执行时收到错误“对象不支持此 属性 或方法”。第二次就ok了。如果我在 sheet 上执行其他操作并返回它,我会再次收到错误。
这是模块中#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
请注意,您无需清除之前的列表。它会自动更新。
因为我不确定你想要完全实现什么,我会在这里停下来。不过 HTH。