【问题标题】:Generate options for 3rd ListBox based on 2nd ListBox selection根据第二个列表框选择为第三个列表框生成选项
【发布时间】:2023-04-06 04:01:01
【问题描述】:

我编写了一个简单版本的用户表单来查明我的问题。

ListBox1 lstClassName 的选择决定了 ListBox2 lstClassName 的选项(工作)。

ListBox2 的选择应该确定 ListBox3 的选项 lstLanguage(不起作用)。

类似问题的答案比我需要这个用户表单做的更多。

我将文件上传到 Google 云端硬盘。您可以看到该表单的工作方式。 Link To Excel File

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

注意:我没有费心完成命令按钮的代码或如何处理此用户窗体中的数据。

【问题讨论】:

    标签: vba if-statement listbox userform select-case


    【解决方案1】:

    这里是 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

    【讨论】:

    • 是的,将 Select Case LanguageX 更改为 Select Case True 解决了该问题。非常感谢!
    • 也感谢您发布的创意替代方案。作为一个初学者,我很高兴看到这样的例子。
    【解决方案2】:

    这与 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
    

    【讨论】:

    • 是的,这行得通!非常感谢。我会记住 If 语句作为一个选项。
    【解决方案3】:

    您可以使用 Dictionary 对象提供更快的解决方案。 您可以使用 Dictionary 对象提供更快的解决方案。 首先,为列创建动态字段名称。用户窗体中添加了 3 个列表框,为依赖列表框添加了代码。

    源代码和示例工作簿here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-21
      • 2014-09-22
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2015-10-15
      相关资源
      最近更新 更多