我正在努力使用我编写的UDF产生的数组作为另一个UDF的参数。
该函数返回#value错误。
我无法确定问题所在。
以下是代码。
非常感谢任何帮助/建议;)
这个有效..
Function fTA_GetSMA(ByRef varData As Variant, ByRef lPeriod As Long) As Variant
' This function computes a simple moving average over a defined period.
Dim l As Long
Dim dSum As Double
Dim var() As Variant
Application.Volatile
varData = varData.Value2
ReDim var(LBound(varData, 1) To UBound(varData, 1), 1)
For l = LBound(varData, 1) To UBound(varData, 1)
If l < lPeriod Then
dSum = dSum + varData(l, 1)
ElseIf l = lPeriod Then
dSum = dSum + varData(l, 1)
var(l, 1) = dSum / lPeriod
ElseIf l > lPeriod Then
dSum = dSum + varData(l, 1) - varData(l - lPeriod, 1)
var(l, 1) = dSum / lPeriod
End If
Next l
fTA_GetSMA = var
结束功能
这个也有效。
函数fTA_GetTR(ByRef varData As Variant)As Variant '此函数计算金融时间序列的真实范围。 '输入数据必须是包含O,H,L,C的矩阵。
Dim var() As Variant
Dim l As Long
Dim dMaxTR As Double
Dim dMinTR As Double
Application.Volatile
varData = varData.Value2
ReDim var(LBound(varData, 1) To UBound(varData, 1), 1)
For l = LBound(varData, 1) To UBound(varData, 1)
If l = 1 Then
dMinTR = varData(l, 3)
dMaxTR = varData(l, 2)
ElseIf l > 1 Then
dMaxTR = Application.WorksheetFunction.Max(varData(l, 2), varData(l - 1, 4))
dMinTR = Application.WorksheetFunction.Min(varData(l, 3), varData(l - 1, 4))
End If
var(l, 1) = dMaxTR - dMinTR
Next l
fTA_GetTR = var
结束功能
这是一个不起作用的人......
函数fTA_GetATR(ByRef varData As Variant,ByRef lPeriod As Long)As Variant '此函数计算给定数量的期间内金融时间序列的平均真实范围。 '输入数据必须是包含O,H,L,C的矩阵。 '平均公式是SMA
Dim var() As Variant
Dim varATR() As Variant
ReDim var(LBound(varData, 1) To UBound(varData, 1), 1)
ReDim varATR(LBound(varData, 1) To UBound(varData, 1), 1)
var = fTA_GetTR(varData)
varATR = fTA_GetSMA(var, lPeriod)
Debug.Print varATR
fTA_GetATR = varATR
结束功能
答案 0 :(得分:1)
如果Var包含范围引用,则只能使用VarData.Value2:如果VarData是变量数组,它将无效。
您的UDF期望Range参数作为输入(因为您使用.Value2)但返回包含数组的变量。因此,当您使用来自不同UDF的输出调用其中一个时,它会失败,因为输入不是范围
您可以通过设置断点并显示Locals窗口来检测Var变量包含的内容。
处理这个的方法是做这样的事情
if IsObject(VarData) then VarData=VarData.Value2