Как я могу ссылаться на объект управления, на листе, используя имя переменной?

Я добавил ListBox к листу (а не к «UserForm»). Я сделал это с помощью мыши. Я щелкнул значок маленького молотка и гаечного ключа.

Этот ListBox, кажется, легко ссылается, используя такой код:

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, но это тоже не сработало …

Хотя, возможно, это неправильная ссылка на 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 являются членами объекта родительского листа. Поэтому, если у вас есть listbox1 на листе 1, вы также можете назвать его как Sheet1.ListBox1 чтобы не запутаться, если в итоге вы получите несколько листов с несколькими списками. Кроме того, вы можете захотеть изменить имя, чтобы оно стало проще для вас.

Давайте будем гением компьютера.