2

我在弄清楚如何从另一个 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
4

1 回答 1

1

如果您test从一个以范围为arg1参数的公式调用,那么您的问题是您将 aRange视为Array通过调用UBound(arg2,1)

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

进一步说明:

通过将arg#参数声明为Variant允许使用Range's 或Array's 调用 UDF。使用As Range或来具体化可能会更好As Variant()

Function ema此问题中,通过以下行避免了该问题x = arg1: If arg1is a Rangethen 这会将 Range 的默认属性复制为 的Value属性x,从而创建x一个数组。If arg1is an Arraythen 它只是将该数组复制到x.

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

于 2013-04-08T05:38:29.347 回答