Как я могу управлять ComboBox после другого?

Код показывает три ComboBox в пользовательской форме. Combobox2 выбирает четыре значения 1, 2, 3, 4 с листа ("Данные"), а Combobox3 выбирает 6 значений (A, B, C, D, E, F) с того же листа. Что мне делать, если я хочу управлять Combobox3 после выбора значения в Combobox2, например, если я выберу 1, я хочу, чтобы только A, B, C были в Combobox3, или если я выберу 2, то только D, E будут найдены в Combobox3 Combobox3 и т. д.?

Спасибо заранее за любые предложения!

    Private Sub RapportFix_Initialize()
Dim ComboItems As Variant, i As Integer
Dim val As String

    With RapportFix.ComboBox2 'Provtyp
    .Clear ' remove existing entries from the listbox
    ComboItems = Worksheets("Indata").Range("C5:C8").Value
    ComboItems = Application.WorksheetFunction.Transpose(ComboItems)
    ' convert values to a vertical array
    For i = 1 To UBound(ComboItems)
        .AddItem ComboItems(i) ' populate the combobox
    Next i
   .ListIndex = -1 ' no items selected, set to 0 to select the first item
End With
With RapportFix.ComboBox3 'Kursplan
    .Clear ' remove existing entries from the listbox
    'Set sKursplanemoment = ComboBox3.Value
    ComboItems = Worksheets("Indata").Range("M5:M10").Value
    ComboItems = Application.WorksheetFunction.Transpose(ComboItems)
    ' convert values to a vertical array
    For i = 1 To UBound(ComboItems)
        .AddItem ComboItems(i) ' populate the combobox
    Next i
    .ListIndex = -1 ' no items selected, set to 0 to select the first item
 End With

 With RapportFix.ComboBox4 'Annat arbete
    .Clear ' remove existing entries from the listbox
    ComboItems = Worksheets("Indata").Range("E5:E8").Value
    ComboItems = Application.WorksheetFunction.Transpose(ComboItems)
    ' convert values to a vertical array
    For i = 1 To UBound(ComboItems)
        .AddItem ComboItems(i) ' populate the combobox
    Next i
    .ListIndex = -1 ' no items selected, set to 0 to select the first item
End With
RapportFix.Show
End Sub

person Stravan A    schedule 18.12.2011    source источник
comment
Эм, изменить другое поле со списком в ответ на событие изменения исходного поля со списком? Я понятия не имею, какая у тебя проблема.   -  person Cody Gray    schedule 18.12.2011
comment
Привет Коди! Да, это то, что я хочу. Таким образом, содержимое Combobox3 зависит от того, что вы выберете в Combobox2. Спасибо   -  person Stravan A    schedule 18.12.2011


Ответы (1)


Каждый элемент управления пользовательской формы имеет ряд связанных с ним событий. Событие изменения, предложенное Коди, особенно легко найти, так как все, что вам нужно сделать, это щелкнуть правой кнопкой мыши элемент управления в представлении дизайна и выбрать «Просмотр кода», после чего будет заполнена дополнительная схема.

введите здесь описание изображения

Как вы можете видеть выше, над кодовой страницей есть два раскрывающихся списка: в одном перечислены доступные элементы управления и объекты, а в другом перечислены события. Выберите элемент управления и событие, чтобы получить подсхему для этого события.

В этом конкретном случае вам нужно использовать событие изменения управляющей комбинации, чтобы сначала очистить, а затем повторно заполнить зависимую комбинацию, как вы сделали выше. Такие комбинации называются каскадными.

Private Sub ComboBox2_Change()
    ''Populate combo 3
End Sub

Единственная разница в том, что вам нужно проверить, что список содержит только те элементы, которые должны появиться для каждого значения управляющей комбинации. Я был бы склонен сделать это со списком на рабочем листе, которым я мог бы легко управлять:

Item2 Item3
1       a
1       b
2       d
2       c
3       a
3       e

Однако для вас это не представляется возможным, поэтому вы можете использовать Select Case

Private Sub ComboBox2_Change()
    Select Case ComboBox2
        Case "1", "2", "3"
            ''Add items x,y,z to combobox3
        Case "a", "b", "c"
            ''Add items m,n,o to combobox3
        Case Else
            ''Whatever
    End Select
End Sub
person Fionnuala    schedule 18.12.2011
comment
Прости Рему! Я новичок в VB, не могли бы вы объяснить, где я должен изменить свой код выше и как? Должен ли я добавить что-то в код для пользовательской формы? спасибо - person Stravan A; 19.12.2011