我有一个名为TestTable的工作表,其中包含一个名为TeamNameTable的命名表,该表包含如下数据。在添加/删除人员时,我需要此数据是可编辑的,以便可以轻松对其进行编辑,而不必在VBA中四处打扰。
+------------+------------+
| TeamNumber | MemberName |
+------------+------------+
| Team1 | Aaron |
| Team1 | Bob |
| Team1 | Charles |
| Team2 | Dave |
| Team2 | Eddie |
| Team2 | Frank |
+------------+------------+
我有一个名为UserForm1的UserForm,它具有两个ComboBox(cbxTeam和cbxName)。 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
[这是我的第一篇文章,希望我已经简要表达了我的目标,并展示了我所尝试的。如果我缺少任何可以帮助您的信息,请告诉我。感谢您的帮助。
您可以循环浏览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