ОБНОВЛЕНИЕ : переписано для ясности
Немного неясно, где вы застряли, но я предлагаю переписать, который должен хорошо работать:
- Используйте словарь для хранения ActNames и используйте .items для получения их в виде массива
- Динамический поиск границ столбца B вместо выполнения всего столбца
- Использовать вариантный массив для хранения столбцов 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
В основном использование строкового массива фиксированной длины в столбце с нефиксированной длиной вызывает проблемы. Это плохо для памяти, медленно и может вызвать ошибки. Словари похожи на коллекции, за исключением того, что вы можете фильтровать уникальные записи только в том случае, если хотите (чего я не делал в этом случае) и выводить ключи или элементы в виде массива. Очень эффективный.