Добавление элемента в выпадающий список при создании выпадающего списка по событию клика - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь добавить элементы в comboBox.Я знаю, как это сделать с myBox.AddItem "words" Однако у меня есть проблема для реализации этого в моем коде при создании события comboBox при нажатии:

Private Sub CommandButton2_Click()
    Dim editBox As MSForms.Control
    Dim testBox As ComboBox
    Static i
    Set editBox = Me.Controls.Add("Forms.ComboBox.1")
    i = i + 1
    With editBox
        .Name = "cmBox" & i
        .Top = i * editBox.Height + 10
        .Left = 130
    End With
End Sub

У вас есть какие-либо предложения?Спасибо

1 Ответ

0 голосов
/ 25 октября 2018

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