更改Excel ActiveX ListBox的名称

时间:2015-01-26 20:47:36

标签: excel vba excel-vba listbox

我有一组ActiveX控件和子组合在一起,如下所示:

  1. 用户键入ActiveX TextBox,
  2. TextBox_Click触发执行3个潜艇。
  3. 第一个子更新工作表上命名范围的值;基于该更新值,使用偏移函数
  4. 在Excel中创建表
  5. 第二个子副本将3中更新的表格范围和paste.values复制到工作表上的范围内(以消除公式)
  6. 这是它崩溃的地方。

    1. 当我设置表单时,我创建了一个ListBox(ListBox1)。上面#2中提到的三个子中的第三个测试用于查看工作表中是否存在ActiveX“ListBox1”。如果没有,意图是代码将确定ListBox被调用的内容(LB1或LB2或LB2等),将名称更改为“ListBox1”,并将上面#4中的表粘贴到ListBox1中。然后,ListBox1_Click命令可以触发一组唯一的代码来执行。
    2. 现在我只是测试名称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
      

1 个答案:

答案 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虽然。