Excel VBA UDF – 未能将由UDF产生的变体数组作为第二个UDF中的input

我正在努力使用由我已经写作为另一个UDF的参数的UDF产生的数组。

该函数返回#value错误。

我无法确定问题出在哪里。

下面是代码。

任何帮助/build议将不胜感激;)

这一个工程..

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 

结束function

这个也可以。

函数fTA_GetTR(ByRef varData As Variant)As Variant'此函数计算财务时间序列的真实范围。 'input数据必须是包含O,H,L,C的matrix。

 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 

结束function

这是不工作的一个..

函数fTA_GetATR(ByRef varData As Variant,ByRef lPeriod As Long)As Variant'此函数计算给定数量的期间内金融时间序列的平均真实范围。 'input数据必须是包含O,H,L,C的matrix',平均公式是一个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 

结束function

如果Var包含范围引用,则只能使用VarData.Value2:如果VarData是变体数组,它将不起作用。
你的UDF期望Range参数作为input(因为你使用.Value2),但返回一个包含数组的变体。 所以当你使用另一个UDF的输出调用其中一个时,它会失败,因为input不是范围。
您可以通过设置一个断点并显示Locals窗口来检测Varvariables包含的内容。
处理这个问题的方法就是做这样的事情

 if IsObject(VarData) then VarData=VarData.Value2