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

Posted

技术标签:

【中文标题】如何调用在另一个 UDF 中返回数组的 UDF?【英文标题】:How do I call a UDF that returns an array within another UDF? 【发布时间】:2013-04-07 23:41:19 【问题描述】:

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

【问题讨论】:

测试函数的第一个参数需要数组。 =test(1,2,3,4,5,9,10) 不太确定我是否遵循,我在 arg1 中传递与 arg2 中相同的数组。 你传递了什么值来得到这个错误? 想要返回什么?数组是你将得到的并且不会在 Excel 中显示,除非你使用 sum 之类的聚合函数。 我刚刚编写了测试函数来专门弄清楚如何处理从另一个 UDF 中返回一个 UDF 的数组。下面的答案清除了我的问题,代码现在可以工作了。我在 'arg1' 和 'arg2' 中传递了一系列数据,并且只是在 'lngth' 和 'xlength' 中传递了 EMA 的长度。 【参考方案1】:

如果您从一个范围为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,从而使@ 987654339@ 一个数组。如果arg1Array,那么它只是将该数组复制到x

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

【讨论】:

以上是关于如何调用在另一个 UDF 中返回数组的 UDF?的主要内容,如果未能解决你的问题,请参考以下文章

您可以从 Redshift 中的 python UDF 返回多个值吗?

如何将 Excel 数组公式传递给 VBA UDF?

UDF数组导致#Value [重复]

如何在另一个数据库中创建引用调用者中正确 sys.objects 表的 UDF 或视图?

UDF's in redshift : 可以在另一个中引用一个 udf

在另一个 UDF 中使用来自加载项的 UDF