【问题标题】:Excel VBA UDF - Fail to pass a variant array resulting from UDFas an input in second UDFExcel VBA UDF - 无法将 UDF 产生的变量数组作为第二个 UDF 中的输入传递
【发布时间】:2012-09-27 08:45:48
【问题描述】:

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

结束函数

【问题讨论】:

  • 使用调用您的函数进行测试的简单子程序,并使用 VBA 的调试工具。几乎所有原因都会出现 #value 错误。

标签: arrays excel vba user-defined-functions


【解决方案1】:

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

if IsObject(VarData) then VarData=VarData.Value2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 2010-09-23
    • 2018-05-10
    相关资源
    最近更新 更多