Как использовать ComboBox_Change () для поля со списком, созданного динамически классом - VBA - PullRequest
2 голосов
/ 10 апреля 2020

У меня есть пользовательская форма с несколькими страницами (MP1). Эта многостраничная страница состоит только из одной страницы. На этой странице у меня есть CommandButton (CB1) и TextBox (TB1), в которые я ввожу значение (например, 1), как показано ниже:

enter image description here

Вводя значение в TB1 и нажимая CB1, я создаю новый TextBox (здесь только один с именем TB21) и новую CommandButton (CB2), как показано ниже:

enter image description here

Нажав CB2, я создаю количество новых страниц в MP1, равное числу, введенному в TB1 (здесь 1), и назначаю имя, введенное в TextBox TB21, новой созданной странице. На этой новой странице я также создаю новую MultiPage (MP2) и ссылки на нее. На первой странице MP2 у меня также есть 2 ComboBox. В первом ComboBox у меня есть два варианта (скажем, A и B). Если выбран A, я отображаю список данных, связанных с A, во втором ComboBox. Та же идея, если B выбран в первом ComboBox, но во втором ComboBox отображаются разные значения.

enter image description here

В моем случае CB2 из моего MP1 использует класс для создания новой страницы в MP1 и связанного с ней MP2 со всеми необходимыми формами (здесь два комбинированных списка). Вот код из пользовательской формы:

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

Что я хочу сделать сейчас, когда я запускаю свою пользовательскую форму, это иметь ссылку между двумя комбинированными списками на моей первой странице из моего MP2, чтобы я мог отображать список объектов в ComboBox 2, связанный с выбором из ComboBox 1.

Я знаю, что могу использовать Sub ComboBox_Change () , но в моем случае два ComboBox создаются динамически используя класс, и я не знаю, как я могу повлиять на событие в моих динамически создаваемых комбинированных списках.

Вот часть кода в моем классе с именем 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

Вот что я пытаюсь сделать, но это не работает, потому что comboxbox1 & 2 создаются динамически. Если у вас есть идея, она мне очень поможет, спасибо!

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
...