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

时间:2013-04-07 23:41:20

标签: excel-vba user-defined-functions vba excel

我在查找如何从另一个UDF返回UDF中的数组时遇到了一些麻烦。这里的一个是一个简单的指数移动平均UDF,我试图将数组返回到另一个UDF,但我得到#value错误。我觉得有一个简单的解决方案,我没有看到。非常感谢所有帮助,谢谢。

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

1 个答案:

答案 0 :(得分:1)

如果您从范围为test参数的公式中调用arg1,那么您的问题是您将Range视为Array致电UBound(arg2,1)

将其更改为UBound(arg2.Value,1),它会起作用。

进一步说明:

通过将arg#参数声明为Variant,可以使用RangeArray来调用UDF。使用As RangeAs Variant()

可能更具体

Function ema中,x = arg1行避免了此问题:如果arg1Range,则会复制范围的默认属性{{1 } {}为Value的属性,使x成为一个数组。如果xarg1,那么它只会将该数组复制到Array

净结果x可以处理范围或数组。但是还有另一个问题:Function ema将失败并使用一维数组。将其更改为WorksheetFunction.Index(x, i, 1)或更好WorksheetFunction.Index(x, i)以避免此问题。