Excel VBA UDF - 无法传递UDF中的变量数组作为第二个UDF中的输入

时间:2012-10-06 10:41:21

标签: arrays excel vba user-defined-functions

我正在努力使用我编写的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

结束功能

1 个答案:

答案 0 :(得分:1)

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

if IsObject(VarData) then VarData=VarData.Value2