Vba 加速简单的用户定义函数

Vba 加速简单的用户定义函数,vba,optimization,user-defined-functions,Vba,Optimization,User Defined Functions,在Excel VBA中编写的用户定义函数的运行速度似乎比在工作表单元格中简单编写的函数慢得多。有没有办法让他们跑得更快?例如,我有一个非常简单的用户定义函数: Function myweekday(mydate As Double) myweekday = Weekday(mydate) End Function 基本上,它与内置的=weekday()函数的作用相同。然而,在50000个单元格上运行此函数需要大约5秒的时间来计算,而简单地使用内置函数只需要几分之一秒 如何才能让这样的用

在Excel VBA中编写的用户定义函数的运行速度似乎比在工作表单元格中简单编写的函数慢得多。有没有办法让他们跑得更快?例如,我有一个非常简单的用户定义函数:

Function myweekday(mydate As Double)
    myweekday = Weekday(mydate)
End Function
基本上,它与内置的=weekday()函数的作用相同。然而,在50000个单元格上运行此函数需要大约5秒的时间来计算,而简单地使用内置函数只需要几分之一秒


如何才能让这样的用户定义函数更快地运行?

您可以将值作为一个范围传入,并让它在数组中一次返回所有值。我刚刚在50000行上尝试了这个,它立即返回了所有的值。您需要使用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

您可以将值作为一个范围传入,并让它在数组中一次返回所有值。我刚刚在50000行上尝试了这个,它立即返回了所有的值。您需要使用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

为什么要创建一个功能不如工作表或VBA的UDF?@Jeeped我唯一的猜测是Alex最终想让UDF更复杂,但正在考虑是否有可能在非常基本的基础上达到他们想要的UDF速度。@Jeeped是的,rwilson是正确的。当然,UDF是毫无意义的,但我想看看,即使是这么简单的东西,是否也能以相当快的速度运行。你为什么要创建一个功能比工作表或VBA更少的UDF?@Jeeped我唯一的猜测是Alex最终想让UDF更复杂,但是,他们正在考虑是否有可能让UDF的速度达到他们想要的基本速度。@Jeeped是的,rwilson是正确的。当然,UDF是毫无意义的,但我想看看,即使是这么简单的东西,是否能以相当快的速度运行。