Функция массива Excel VBA Ctrl-Shift-Enter очень медленная по сравнению с написанием функции длинного листа - PullRequest
0 голосов
/ 31 октября 2019

Я написал функцию NA_2_X(Range, Variant) для принятия массива, преобразования всех #NA в вариант и возврата нового массива:

{=NA_2_X(A1:A3000, 0)}

Это дает гораздо более медленное выполнение, чем трудоемкая записьФункция листа:

{=IF(ISNA(A1:A3000), 0, A1:A3000)}

300 вызовы NA_2_X() занимают около 10 секунд, тогда как оператор IF() почти мгновенный. В конечном счете, я хочу сделать что-то более сложное и не могу использовать оператор if().

Function NA_2_X(ByVal rng As Range, ByVal X As Variant) As Variant
    Dim NoRows As Long, NoCols As Long
    Dim r As Long, c As Long
    Dim ret() As Variant

    NoRows = rng.Rows.Count
    NoCols = rng.Columns.Count

    ReDim ret(1 To NoRows, 1 To NoCols)

    For c = 1 To NoCols
        For r = 1 To NoRows
            If Application.IsNA(rng(r, c)) Then
                ret(r, c) = X
            Else
                ret(r, c) = rng(r, c)
            End If
        Next r
    Next c

    NA_2_X = ret
    Exit Function
End Function

Сам цикл кажется довольно быстрым, это всего лишь несколько строк в центре цикла, которые кажутся такимимедленный. Если я уберу вызов IsNA(), это займет примерно половину времени, но все равно будет медленным.

1 Ответ

0 голосов
/ 31 октября 2019

В дополнение к предложению BigBen, замена «Application.IsNA (rng (r, c))» на «IsError (tmp (r, c))» сделала рутину приятной и быстрой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...