1

別の 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

終了機能

これも機能します。

Function 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

終了機能

これは機能していないものです..

Function 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

終了機能

4

1 に答える 1

1

VarData.Value2 は、Var に範囲参照が含まれている場合にのみ使用できます。VarData がバリアント配列の場合は機能しません。
UDF は入力として Range 引数を想定していますが (.Value2 を使用しているため)、配列を含むバリアントを返します。したがって、別のUDFからの出力を使用してそれらの1つを呼び出すと、入力が範囲ではないため失敗します。
これを検出するには、ブレークポイントを設定し、[ローカル] ウィンドウを表示して、Var 変数の内容を調べます。
これを処理する方法は、このようなことをすることです

if IsObject(VarData) then VarData=VarData.Value2
于 2012-10-06T13:07:57.743 に答える