UDF работает медленно по сравнению со встроенными функциями - PullRequest
0 голосов
/ 13 января 2020

Я слышал о новой функции XLOOKUP в некоторых тестовых версиях Excel.

Поскольку у меня ее нет, я хотел написать собственную, очень базовую c, реализацию XLOOKUP.

Код делает то, что я хочу, но, кажется, работает немного медленно. Я специально замечаю, что когда я автоматически заполняю функцию рядом со столбцом значений, она намного медленнее, чем встроенный vlookup.

Какие оптимизации можно сделать, чтобы исправить медлительность?

Я уже добавил

Application.DisplayAlerts = False
Application.Calculation = xlCalculateManual
Application.ScreenUpdating = False

, и это не имело никакого значения (Да, я возвращаю значения в конце).

Я полагаю, что больше ничего нельзя сделать; VLOOKUP (и все встроенные функции), вероятно, скомпилирован в C ++, и поэтому он работает так быстро.

Я также переключил свой WHILE l oop на For Each, и он показался немного медленнее.

Public Function XLOOKUP(ByVal LookUpVal As Variant, ByVal SourceRange As Range, ByVal ResultRange As Range) As Variant

    Application.Volatile

    Dim SrcRange As Variant
    Dim RsltRange As Variant
    Dim IterCount As Long
    Dim ResultVal As Variant

    SrcRange = SourceRange.Value
    RsltRange = ResultRange.Value

    IterCount = 1
    If UBound(SrcRange, 1) > 1 Then
        While (Not LookUpVal = SrcRange(IterCount, 1))
            IterCount = IterCount + 1
        Wend
        If IterCount > UBound(SrcRange, 1) Then
            ResultVal = 0
        Else
            ResultVal = RsltRange(IterCount, 1)
        End If
    Else
        While (Not LookUpVal = SrcRange(1, IterCount))
            IterCount = IterCount + 1
        Wend
        If IterCount > UBound(SrcRange, 2) Then
            ResultVal = 0
        Else
            ResultVal = RsltRange(1, IterCount)
        End If
    End If

    SrcRange = Empty
    RsltRange = Empty
    XLOOKUP = ResultVal

End Function

1 Ответ

1 голос
/ 13 января 2020

Нет необходимости во всех циклах и массивах:

Public Function myXLOOKUP(ByVal LookUpVal As Variant, ByVal SourceRange As Range, ByVal ResultRange As Range) As Variant
    myXLOOKUP = ResultRange(Application.WorksheetFunction.Match(LookUpVal, SourceRange, 0))
End Function
...