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


1

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


Я думаю, що це питання більше про VBa, і не стільки Excel (незважаючи на те, що він дуже добре сформульований і зрозумілий). Питання сценаріїв тут в порядку, якщо фокус - це функціональність Excel. Таким чином, я проголосував за перенесення цього питання на Stack Overflow, оскільки, на мою думку, він більше підійде для вас, незважаючи на те, що ви заявили про те, що вони там не просять :)
Dave

Пошук в Інтернеті для Binary Search. Вам також знадобиться швидка процедура сортування. The quicksort Алгоритм працює добре, якщо вам не потрібен стабільний сорт, хоча ви також можете виконувати сортування за допомогою VBA на тимчасовому та / або прихованому аркуші.
Ron Rosenfeld

VBA не є мовою, оптимізованою для швидкості. Він компілюється під час виконання, доступ до клітин потребує часу для цього ... Ваше питання добре сформульоване, але я не думаю, що відповідь наблизить вас до рішення вашої проблеми. Опишіть свою реальну проблему з деякими зразками даних, і ми спробуємо допомогти. Ви навіть можете вирішити її з формулою масиву, не використовуючи VBA.
Máté Juhász

2
@Some_Guy Після сортування масиву в тому ж порядку сортування, що і VBA, то, як я писав, ви реалізуєте рутину бінарного пошуку VBA - багато з них задокументовані в Інтернеті. Також див Це двійковий алгоритм пошуку на SO
Ron Rosenfeld

1
Особисто я б видалив це питання і повторно запитаю його в Stack Overflow. Ви вже отримали 3 близькі голоси, і я припускаю, що всі вони голосуватимуть для міграції, насправді не близькі! Крім того, що має значення, якщо хтось залишає снобний коментар, наприклад, "зробіть це самостійно, або отримайте книгу". Ви знаєте, якщо ви зробили зусилля чи ні :)
Dave
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.