2012-01-19 74 views
6

我已经添加了一个列表框到一个SHEET(而不是“UserForm”) 我用鼠标做了这个。 我点击了小锤子和扳手图标。如何使用变量名称在工作表上引用控件对象?

此列表框似乎使用代码,因为这很容易引用:

ListBox1.Clear 

ListBox1.AddItem("An option") 

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

Call populate_listbox(ListBox2, designAreaArray) 

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

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

例如:

Dim controlName as string 
controlName = "ListBox1" 

不工作,即使我定义函数如下:

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 

显然它会导致不匹配的数据类型的错误。我已经尝试将“controlName”定义为列表框,但这也不起作用...

虽然也许它是我对listBox的引用是不正确的。我已经看到很多方法来引用一个控制对象...

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

该名单继续,并没有为我工作。

回答

6

试试这个:

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 
+0

谢谢。我按照justnS的回答修改了我的子集,并按照上面所述设置了我的变量(cMyListbox),并且组合起作用了。感谢关于填写清单的提示。 – Symmitchry 2012-01-19 17:06:16

+0

没有问题,很高兴它为你工作。 – Reafidy 2012-01-19 19:12:11

3

更改子签名匹配此:

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

现在你可以通过它就像你是tryi最初。

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

PS:ActiveX控件是父窗体对象的成员。所以如果你在sheet1上有listbox1,你也可以把它叫做Sheet1.ListBox1,所以如果你最终得到多个带有多个列表框的工作表,你不会感到困惑。此外,您可能想更改名称,以便让自己更轻松。

+0

感谢您的回复。我根据Reafidy的回答修改了我的变量声明,并根据你的修改了我的子版本,现在它可以工作。 – Symmitchry 2012-01-19 17:07:28

相关问题