Я написал функцию 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()
, это займет примерно половину времени, но все равно будет медленным.