繁体   English   中英

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

[英]How do I call a UDF that returns an array within another UDF?

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

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

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

进一步说明:

通过将arg#参数声明为Variant可以使用RangeArray调用UDF。 通过使用As RangeAs Variant()来进行特定化可能更好。

Function ema通过行x = arg1可以避免此问题:如果arg1Range则它将Range的默认属性(即Value属性)复制到x ,从而使x成为数组。 如果arg1是一个Array则将其复制到x

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM