Excel VBA用户表单组合框实例化

Excel VBA用户表单组合框实例化,excel,combobox,userform,vba,Excel,Combobox,Userform,Vba,我有一个名为ComboTest2的用户表单问题。它只包含两个组合框。如果我将USerform实例化为一个对象,那么下面的代码在USerform的第二个组合框不包含所需数据的意义上是不起作用的 Sub FillCombo(ByVal row As Long) Dim rgCities As Range Set rgCities = Worksheets("Tabelle2").Range("B2:D2").Offset(row) ComboTest2.ComboBox2.

我有一个名为ComboTest2的用户表单问题。它只包含两个组合框。如果我将USerform实例化为一个对象,那么下面的代码在USerform的第二个组合框不包含所需数据的意义上是不起作用的

Sub FillCombo(ByVal row As Long)

    Dim rgCities As Range
    Set rgCities = Worksheets("Tabelle2").Range("B2:D2").Offset(row)
    ComboTest2.ComboBox2.Clear
    ComboTest2.ComboBox2.List = WorksheetFunction.Transpose(rgCities)
    ComboTest2.ComboBox2.ListIndex = 0

End Sub

Sub FillMain()

    Dim ComboForm2 As ComboTest2
    Set ComboForm2 = New ComboTest2
    ComboForm2.Show

End Sub
用户表单代码:

Private Sub CommandButton1_Click()
    Me.Hide

End Sub

Private Sub CommandButton2_Click()
    Me.Hide
End Sub

Private Sub ComboBox1_Change()
    FillCombo ComboBox1.ListIndex
End Sub

Private Sub UserForm_Initialize()

    ComboBox1.List = Worksheets("Tabelle2").Range("A2:A5").Value
    ComboBox1.ListIndex = 0
    FillCombo ComboBox1.ListIndex
End Sub
但是如果我使用VBA的默认实例化,这意味着我将FillMain子对象更改为:

Sub FillMain2()

    Dim ComboForm2 As ComboTest2
    Set ComboForm2 = New ComboTest2
    'ComboForm2.Show
    ComboTest2.Show

End Sub
那么一切都好了。为什么会这样


致以最诚挚的问候

这是因为FillCombo按名称引用userform,因此默认实例实际上是在创建表单的新实例。如果该代码不在userform中,并且我不确定为什么要将其放在表单之外,那么应该将combobox作为参数传递给它。

谢谢Rory,这对我很有帮助。我被告知不要将FillCombo子类的子类集成到用户表单代码中。他们说这不是一种好的编程风格。@Philipp_PK从它的编写方式来看,将它放在表单之外毫无意义,因为它是特定于该表单和组合框的。