如何使用variables名称在工作表上引用控件对象?

我已经添加一个列表框到SHEET(而不是“UserForm”),我用鼠标做了这个。 我点击了小锤子和扳手图标。

这个ListBox似乎很容易使用这样的代码引用:

ListBox1.Clear 

要么

 ListBox1.AddItem("An option") 

不过,我有三个这些ListBox(方便地命名为ListBox1,ListBox2和ListBox3),我想写一个函数来填充他们的数组数据,像这样:

 Call populate_listbox(ListBox2, designAreaArray) 

第一个参数是列表框名称,第二个是数据。

但是我不知道如何正确发送“ListBox2”,或者在函数中正确引用它。

例如:

 Dim controlName as string controlName = "ListBox1" 

不起作用,即使我定义的function如下:

 Sub populate_listbox(LB As ListBox, dataArray As Variant) Dim i As Integer: i = 0 For i = LBound(dataArray, 2) + 1 To UBound(dataArray, 2) ' Skip header row LB.AddItem (dataArray(index, i)) Next i End Sub 

很明显,这会导致错误匹配的数据types错误。 我已经尝试将“controlName”定义为一个ListBox,但是这也没有工作…

虽然也许这是我对listBox的引用是不正确的。 我见过很多方法来引用一个控制对象…

 MSForms.ListBox. ME.ListBox Forms.Controls. Worksheet.Shapes. 

名单继续,并没有任何工作对我来说。

尝试这个:

 Dim cMyListbox As MSForms.ListBox Set cMyListbox = Sheet1.ListBox1 '// OR Worksheets("YourSheetName").Listbox1 cMyListbox.AddItem("An option") 

你也可以填充一个列表框,而不必循环访问数组,试试这个:

 Dim cMyListbox As MSForms.ListBox Dim vArray As Variant Set cMyListbox = Sheet1.ListBox1 vArray = Range("A1:A6").Value cMyListbox.List = vArray 

更改子签名以匹配:

Sub populate_listbox(LB As MSForms.ListBox, dataArray As Variant)

现在,你可以像你最初想要的那样通过它。

注意 :这只适用于如果您使用列表框的“ActiveX”版本。 我假设你是因为你可以直接从模块调用ListBox1。

PS:ActiveX控件是父表单对象的成员。 所以,如果你在sheet1上有listbox1,你也可以像调用Sheet1.ListBox1一样调用它,所以如果你最终得到多个带有多个列表框的工作表,你不会感到困惑。 此外,您可能想要更改名称,以使自己更容易。