2015-09-02 3 views
1

Пользовательские функции, написанные в Excel VBA, работают намного медленнее, чем функции, просто написанные на ячейках листа. Есть ли способ запустить их быстрее? В качестве примера у меня есть очень простой и определенные пользователем функции:Ускорьте простые пользовательские функции

Function myweekday(mydate As Double) 
    myweekday = Weekday(mydate) 
End Function 

В основном это делает то же самое, что встроенная функция = будний день(). Однако выполнение этого на 50 000 ячеек занимает около 5 секунд для вычисления, тогда как простое использование встроенной функции занимает долю секунды.

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

+1

Почему бы вам создать пользовательскую функцию, которая предлагает меньше функциональных возможностей, чем любой из рабочего листа [функции WEEKDAY] (https://support.office.com/en-us/article/Weekday-Function- 05D360D7-2C3F-4691-9448-C96EA0351940) или VBA [функция дня недели] (https://msdn.microsoft.com/en-us/library/82yfs2zh%28v=vs.90%29.aspx)? – Jeeped

+1

@ Jeeped Мое единственное предположение, что Алекс в конечном итоге хочет сделать UDF более сложным, но видит, возможно ли даже получить скорость UDF, где они хотят, чтобы это было на чем-то очень базовом. – rwilson

+1

@ Jeeped Да, rwilson находится прямо на отметке. Разумеется, UDF бессмысленна, но я хочу видеть, может ли что-то даже такое простое, что можно работать на приличной скорости. –

ответ

4

Вместо этого вы можете передавать значения в виде диапазона и возвращать сразу все значения в массиве. Я просто попробовал это на 50 000 строк, и он мгновенно вернул все значения. Вам нужно будет ввести UDF с помощью CTRL + SHIFT + ENTER.

Function myweekday(mydate As Range) As Variant 

Dim vMydate As Variant 
Dim vMyWeekDay As Variant 
Dim i As Long 

vMydate = mydate.Value2 
ReDim vMyWeekDay(1 To UBound(vMydate), 1 To 1) 

    For i = 1 To UBound(vMydate) 
     vMyWeekDay(i, 1) = Weekday(vMydate(i, 1)) 
    Next i 

myweekday = vMyWeekDay 

End Function 

enter image description here

+0

Отлично. Хорошая работа. –

Смежные вопросы