Эквивалент vlookup на основе FAST VBA

Эквивалент vlookup на основе FAST VBA

Пытаясь скопировать функцию vlookup в VBA, лучшее, что я смог придумать, это:

Function VBALOOKUP(LUcell As Variant, LUArray As Range, LUColi As Long, OutColi As Long) As Variant
    Dim Y() As Variant
    Dim X As Long
    'cycle through each cell in range and check if = to lookup cell then return value with same index in outcol
    Y = LUArray
    For X = LBound(Y) To UBound(Y)
        If LUcell = Y(X, LUColi) Then
            VBALOOKUP = Y(X, OutColi)
            Exit For
        End If
    Next X
    Erase Y
    End Function

Это работает, но невероятно медленно (примерно в 100 раз медленнее, чем функция рабочего листа).

Кажется, что, возможно, способ ускорить это — отсортировать массив поиска по алфавиту и каким-то образом перейти к более поздней точке в списке? У меня нет опыта в этом, но похоже, что просмотр каждой отдельной ячейки, чтобы проверить, равна ли она значению поиска, прежде чем переходить к следующей ячейке, просто не может быть самым эффективным способом сделать это, и не может быть тем, как работает фактическая функция vlookup.

Если вы задаетесь вопросом "почему бы просто не использовать vlookup", я пишу скрипт на VBA, который в какой-то момент выполняет что-то похожее на vlookup (хотя конкретная ситуация немного сложнее и возвращает несколько значений, а не только 1). Вместо того, чтобы просить stackexchange написать весь мой код за меня, я подумал, что лучше докопаюсь до сути проблемы. Плюс, я считаю, что этот вопрос будет полезен для будущего использования гораздо большим количеством людей, чем вопрос о моей конкретной задаче.

Связанный контент