我在查找如何从另一个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
答案 0 :(得分:1)
如果您从范围为test
参数的公式中调用arg1
,那么您的问题是您将Range
视为Array
致电UBound(arg2,1)
将其更改为UBound(arg2.Value,1)
,它会起作用。
进一步说明:
通过将arg#
参数声明为Variant
,可以使用Range
或Array
来调用UDF。使用As Range
或As Variant()
。
在Function ema
中,x = arg1
行避免了此问题:如果arg1
为Range
,则会复制范围的默认属性{{1 } {}为Value
的属性,使x
成为一个数组。如果x
是arg1
,那么它只会将该数组复制到Array
。
净结果x
可以处理范围或数组。但是还有另一个问题:Function ema
将失败并使用一维数组。将其更改为WorksheetFunction.Index(x, i, 1)
或更好WorksheetFunction.Index(x, i)
以避免此问题。