2

別の UDF から UDF 内の配列を返す方法がわかりません。ここにあるのは単純な指数移動平均 UDF で、配列を別の UDF に戻そうとしていますが、#value エラーが発生しています。私が見ていない簡単な解決策があると感じています。すべての助けに感謝します。

Function ema(arg1 As Variant, ByVal lngth As Long) As Variant
    x = arg1
    dim avg As Double

    avg = 1

    Dim arrema As Variant
    arrema = Array()
    ReDim arrema(1 To UBound(x, 1), 1 To 1)

    For j = 1 To (UBound(x, 1) - lngth)
        For i = (1 + j - 1) To (lngth + j - 1)
            avg = (WorksheetFunction.Index(x, i, 1) + 1) * avg
        Next i
        arrema(j, 1) = avg ^ (1 / lngth)
        avg = 1
    Next j
    'ema = avg ^ (1 / lngth)
    ema = arrema
End Function

Function test(arg2 As Variant, xlength As Long)
    Dim arra As Variant
    'Call ema(arg2, xlength)
    Dim arr As Variant
    arr = Array()
    ReDim arr(1 To UBound(arg2, 1), 1 To 1)

    arra = ema(arg2, xlength)

    For i = 1 To UBound(arg2, 1) - xlength
        arr(i, 1) = arra(i, 1)
    Next i

    test = arr
End Function
4

1 に答える 1

1

testパラメータとして範囲を使用して式から呼び出している場合、問題は、呼び出しによってaを であるかのようにarg1扱っていることですRangeArrayUBound(arg2,1)

それをに変更するUBound(arg2.Value,1)と動作します。

さらなる説明:

arg#パラメーターを として宣言するVariantことにより、UDF をRange's またはArray's で呼び出すことができます。As Rangeまたは のいずれかを使用して具体的にする方がよい場合がありますAs Variant()

このFunction ema問題では、次の行によって回避されますx = arg1。 If arg1is a Rangethen これは、プロパティである Range のデフォルト プロパティを にコピーしValue、配列xを作成します。が のx場合、その配列を にコピーするだけです。 arg1Arrayx

最終的な結果はFunction ema、範囲または配列のいずれかを処理できます。ただし、別の問題がありますWorksheetFunction.Index(x, i, 1)。1 次元配列では失敗します。この問題も回避するには、WorksheetFunction.Index(x, i)またはそれ以上に変更してください。Application.Index(x, i)

于 2013-04-08T05:38:29.347 に答える