2 Stimmen

Wie rufe ich eine UDF auf, die ein Array innerhalb einer anderen UDF zurückgibt?

Ich habe einige Probleme damit, herauszufinden, wie man ein Array innerhalb einer UDF von einer anderen UDF zurückgibt. Die hier ist eine einfache UDF für den exponentiellen gleitenden Durchschnitt, und ich versuche, das Array in eine andere UDF zurückzugeben, aber ich bekomme den Fehler #WERT!. Ich habe das Gefühl, dass es eine einfache Lösung gibt, die ich nicht sehe. Jede Hilfe wird sehr geschätzt, danke.

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

1voto

chris neilsen Punkte 50473

Wenn Sie test aus einer Formel mit einem Bereich als arg1-Parameter aufrufen, besteht Ihr Problem darin, dass Sie einen Bereich behandeln, als wäre es ein Array, indem Sie UBound(arg2,1) aufrufen.

Ändern Sie das zu UBound(arg2.Value,1) und es wird funktionieren.

Weitere Erklärung:

Das Deklarieren der arg#-Parameter als Variant ermöglicht es, die UDFs mit Bereichn oder Arrayn aufzurufen. Es ist möglicherweise besser, spezifischer zu sein und entweder As Range oder As Variant() zu verwenden.

In der Funktion ema wird dieses Problem vermieden, indem die Zeile x = arg1 verwendet wird: Wenn arg1 ein Bereich ist, dann kopiert dies die Standardeigenschaft des Bereichs, was die Value-Eigenschaft ist, nach x, wodurch x zu einem Array wird. Wenn arg1 ein Array ist, dann kopiert es einfach dieses Array in x.

Das Ergebnis ist, dass die Funktion ema sowohl mit Bereichen als auch mit Arrays umgehen kann. Es gibt jedoch ein weiteres Problem: WorksheetFunction.Index(x, i, 1) schlägt bei eindimensionalen Arrays fehl. Ändern Sie es in WorksheetFunction.Index(x, i) oder noch besser in Application.Index(x, i), um auch dieses Problem zu vermeiden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X