2015-03-23 2 views
0

Я пытаюсь настроить 3 ComboBoxes в пользовательской форме.Excel VBA UserForm Dependent ComboBox для нескольких опций

  1. ComboBox1 = Да/Нет/Blank
  2. ComboBox2 = Перечень параметров

    • ОПЦИЯ1
    • Option2
    • Вариант3
    • ОПЦИЯ4
    • Option5
    • Opt ion6
    • Option7
    • Option8
  3. ComboBox3 = где у меня вопрос, и мне нужна помощь.

ComboBox3 зависит от комбинации ComboBox1 и ComboBox2

Я надеюсь, что я могу объяснить это хорошо.

Например.

Если ComboBox1 = "" Тогда не отображаются какие-либо параметры в ComboBox2 и Combobox3

Если ComboBox1 = Да и ComboBox2 = Option1 Тогда дайте мне этот список опций

Если ComboBox1 = нет и ComboBox2 = Option1 Тогда Дайте мне этот другой список вариантов.

Если ComboBox1 = Да и ComboBox2 = Option2 Тогда дайте мне этот список опций

Если ComboBox1 = нет и ComboBox2 = Option2 Тогда дайте мне этот другой список опций.

И так далее для каждого варианта.

Надеюсь, что это имеет смысл, и кто-то может пролить свет на это.

Дайте мне знать, если вам нужна дополнительная информация.

Спасибо.

UPDATE

После исследования я наткнулся на скрипт, который делает работу, но у меня возникают вопросы, реализующие его на мой текущий код. Я тестировал его в отдельной форме, и все работает по назначению. Как я могу интегрировать это в свой текущий UserForm_Initialize()?

Я разместил эту часть в начале формы перед пользовательским символом UserForm_Initialize(). (Я также пытался добавить его после)

Private dic As Object 

Private Sub ComboBox1_Change() 
    With Me 
     .ComboBox2.Clear 
     .ComboBox3.Clear 
     If .ComboBox1.ListIndex <> -1 Then 
      .ComboBox2.List = dic(.ComboBox1.Value).keys 
     End If 
    End With 
End Sub 

Private Sub ComboBox2_Change() 
    With Me 
     .ComboBox3.Clear 
     If .ComboBox2.ListIndex <> -1 Then 
      .ComboBox3.List = dic(.ComboBox1.Value)(.ComboBox2.Value).keys 
     End If 
    End With 
End Sub 

Это вторая часть, которая идет в UserForm_Initialize() к югу, и я получаю сообщение об ошибке «Run-Time Error 9. Подстрочных вне диапазона».Рабочий лист «Списки» существует и содержит всю необходимую информацию. Если я попробую это отдельно в другой форме, это сработает.

Private Sub UserForm_Initialize() 
    Dim a, i As Long 
    Set dic = CreateObject("Scripting.Dictionary") 
    dic.CompareMode = 1 
    a = Sheets("Lists").Cells(1).CurrentRegion.Value 
    For i = 2 To UBound(a, 1) 
     If Not dic.exists(a(i, 2)) Then 
      Set dic(a(i, 2)) = CreateObject("Scripting.Dictionary") 
     End If 
     If Not dic(a(i, 2)).exists(a(i, 1)) Then 
      Set dic(a(i, 2))(a(i, 1)) = CreateObject("Scripting.Dictionary") 
     End If 
     dic(a(i, 2))(a(i, 1))(a(i, 3)) = i 
    Next 
    Me.ComboBox1.List = dic.keys 
End Sub 

Это то, что изначально выглядит UserForm_Initialize() без этого кода. Это для меня загрузить некоторые другие comboboxes.

Private Sub UserForm_Initialize() 

    Dim rngResponse As Range 
    Dim ws As Worksheet 

    Set ws = Worksheets("Lists") 

    For Each rngResponse In ws.Range("Response") 

    Me.cbRes1.AddItem rngResponse.Value 
    Me.cbRes2.AddItem rngResponse.Value 
    Me.cbRes3.AddItem rngResponse.Value 
    Me.cbRes4.AddItem rngResponse.Value 
    Me.cbRes5.AddItem rngResponse.Value 
    Me.cbRes1.AddItem rngResponse.Value 

    Next rngResponse 

    End Sub 
+1

Используйте событие 'ComboBox_Change' в пользовательской форме, чтобы запрограммировать это. Сначала сделайте это для ComboBox1, чтобы, если он пуст, удалите остальные два и очистите список ComboBox 3. Затем измените событие на ComboBox2, чтобы настроить параметры ComboBox3 на основе того, что было выбрано в ComboBoxes 1 и 2. Если вы столкнулись с определенными проблемами, обновите свой вопрос с помощью кода, с которым вы столкнулись, и где у вас проблемы. – tigeravatar

+0

Спасибо tigeravatar. Я сделал все, что мог, и у меня нет идей, и я опубликовал обновление о том, что я сделал до сих пор. – BlueSun3k1

+0

В вашем описании и в опубликованном примере скрипта он говорит только о 3 комбобоксах. Однако в вашем исходном коде UserForm_Initialize он отображает пять списков со списком. Мы работаем с тремя или пятью списками? – tigeravatar

ответ

0

Что делает этот сценарий, он собирается на листе «Списки» и смотрит на таблицу информации. Колонка A бы значение ComboBox1, Колонка B будет значением combobox2, а в колонке C бы полученные значения для combobox3, например так:

_______A_______ _______B_______ _______C______ 
ComboBox1 Value ComboBox2 Value ComboBox3 List 
Yes    1     Y1a 
Yes    1     Y1b 
Yes    1     Y1c 
Yes    2     Y2a 
Yes    2     Y2b 
Yes    2     Y2c 
Yes    3     Y3a 
Yes    3     Y3b 
Yes    3     Y3c 
No     1     N1a 
No     1     N1b 
No     1     N1c 
No     2     N2a 
No     2     N2b 
No     2     N2c 
No     3     N3a 
No     3     N3b 
No     3     N3c 

Затем он компилирует объект словаря, используя уникальные комбинации из колонн Значение A B (так вещи, как Dictionary("Yes")(1) и Dictionary("No")(3) и сохраняют значения для списка ComboBox3 как ключи к соответствующему уникальному набору столбцы A и B.

Лично я считаю, что это очень умным решением и будет соответствовать вашим потребностям, хотя он довольно продвинутый. Чтобы заставить код работать, вам нужно установить ссылку в редакторе Visual Basic на Microsoft Scripting Runtime: Tools -> References -> Scroll пока вы не увидите «Время выполнения сценариев Microsoft» и установите флажок -> Нажмите OK

Вам также необходимо убедиться, что данные в листе «Списки» отформатированы, как показано на рисунке, строка 1 является строкой заголовка и значения и соответствующие значения параметров списка ComboBox3, как показано в моем примере (конечно, замените их фактическими значениями списка).

 Смежные вопросы

  • Нет связанных вопросов^_^