根据从另一个 ComboBox 中选择的值有条件地填充 ComboBox
Conditionally populating ComboBox based on selected value from another ComboBox
我有一个名为 TestTable 的 Sheet,其中包含一个名为 TeamNameTable 的命名 table,其中包含如下数据以下。我需要这些数据是 editable,因为人们是 added/removed,所以它可以很容易地编辑,而不必在 VBA.
中乱七八糟
+------------+------------+ | TeamNumber | MemberName | +------------+------------+ | Team1 | Aaron | | Team1 | Bob | | Team1 | Charles | | Team2 | Dave | | Team2 | Eddie | | Team2 | Frank | +------------+------------+
我有一个名为 UserForm1 的用户窗体,它有两个组合框(cbxTeam 和 cbxName) . cbxTeam 预先填充了这些团队名称:Team1、Team2、Team3、Team4。
我的目标是能够 select 来自 cbxTeam 的四个团队之一,然后根据该值,仅使用 TestTable 中属于 Team1 的 MemberNames 填充 cbxName,等等。我是不确定使用字典是否适合这个,也不确定我在字典中使用数组。完全愿意接受有关适当集合类型的建议。
因此,select在 cbxTeam 中加入 Team1 会用 Aaron、Bob、Charles 填充 cbxName。选择 Team2 将使用 Dave、Eddie、Frank 填充 cbxName...
我试过使用键(Team1、Team2)和数组作为值(team1Array、team2Array)的字典。
字典中的两个数组填充了以下内容,但我实际上需要范围是动态的,以防另一个人被添加到 Team1、Team2 等。我不知道如何做到这一点。 cbxName is 正在填充,但这只是因为我明确定义了一个静态范围。我没有利用命名 table.
的好处
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
这是我的第一个 post 所以希望我已经简洁地表达了我的目标并展示了我的尝试。如果我遗漏了任何可以帮助您的信息,请告诉我。感谢您的帮助。
您可以遍历 TeamNameTable 中的每一行,然后对于与从 cbxTeam 中选择的团队匹配的每个团队,将其作为键值添加到您的字典中。然后将密钥分配给 cbxName 的列表 属性。尝试以下...
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 包含 header 行,您可以在循环时通过替换将其排除...
For i = 1 To .Rows.Count
与
For i = 2 To .Rows.Count
我有一个名为 TestTable 的 Sheet,其中包含一个名为 TeamNameTable 的命名 table,其中包含如下数据以下。我需要这些数据是 editable,因为人们是 added/removed,所以它可以很容易地编辑,而不必在 VBA.
中乱七八糟+------------+------------+ | TeamNumber | MemberName | +------------+------------+ | Team1 | Aaron | | Team1 | Bob | | Team1 | Charles | | Team2 | Dave | | Team2 | Eddie | | Team2 | Frank | +------------+------------+
我有一个名为 UserForm1 的用户窗体,它有两个组合框(cbxTeam 和 cbxName) . cbxTeam 预先填充了这些团队名称:Team1、Team2、Team3、Team4。
我的目标是能够 select 来自 cbxTeam 的四个团队之一,然后根据该值,仅使用 TestTable 中属于 Team1 的 MemberNames 填充 cbxName,等等。我是不确定使用字典是否适合这个,也不确定我在字典中使用数组。完全愿意接受有关适当集合类型的建议。
因此,select在 cbxTeam 中加入 Team1 会用 Aaron、Bob、Charles 填充 cbxName。选择 Team2 将使用 Dave、Eddie、Frank 填充 cbxName...
我试过使用键(Team1、Team2)和数组作为值(team1Array、team2Array)的字典。
字典中的两个数组填充了以下内容,但我实际上需要范围是动态的,以防另一个人被添加到 Team1、Team2 等。我不知道如何做到这一点。 cbxName is 正在填充,但这只是因为我明确定义了一个静态范围。我没有利用命名 table.
的好处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
这是我的第一个 post 所以希望我已经简洁地表达了我的目标并展示了我的尝试。如果我遗漏了任何可以帮助您的信息,请告诉我。感谢您的帮助。
您可以遍历 TeamNameTable 中的每一行,然后对于与从 cbxTeam 中选择的团队匹配的每个团队,将其作为键值添加到您的字典中。然后将密钥分配给 cbxName 的列表 属性。尝试以下...
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 包含 header 行,您可以在循环时通过替换将其排除...
For i = 1 To .Rows.Count
与
For i = 2 To .Rows.Count