将OnChange事件添加到动态创建的vba表单控件

时间:2017-06-19 10:34:35

标签: vba excel-vba dynamic combobox listbox

我在excel中有一个表单,我需要动态创建Comboboxes和Listbox。所以,这个想法是,每个列表框都链接到组合框。第一个是默认设置,用户可以按“添加”按钮,如果他需要添加另一个组合+列表框。因此,“添加”按钮的代码如下:

Private Sub AddCountry_Click()
aaa = "a"
Set comb = Controls.Add("Forms.Combobox.1", "CountryList" & Val(CountryLabel.Caption) + 1)
With comb
.Top = CountryList1.Top
.Width = CountryList1.Width
.Height = CountryList1.Height
.Left = (CountryList1.Width + 3) * Val(CountryLabel.Caption) + CountryList1.Left
.AddItem ("--Choose country--")
For i = 3 To 20
.AddItem Worksheets("Countries").Range("B" & i).Value
Next i
.Text = "--Choose country--"
End With

Set listb = Controls.Add("Forms.Listbox.1", "Countries" & Val(CountryLabel.Caption) + 1)
With listb
.Top = Countries1.Top
.Width = Countries1.Width
.Height = Countries1.Height
.Left = (Countries1.Width + 3) * Val(CountryLabel.Caption) + Countries1.Left
.ColumnCount = 2
.MultiSelect = 1
End With
CountryLabel.Caption = Val(CountryLabel.Caption) + 1
End Sub

这个想法是,Comboboxes必须有名称“CountryList”和一个存储在隐形标签中的数字(每次按下按钮时都会加上+1),因此它将是CountryList1,CountryList2等。对于列表框也一样。

所以问题是,组合框已经完成,并且正确添加了值(国家/地区名称)。但我没有得到,之后如何使用它们呢?我需要的是 - 当组合框被更改(用户选择不同的国家)时,下面的列表框必须填充某些值(每个国家/地区不同)。

我假设,问题可能在于定义组合/列表框的名称。那么是否可以添加动态名称(CountryList1,CountryList2等),然后以某种方式添加OnChange事件?提前谢谢。

1 个答案:

答案 0 :(得分:0)

这是ComboBox的一个示例。您可以根据它的列表框,因为原理完全相同。

首先创建一个名为cComboBox的类,并将此代码放在其中:

Private WithEvents p_ComboBoxEvents As MSForms.ComboBox
Private Sub p_ComboBoxEvents_Change()
    'Here you can handle the events.
End Sub
Public Property Let Box(value As MSForms.ComboBox)
    Set p_ComboBoxEvents = value
End Property
Public Property Get Box() As MSForms.ComboBox
    Set Box= p_ComboBoxEvents
End Property

接下来,在您现有的代码中,您可以添加此cComboBox,只需添加您已经添加的Combobox:

'Add the custom box!
Private customBox as cComboBox
Private Sub AddCountry_Click()
    aaa = "a"
    Set comb = Controls.Add("Forms.Combobox.1", "CountryList" & Val(CountryLabel.Caption) + 1)

    With comb
        .Top = CountryList1.Top
        .Width = CountryList1.Width
        .Height = CountryList1.Height
        .Left = (CountryList1.Width + 3) * Val(CountryLabel.Caption) + CountryList1.Left
        .AddItem ("--Choose country--")
        For i = 3 To 20
            .AddItem Worksheets("Countries").Range("B" & i).Value
        Next i
        .Text = "--Choose country--"
    End With

Set customBox = New cComboBox
customBox.Box = comb

End Sub

当然,你可能想要创建一个这样的数组,这样你就可以拥有任意数量的数组,无论它们如何被命名。但是:您会看到,如果更改添加的ComboBox值,p_ComboBoxEvents_Change将触发。