Перемещение данных в массив 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
Могут быть и другие способы, которые работают лучше, в зависимости от характера ваших данных