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