【问题标题】:Conditionally populating ComboBox based on selected value from another ComboBox根据从另一个 ComboBox 中选择的值有条件地填充 ComboBox
【发布时间】:2020-10-04 07:49:06
【问题描述】:

我有一个名为 TestTable 的工作表,其中包含一个名为 TeamNameTable 的命名表,其中包含如下数据。我需要在添加/删除人员时可以编辑这些数据,以便可以轻松地对其进行编辑,而不必在 VBA 中乱七八糟。

+------------+------------+ | TeamNumber | MemberName | +------------+------------+ | Team1 | Aaron | | Team1 | Bob | | Team1 | Charles | | Team2 | Dave | | Team2 | Eddie | | Team2 | Frank | +------------+------------+

我有一个名为 UserForm1 的用户窗体,它有两个组合框(cbxTeamcbxName)。 cbxTeam 预填充了以下团队名称:Team1、Team2、Team3、Team4。

我的目标是能够从 cbxTeam 中选择四个团队之一,然后根据该值,仅使用属于 Team1 的 TestTable 中的 MemberNames 填充 cbxName,等等。我不确定是否使用字典适合于此,也不适合我在字典中使用数组。完全愿意接受有关适当集合类型的建议。

因此,在 cbxTeam 中选择 Team1 将用 Aaron、Bob、Charles 填充 cbxName。选择 Team2 会在 cbxName 中填充 Dave、Eddie、Frank...

我尝试使用字典,使用键(Team1,Team2),数组作为值(team1Array,team2Array)。

字典中的两个数组填充了以下内容,但我实际上需要动态范围,以防另一个人被添加到 Team1、Team2 等。我很难做到这一点。 cbxName is 被填充,但这只是因为我明确定义了一个静态范围。我没有利用命名表的好处。

Dim team1Array As Variant
team1Array = Range("B2:B4")

Dim team2Array As Variant
team2Array = Range("B5:B7")

整个事情都在 cbxTeam_Change() 事件上触发:

Public Sub cbxTeam_Change()

Dim team1Array As Variant
team1Array = Range("B2:B4") 'Not sure how to use the named table TeamNameTable. Needs to be dynamic

Dim team2Array As Variant
team2Array = Range("B5:B7") 'Not sure how to use the named table TeamNameTable. Needs to be dynamic

Dim teamMembership
Set teamMembership = CreateObject("Scripting.Dictionary")

teamMembership.Add "Team1", team1Array
teamMembership.Add "Team2", team2Array

If teamMembership.Exists("Team1") Then
    cbxName.List = team1Array
End If
End Sub

这是我的第一篇文章,所以希望我已经简洁地表达了我的目标并展示了我的尝试。如果我缺少任何可以帮助您的信息,请告诉我。感谢您的帮助。

【问题讨论】:

    标签: arrays excel vba dictionary userform


    【解决方案1】:

    您可以遍历 TeamNameTable 中的每一行,然后对于与从 cbxTeam 中选择的团队匹配的每个团队,将其作为键值添加到您的字典中。然后将键分配给 cbxName 的 List 属性。试试下面...

    Private Sub cbxTeam_Change()
    
        Me.cbxName.Clear
    
        If cbxTeam.ListIndex = -1 Then Exit Sub 'entry doesn't match list
    
        Dim selectedTeam As String
        selectedTeam = Me.cbxTeam.Value
    
        Dim teamMembership As Object
        Set teamMembership = CreateObject("Scripting.Dictionary")
    
        Dim i As Long
        With Range("TeamNameTable")
            For i = 1 To .Rows.Count
                If UCase(.Cells(i, 1).Value) = UCase(selectedTeam) Then
                    teamMembership(.Cells(i, 2)) = ""
                End If
            Next i
        End With
    
        If teamMembership.Count > 0 Then
            Me.cbxName.List = Application.Transpose(teamMembership.keys())
        End If
    
    End Sub
    

    注意,如果 TeamNameTable 包含标题行,则可以在循环时通过替换将其排除...

    For i = 1 To .Rows.Count
    

    For i = 2 To .Rows.Count
    

    【讨论】:

    • Domenic,太棒了。非常感谢你帮我勾选了我的目标。测试了在 TeamNameTable 中添加另一行,并在选择相应的 Team # 时在 cbxName 中填充了额外的用户。我想我了解您的解决方案中发生了什么,但必须更仔细地检查它才能彻底了解它。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    相关资源
    最近更新 更多