Как мне обратиться к объекту управления на рабочем листе, используя имя переменной? - PullRequest
9 голосов
/ 19 января 2012

Я добавил ListBox в ЛИСТ (не в «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.

Список можно продолжать, и у меня ничего не получилось.

Ответы [ 3 ]

7 голосов
/ 19 января 2012

Попробуйте это:

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
3 голосов
/ 19 января 2012

Измените подпись, чтобы она соответствовала этому:

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

Теперь вы можете передать его, как пытались изначально.

ПРИМЕЧАНИЕ : Это работает, только если вы использовали «ActiveX» версию списка.Я предполагаю, что вы, потому что вы можете вызывать ListBox1 прямо из модуля.

PS: элементы управления ActiveX являются членами родительского объекта листа.Так что если у вас есть listbox1 на sheet1, вы также можете назвать его как Sheet1.ListBox1, чтобы вы не запутались, если у вас получится несколько листов с несколькими списками.Кроме того, вы можете изменить имя, чтобы вам было проще.

0 голосов
/ 19 августа 2018
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...