Пользовательская форма VBA с несколькими зависимыми списками - проблема с получением 3-го блока для чтения выбора 2-го блока (с использованием Select Case) - PullRequest
0 голосов
/ 17 мая 2018

Я написал простую версию пользовательской формы, чтобы точно определить мою проблему.

Выбор ListBox1 lstClassName определяет параметры для ListBox2 lstClassName (который работает), а выбор для ListBox2 должен определять параметры для ListBox3 lstLanguage (который не работает).

Все ответы, которые я нашел на другие подобные вопросы, затрагивают больше, чем мне нужна эта пользовательская форма. И так как я довольно плохо знаком с VBA, я был бы признателен за помощь в понимании того, что я делаю неправильно.

Я загрузил файл на Google Диск, чтобы вы могли увидеть, как эта форма предназначена для работы. Ссылка на файл Excel

Вот код:

Option Explicit
Public ClassX As Integer
Public LanguageX As Integer

Private Sub UserForm_Initialize()
    With lstClassName
        .AddItem "Cooking"
        .AddItem "Art"
        .AddItem "Music"
    End With
End Sub


Private Sub lstClassName_Click()
    ClassX = lstClassName.ListIndex
    Select Case ClassX
    Case Is = 0 'Cooking Class
        lstLanguage.Clear
        lstLanguage.AddItem "English"
        lstLanguage.AddItem "Spanish"
    Case Is = 1 'Art Class
        lstLanguage.Clear
        lstLanguage.AddItem "English"
        lstLanguage.AddItem "French"
    Case Is = 2 'Music Class
        lstLanguage.Clear
        lstLanguage.AddItem "English"
        lstLanguage.AddItem "Spanish"
        lstLanguage.AddItem "French"
    End Select
End Sub

Private Sub lstLanguage_Click()
    LanguageX = lstLanguage.ListIndex
    Select Case LanguageX
    Case (ClassX = 0 And LanguageX = 0) 'Cooking Class in English
        lstDay.Clear
        lstDay.AddItem "Monday"
        lstDay.AddItem "Wednesday"
    Case (ClassX = 0 And LanguageX = 1) 'Cooking Class in Spanish
        lstDay.Clear
        lstDay.AddItem "Monday"
        lstDay.AddItem "Thursday"
    Case (ClassX = 1 And LanguageX = 0) 'Art Class in English
        lstDay.Clear
        lstDay.AddItem "Tuesday"
        lstDay.AddItem "Friday"
    Case (ClassX = 1 And LanguageX = 1) 'Art Class in French
        lstDay.Clear
        lstDay.AddItem "Wednesday"
        lstDay.AddItem "Thursday"
    Case (ClassX = 2 And LanguageX = 0) 'Music Class in English
        lstDay.Clear
        lstDay.AddItem "Monday"
        lstDay.AddItem "Friday"
    Case (ClassX = 2 And LanguageX = 1) 'Music Class in Spanish
        lstDay.Clear
        lstDay.AddItem "Tuesday"
        lstDay.AddItem "Wednesday"
    Case (ClassX = 2 And LanguageX = 2) 'Music Class in French
        lstDay.Clear
        lstDay.AddItem "Thursday"
        lstDay.AddItem "Friday"
    End Select
End Sub

Private Sub CommandButton1_Click()
'This would then be the button to add data to a part of the spreadsheet
End Sub

Примечание: я не удосужился завершить код для CommandButton или что потом делать с данными из этой пользовательской формы.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Креативная альтернатива для lstLanguage_Click() здесь.Поскольку у вас есть только 2 переменные, вы можете преобразовать их в десятичное значение для упрощения программированияClassX будет целой частью, а LanguageX будет десятичной частью.

Private Sub lstLanguage_Click()
    Dim uCode As Double
    LanguageX = lstLanguage.ListIndex
    uCode = CDbl(ClassX) + CDbl(LanguageX) / 10
    lstDay.Clear ' This is done for any one clicked
    Select Case uCode
        Case 0# ' (ClassX = 0 And LanguageX = 0) 'Cooking Class in English
            lstDay.AddItem "Monday"
            lstDay.AddItem "Wednesday"
        Case 0.1 ' (ClassX = 0 And LanguageX = 1) 'Cooking Class in Spanish
            lstDay.AddItem "Monday"
            lstDay.AddItem "Thursday"
        Case 1#  ' (ClassX = 1 And LanguageX = 0) 'Art Class in English
            lstDay.AddItem "Tuesday"
            lstDay.AddItem "Friday"
        Case 1.1 ' (ClassX = 1 And LanguageX = 1) 'Art Class in French
            lstDay.AddItem "Wednesday"
            lstDay.AddItem "Thursday"
        Case 2#  ' (ClassX = 2 And LanguageX = 0) 'Music Class in English
            lstDay.AddItem "Monday"
            lstDay.AddItem "Friday"
        Case 2.1 ' (ClassX = 2 And LanguageX = 1) 'Music Class in Spanish
            lstDay.AddItem "Tuesday"
            lstDay.AddItem "Wednesday"
        Case 2.2 ' (ClassX = 2 And LanguageX = 2) 'Music Class in French
            lstDay.AddItem "Thursday"
            lstDay.AddItem "Friday"
    End Select
End Sub

Если вы предпочитаете придерживаться того способа, которым вы пользуетесь, исправление просто.
Изменить Select Case LanguageXдо Select Case True.

0 голосов
/ 17 мая 2018

Это как-то связано с оператором Case.Не знаю точно, что, потому что я не использую это так часто, но если у вас есть несколько условий, вы обычно лучше с If.Также рассмотрите возможность изменения событий щелчка, чтобы изменить события.Использование этого кода должно работать.

Option Explicit
Public ClassX As Integer
Public LanguageX As Integer



Private Sub UserForm_Initialize()

With lstClassName
        .AddItem "Cooking"
        .AddItem "Art"
        .AddItem "Music"
End With


End Sub


Private Sub lstClassName_Click()

ClassX = lstClassName.ListIndex

Select Case ClassX
    Case Is = 0 'Cooking Class
        lstLanguage.Clear
        lstLanguage.AddItem "English"
        lstLanguage.AddItem "Spanish"

    Case Is = 1 'Art Class
        lstLanguage.Clear
        lstLanguage.AddItem "English"
        lstLanguage.AddItem "French"

    Case Is = 2 'Music Class
        lstLanguage.Clear
        lstLanguage.AddItem "English"
        lstLanguage.AddItem "Spanish"
        lstLanguage.AddItem "French"
End Select

lstDay.Clear


End Sub

Private Sub lstLanguage_Click()

LanguageX = lstLanguage.ListIndex

If ClassX = 0 And LanguageX = 0 Then 'Cooking Class in English
        lstDay.Clear
        lstDay.AddItem "Monday"
        lstDay.AddItem "Wednesday"
    ElseIf ClassX = 0 And LanguageX = 1 Then 'Cooking Class in Spanish
        lstDay.Clear
        lstDay.AddItem "Monday"
        lstDay.AddItem "Thursday"
    ElseIf ClassX = 1 And LanguageX = 0 Then 'Art Class in English
        lstDay.Clear
        lstDay.AddItem "Tuesday"
        lstDay.AddItem "Friday"
    ElseIf ClassX = 1 And LanguageX = 1 Then 'Art Class in French
        lstDay.Clear
        lstDay.AddItem "Wednesday"
        lstDay.AddItem "Thursday"
    ElseIf ClassX = 2 And LanguageX = 0 Then 'Music Class in English
        lstDay.Clear
        lstDay.AddItem "Monday"
        lstDay.AddItem "Friday"
    ElseIf ClassX = 2 And LanguageX = 1 Then 'Music Class in Spanish
        lstDay.Clear
        lstDay.AddItem "Tuesday"
        lstDay.AddItem "Wednesday"
    ElseIf ClassX = 2 And LanguageX = 2 Then 'Music Class in French
        lstDay.Clear
        lstDay.AddItem "Thursday"
        lstDay.AddItem "Friday"
End If


End Sub



Private Sub CommandButton1_Click()

End Sub
...