UDF для комбинированного поиска по индексу с использованием instr vba excel
Я написал этот код для UDF, но он занимает много времени, чтобы вычислить, когда я использую его во многих ячейках. Есть ли более эффективный способ?
Public Function AGSIndexMatch(result_column As Range, lookup As Range, _
lookup_column As Range) As Variant
Dim cel As Range
Dim b As String
Dim i As Variant
i = 1
For Each cel In lookup_column
On Error GoTo error_handler:
If Not IsEmpty(cel) Then
If InStr(1, cel.Value, lookup) <> 0 Then
AGSIndexMatch = AGSIndexMatch & Application _
.WorksheetFunction.Index(result_column, i, 1) & Chr(10)
End If
End If
i = i + 1
Next cel
If Len(AGSIndexMatch) <> 0 Then
AGSIndexMatch = Left(AGSIndexMatch, Len(AGSIndexMatch) - 1)
End If
Exit Function
error_handler:
AGSIndexMatch = Err.Description
End Function
1 ответ
Перемещение данных в массив Variant перед выполнением цикла значительно улучшит время - насколько это зависит от размера диапазонов.
Public Function AGSIndexMatch( _
result_column As Range, _
lookup As Range, _
lookup_column As Range) As Variant
Dim rsc As Variant, src As Variant, lup As Variant
rsc = result_column.Value2
src = lookup_column.Value2
lup = lookup.Value2
Dim i As Long
Dim res As String
On Error GoTo error_handler:
For i = 1 To UBound(src, 1)
If src(i, 1) = lup Then
res = res & Chr(10) & rsc(i, 1)
End If
Next
AGSIndexMatch = Mid$(res, 2)
Exit Function
error_handler:
AGSIndexMatch = Err.Description
End Function
Там могут быть другие способы, которые работают лучше, в зависимости от характера ваших данных