[英]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
可以使用Range
或Array
调用UDF。 通过使用As Range
或As Variant()
来进行特定化可能更好。
在Function ema
通过行x = arg1
可以避免此问题:如果arg1
是Range
则它将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.