在单击事件上创建组合框时在组合框中添加项目

Adding item in combobox when combobox is created on click event

我正在尝试在组合框中添加项目。我知道如何使用 myBox.AddItem "words" 来做到这一点,但是当我在点击事件上创建组合框时,我在将其实现到我的代码时遇到了问题:

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

你有什么建议吗? 谢谢

假设在您创建控件时这些项是已知的,...您可以直接在处理程序中执行此操作。只需将 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

如果您需要处理这些动态控件的事件,则需要不同的设置,每个动态控件都有一个自定义实例 class:

'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

然后当您创建一个动态控件时,您将它添加到那个 class 的新实例而不是:

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