在单击事件上创建组合框时在组合框中添加项目
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
我正在尝试在组合框中添加项目。我知道如何使用 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