Предполагая, что элементы известны во время создания элементов управления, ... вы можете сделать это непосредственно в обработчике.Просто установите testBox
на editBox
ссылку:
Set testBox = editBox 'basically cast from MSForms.Control to MSForms.ComboBox
testBox.Add "test1"
testBox.Add "test2"
С другой стороны, если элементы не известны во время создания элементов управления, у вас естьпроблема:
Dim testBox As ComboBox
Объект находится в локальной области и выходит из области видимости, как только выходит обработчик щелчков.
Вам нужно удерживать его.Переместите это объявление на уровень модуля (и определите его для согласованности):
Private testBox As MSForms.ComboBox
Затем вы можете вызвать testBox.Add
.... проблема в том, что вы собираетесь добавить более одногоконтроль, поэтому вы не можете просто иметь одно поле, как это.Вместо этого укажите Collection
:
Private dynamicControls As Collection
Private Sub UserForm_Initialize()
Set dynamicControls = New Collection
End Sub
Теперь, когда вы создаете динамический элемент управления, добавьте его в коллекцию с помощью ключа:
Set editBox = Me.Controls.Add("Forms.ComboBox.1")
'...
dynamicControls.Add editBox, editBox.Name
Если вам нужно обработатьсобытия для этих динамических элементов управления, вам потребуется другая настройка, с экземпляром пользовательского класса для каждого динамического элемента управления:
'Class1
Option Explicit
Private WithEvents box As MSForms.ComboBox
Private Sub box_Change()
'...
End Sub
Public Property Get Control() As MSForms.ComboBox
Set Control = box
End Property
Public Property Set Control(ByVal value As MSForms.ComboBox)
Set box = value
End Property
Затем, когда вы создаете динамический элемент управления, вы добавляете его в новыйвместо этого экземпляр этого класса:
Set editBox = Me.Controls.Add("Forms.ComboBox.1")
'...
Dim dynamicHandler As Class1
Set dynamicHandler = New Class1 'todo rename that class
Set dynamicHandler.Control = editBox
dynamicControls.Add dynamicHandler, editBox.Name
Теперь, когда вы будете готовы добавить элементы в данный ящик, получите элемент управления из коллекции dynamicControls
:
With dynamicControls("cmBox1")
.Add "test1"
.Add "test2"
End With