根据从另一个组合框选择的值有条件地填充组合框

问题描述 投票:0回答:1

我有一个名为TestTable的工作表,其中包含一个名为TeamNameTable的命名表,该表包含如下数据。在添加/删除人员时,我需要此数据是可编辑的,以便可以轻松对其进行编辑,而不必在VBA中四处打扰。

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

我有一个名为UserForm1的UserForm,它具有两个ComboBox(cbxTeamcbxName)。 cbxTeam预先填充了以下团队名称:Team1,Team2,Team3,Team4。

我的目标是能够从cbxTeam中选择四个团队之一,然后根据该值,仅使用TestTable中属于Team1的MemberName填充cbxName,等等。我不确定使用Dictionary是适用于此,也不适合我在Dictionary中使用数组。完全愿意就适当的馆藏类型提出建议。

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

我已经尝试使用字典,该字典使用键(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个回答
0
投票

您可以循环浏览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

with

For i = 2 To .Rows.Count
© www.soinside.com 2019 - 2024. All rights reserved.