更改 Excel ActiveX 列表框的名称

Changing the Name of an Excel ActiveX ListBox

我有一组像这样组合在一起的 ActiveX 控件和子程序:

  1. 用户在 ActiveX 文本框中输入内容,
  2. TextBox_Click 触发执行 3 个子程序。
  3. 第一个子更新 sheet 上命名范围的值;基于该更新值,使用偏移函数
  4. 在 excel 中创建 table
  5. 第二个子复制在3和paste.values中更新的table范围到sheet上的范围(以消除公式)

这是它崩溃的地方。

  1. 当我设置 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。