Excel 如何调用在另一个UDF中返回数组的UDF?

Excel 如何调用在另一个UDF中返回数组的UDF?,excel,user-defined-functions,vba,Excel,User Defined Functions,Vba,我在计算如何从另一个UDF返回UDF中的数组时遇到了一些困难。这里的一个是一个简单的指数移动平均UDF,我试图将数组返回到另一个UDF中,但得到了#值错误。我觉得有一个简单的解决办法,我没有看到。非常感谢您的帮助,谢谢 Function ema(arg1 As Variant, ByVal lngth As Long) As Variant x = arg1 dim avg As Double avg = 1 Dim arrema As Variant

我在计算如何从另一个UDF返回UDF中的数组时遇到了一些困难。这里的一个是一个简单的指数移动平均UDF,我试图将数组返回到另一个UDF中,但得到了#值错误。我觉得有一个简单的解决办法,我没有看到。非常感谢您的帮助,谢谢

Function ema(arg1 As Variant, ByVal lngth As Long) As Variant
    x = arg1
    dim avg As Double

    avg = 1

    Dim arrema As Variant
    arrema = Array()
    ReDim arrema(1 To UBound(x, 1), 1 To 1)

    For j = 1 To (UBound(x, 1) - lngth)
        For i = (1 + j - 1) To (lngth + j - 1)
            avg = (WorksheetFunction.Index(x, i, 1) + 1) * avg
        Next i
        arrema(j, 1) = avg ^ (1 / lngth)
        avg = 1
    Next j
    'ema = avg ^ (1 / lngth)
    ema = arrema
End Function

Function test(arg2 As Variant, xlength As Long)
    Dim arra As Variant
    'Call ema(arg2, xlength)
    Dim arr As Variant
    arr = Array()
    ReDim arr(1 To UBound(arg2, 1), 1 To 1)

    arra = ema(arg2, xlength)

    For i = 1 To UBound(arg2, 1) - xlength
        arr(i, 1) = arra(i, 1)
    Next i

    test = arr
End Function

如果从范围为
arg1
参数的公式调用
test
,那么您的问题是调用
UBound(arg2,1)

将其更改为
UBound(arg2.Value,1)
,它就会工作

进一步解释:

通过将
arg#
参数声明为
Variant
,可以使用
范围
数组
调用UDF。最好使用
作为范围
作为变量()

函数ema
中,通过行
x=arg1
可以避免此问题:如果
arg1
是一个
范围
,则将范围的默认属性即
属性复制到
x
,使
x
成为一个数组。如果
arg1
是一个
数组
,那么它只是将该数组复制到
x


最终结果是
函数ema
可以处理范围或数组。不过还有另一个问题:
WorksheetFunction.Index(x,i,1)
将在一维数组中失败。将其更改为
WorksheetFunction.Index(x,i)
或更好的
Application.Index(x,i)
,以避免此问题。

测试函数的第一个参数需要数组=test({1,2,3,4,5,9},10)不太确定我是否遵循,我在arg1中传递的数组与在arg2中传递的数组相同。要获得此错误,您传递的值是什么?尝试返回的是什么?数组是您将得到的,除非您使用像sum这样的聚合函数,否则不会显示在excel中。我刚刚编写了测试函数,专门研究如何处理从另一个UDF中的UDF返回数组。下面的答案解决了我的问题,代码现在正在运行。我正在传递一系列“arg1”和“arg2”中的数据,以及“lngth”和“xlength”中EMA的长度。