Намагаючись скопіювати функцію 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
Вона працює, але неймовірно повільно (приблизно 100x повільніше, ніж функція аркуша).
Здається, можливо, спосіб його прискорити було б сортування пошуку масиву в алфавітному порядку і якось перейти до більш пізньої точки в списку? У мене немає досвіду, але, схоже, дивлячись на кожну окрему клітинку, щоб перевірити, чи вона дорівнює значенню пошуку, перед тим, як перейти до наступної комірки, це не може бути найефективнішим способом зробити це, і не може бути як працює фактична функція vlookup.
Якщо вам цікаво "чому б не просто скористатися vlookup", я пишу скрипт у VBA, який в одній точці виконує щось подібне до vlookup (хоча конкретна ситуація трохи складніше і повертає кілька значень не тільки 1) . Замість того, щоб запитувати stackexchange писати весь мій код для мене, я думав, що я дістаюсь до серця питання. Плюс, я вважаю, що це питання буде корисним для подальшого використання для багатьох людей, ніж один з моїх конкретних завдань.
Binary Search
. Вам також знадобиться швидка процедура сортування. The quicksort
Алгоритм працює добре, якщо вам не потрібен стабільний сорт, хоча ви також можете виконувати сортування за допомогою VBA на тимчасовому та / або прихованому аркуші.