UDF для комбинированного поиска по индексу с использованием instr vba excel - PullRequest
0 голосов
/ 13 сентября 2018

Я написал этот код для 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 Ответ

0 голосов
/ 13 сентября 2018

Перемещение данных в массив 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

Могут быть и другие способы, которые работают лучше, в зависимости от характера ваших данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...