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

时间:2012-01-19 01:04:40

标签: excel vba excel-vba

我已将一个ListBox添加到SHEET(而不是“UserForm”) 我是用鼠标做的。 我点击了小锤子和扳手图标。

使用以下代码可以轻松引用此ListBox:

ListBox1.Clear

ListBox1.AddItem("An option")

但是,我有三个这样的ListBoxes(方便地命名为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,但这也不起作用......

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

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

列表继续,没有任何对我有用。

4 个答案:

答案 0 :(得分:7)

试试这个:

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

答案 1 :(得分:3)

更改子签名以匹配:

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

现在你可以像原来那样传递它。

注意:仅当您使用列表框的“ActiveX”版本时才有效。我假设你是因为你可以直接从一个模块调用ListBox1。

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

答案 2 :(得分:0)

Dim controlName As OLEObject
    Set controlName = Sheet1.OLEObjects("ListBox1")

Call populate_listbox(controlName, designAreaArray)

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

答案 3 :(得分:0)

要访问 Sheet1 上复选框 Active-X 控件的状态:

Dim checkBox1 As Object
Set checkBox1 = Sheet1.OLEObjects("CheckBox1").Object
MsgBox checkBox1.Value