首页 文章

更改Excel ActiveX ListBox的名称

提问于
浏览
0

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

  • 用户键入ActiveX TextBox,

  • TextBox_Click触发3个子的执行 .

  • 第一个子更新工作表上命名范围的值;基于该更新值,使用偏移函数在excel中创建表

  • 第二个子副本将3中更新的表格范围和paste.values复制到工作表上的范围内(以消除公式)

这是它崩溃的地方 .

  • 当我设置表单时,我创建了一个ListBox(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中的问题是我第一次尝试执行时得到错误'对象不支持此属性或方法' . 第二次没问题 . 如果我在工作表上做了其他事情并回到它,我再次收到错误 .

以下是模块中#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

我不知道我做错了什么,感谢任何帮助 .

我希望我明白这一点 .

UPATED CODE 我有一堆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

1 回答

  • 0

    我会专注于你的Code#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
    

    请注意,您无需清除以前的列表 . 它会自动更新 .
    因为我'm not sure what you want to achieve entirely, I'将停在这里 . 虽然HTH .

相关问题