Excel 如何在VBA类动态创建的组合框上使用ComboBox_Change()

Excel 如何在VBA类动态创建的组合框上使用ComboBox_Change(),excel,vba,class,dynamic,combobox,Excel,Vba,Class,Dynamic,Combobox,我有一个带有多页(MP1)的用户表单。此多页仅由一页组成。在此页面上,我有一个CommandButton(CB1)和一个文本框(TB1),在其中输入一个值(例如1),如下所示: 通过在TB1中输入值并单击CB1,我创建了一个新的文本框(这里只有一个名为TB21)和一个新的命令按钮(CB2),如下所示: 通过单击CB2,我在MP1上创建了与TB1(此处为1)中输入的数量相等的新页面,并将文本框TB21中输入的名称分配给创建的新页面。在这个新页面上,我还创建了一个新的多页面(MP2)和链接到它的

我有一个带有多页(MP1)的用户表单。此多页仅由一页组成。在此页面上,我有一个CommandButton(CB1)和一个文本框(TB1),在其中输入一个值(例如1),如下所示:

通过在TB1中输入值并单击CB1,我创建了一个新的文本框(这里只有一个名为TB21)和一个新的命令按钮(CB2),如下所示:

通过单击CB2,我在MP1上创建了与TB1(此处为1)中输入的数量相等的新页面,并将文本框TB21中输入的名称分配给创建的新页面。在这个新页面上,我还创建了一个新的多页面(MP2)和链接到它的页面。在MP2的第一页,我还有两个组合框。在第一个组合框中,我有两个选择(假设A和B)。如果选择A,我将在第二个组合框中显示与A相关的数据列表。如果在第一个组合框中选择了B,但在第二个组合框中显示了不同的值,则想法相同

在我的例子中,来自MP1的CB2使用一个类在MP1中创建新页面,MP2使用所有需要的表单(这里是两个组合框)链接到该页面。以下是UserForm中的代码:

Dim cmdArray() As New Classe3

Private Sub CB1_Click()

    Set CB2 = Me.MultiPage1.Pages(0).Add("Forms.CommandButton.1")

    ReDim Preserve cmdArray(1 To 1)
    Set cmdArray(1).CmdEvents = CB2 'Assign the macro the the new CommandButton
    Set cmdArray(1).frm = Me

    Set command_button = Nothing

End Sub
当我运行UserForm时,我现在想做的是在我的MP2的第一页上的两个组合框之间建立一个链接,这样我就可以在组合框2中显示与组合框1中的选择相关的对象列表

我知道我可以使用子组合框_Change(),但在我的例子中,这两个组合框是使用类动态创建的,我不知道如何影响动态创建的组合框上的事件

下面是我的类Classe3中的一部分代码:

Option Explicit
Public WithEvents CmdEvents As MSForms.CommandButton
Public frm As Object

Private Sub CmdEvents_Click()

    'Get the number entered in TB1
    TB1_value = frm.MultiPage1.Pages(0).UserForm_TB1.Value 'UserForm_TB1 is the name of the first TextBox

    'Create the new pages on MP1
    For i = 1 To TB1_value

    'Add a new page 
    Set multi_page = frm.MultiPage1.Pages.Add("page" + CStr(i), i)

        'Set the name
        With multi_page

            .Caption = frm.MultiPage1.Pages(0).Controls("UserForm_TB2" + CStr(i)).Value 'Get the name from each TextBox created dynamically

        End With

        'Add a new MultiPage on the page created   
        Set cntrl = multi_page.Controls.Add("Forms.MultiPage.1", "MP2", True)

        'Create the first combo box with two choices
        Set combobox1 = cntrl.Pages(0).Controls.Add("Forms.combobox.1", True)

        combobox1.AddItem "A" 'ListIndex = 0
        combobox1.AddItem "B" 'ListIndex = 1

        'Create the second combo box    
        Set combobox2 = cntrl.Pages(0).Controls.Add("Forms.combobox.1", True)

    Next i

End Sub
这是我试图做的,但它不起作用,因为ComboxB1和Combox2是动态创建的。如果你有任何想法,这将帮助我很多,谢谢你

Sub combobox2_Change()

    If combobox1.Text = "A" Then

        For Each listA_ID In Worksheet1.Range("listA")
            With Me.Controls("combobox2")
                .AddItem listA_ID.Value
            End With
        Next listA_ID

    ElseIf combobox1.Text = "B" Then

        For Each listB_ID In Worksheet2.Range("listB")
            With Me.Controls("combobox2")
                .AddItem listB_ID.Value
            End With
        Next listB_ID

    End If

End Sub

您是否尝试过将
与events
关键字一起使用
Dim with Events CB2 As ComboBox
我认为这将解决您的问题,但我尚未测试。您好@PortlandRunner感谢您的回复。我解决了这个问题。我必须创建一个新类(class4)并将这个类与前一个类(class3)链接起来,因此当我在运行期间与CB1交互时,class4会将更改应用到我的用户表单。当我修复所有代码时,我将重写我的帖子,以便人们可以使用它。@PortlandRunner我现在的新问题是,当我设置一个工作表来获取类中的数据时,它似乎找不到工作表。我有执行错误编号9。你有什么建议可以把工作表放到课堂上吗?我正在使用这一行
Set Worksheet1=ActiveWorkbook.Worksheets(“流体数据油”)