excel vbaselect单元格

我必须根据其他combobox中选定的值填充几个combobox。 我想要的是填写select名称的活动框。 我比较一个特定的名字是否在一行,然后使用偏移量来获取活动名称,并将其写入数组。 它不工作可能与抵消有关,或者活动单元的合并是一个问题。 这是我的代码:

Function FindingActivities(ExpName) Dim ActNames(500) As String Dim i As Integer Dim CurrContent As String For Each cell In Range("B7").EntireColumn.cells If cell.Value <> "" Then If ExpName = cell.Value Then CurrContent = Left(cell.Offset(0, -1).Value, 2) If CurrContent = "Ac" Then ActNames(i) = cell.Offset(0,-1).Value i = i + 1 End If End If End If Next cell FindingActivities = ActNames() End Function 

这是填充combobox的代码:

 Private Sub ComboBox1_Change() Dim ExpName As String ExpName = ComboBox1.Value Dim ActNames() As String ActNames = FindingActivities(ExpName) For i = 0 To UBound(ActNames) If ActNames(i) <> "" Then ComboBox3.AddItem ActNames(i) End If Next End Sub 

任何人有一个想法?

更新 :重写为清晰

有一点你不清楚,但是我提供了一个应该很好的重写:

  1. 使用字典存储ActNames并使用.items将它们作为一个数组
  2. dynamic地查找列B的边界,而不是整列
  3. 使用variant数组来存储列A和B并循环(更快)

代码如下:

 Private Sub ComboBox1_Change() Dim ExpName As String ExpName = ComboBox1.Value Dim ActNames As Variant ActNames = FindingActivities(ExpName) 'Add this so you aren't just adding results upon results ComboBox3.Clear For i = LBound(ActNames) To UBound(ActNames) ComboBox3.AddItem ActNames(i) Next End Sub 

 Function FindingActivities(ByVal ExpName As String) Dim dict As Object Set dict = CreateObject("scripting.dictionary") Dim i As Long Dim cell As Range Dim varray As Variant varray = Range("A1:B" & Range("B" & Rows.Count).End(xlUp).Row).Value For i = 1 To UBound(varray, 1) If Len(varray(i, 2)) <> 0 Then If varray(i, 2) = ExpName Then If Left$(varray(i, 1), 2) = "Ac" Then dict.Add i, varray(i, 1) End If End If End If Next FindingActivities = dict.items End Function 

基本上在固定长度的列上使用固定长度的string数组是要求麻烦的。 记忆不好,速度慢,可能会造成错误。 字典就像集合,只是你可以过滤到唯一的条目,如果你喜欢(我没有在这种情况下),并输出的键或项目作为一个数组。 非常有效。