Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Stravan AОтветов: 1

Код показывает три 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
  • Эм, изменить другое поле со списком в ответ на событие изменения исходного поля со списком? Я понятия не имею, какая у тебя проблема. Cody Gray 18.12.2011
  • Привет Коди! Да, это то, что я хочу. Таким образом, содержимое Combobox3 зависит от того, что вы выберете в Combobox2. Спасибо Stravan A 18.12.2011

vbaexcel-2007

Ответы

Ответ 1 · рейтинг 1 · Fionnuala

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

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы