wake-up-neo.com

So geben Sie ein Ergebnis von einer VBA-Funktion zurück

Wie kann ich ein Ergebnis einer Funktion zurückgeben?

Zum Beispiel:

Public Function test() As Integer
    return 1
End Function

Dies führt zu einem Kompilierungsfehler.

Wie bringe ich diese Funktion dazu, eine Ganzzahl zurückzugeben?

250
Mike

Bei Rückgabetypen, die keine Objekte sind, müssen Sie dem Namen Ihrer Funktion den folgenden Wert zuweisen:

Public Function test() As Integer
    test = 1
End Function

Anwendungsbeispiel:

Dim i As Integer
i = test()

Wenn die Funktion einen Objekttyp zurückgibt, müssen Sie das Schlüsselwort Set wie folgt verwenden:

Public Function testRange() As Range
    Set testRange = Range("A1")
End Function

Anwendungsbeispiel:

Dim r As Range
Set r = testRange()

Beachten Sie, dass das Zuweisen eines Rückgabewerts zum Funktionsnamen die Ausführung Ihrer Funktion nicht beendet. Wenn Sie die Funktion beenden möchten, müssen Sie Exit Function explizit sagen. Zum Beispiel:

Function test(ByVal justReturnOne As Boolean) As Integer
    If justReturnOne Then
        test = 1
        Exit Function
    End If
    'more code...
    test = 2
End Function

Dokumentation: http://msdn.Microsoft.com/en-us/library/office/gg264233%28v=office.14%29.aspx

394
Dan

VBA-Funktionen behandeln den Funktionsnamen selbst als eine Art Variable. Anstatt also eine "return" -Anweisung zu verwenden, würden Sie einfach sagen:

test = 1

Beachten Sie jedoch, dass dies nicht aus der Funktion ausbricht. Jeder Code nach dieser Anweisung wird ebenfalls ausgeführt. Auf diese Weise können Sie viele Zuweisungsanweisungen haben, die test unterschiedliche Werte zuweisen. Wenn Sie das Ende der Funktion erreichen, wird der Wert zurückgegeben.

83
froadie

Das einfache Setzen des Rückgabewerts auf den Funktionsnamen ist immer noch nicht genau mit der Anweisung Java (oder einer anderen) return identisch, da return in Java die Anweisung beendet Funktion wie folgt:

public int test(int x) {
    if (x == 1) {
        return 1; // exits immediately
    }

    // still here? return 0 as default.
    return 0;
}

In VB benötigt das genaue Äquivalent zwei Zeilen , wenn Sie den Rückgabewert am Ende Ihrer Funktion nicht setzen . Also würde in VB die genaue Folge so aussehen:

Public Function test(ByVal x As Integer) As Integer
    If x = 1 Then
        test = 1 ' does not exit immediately. You must manually terminate...
        Exit Function ' to exit
    End If

    ' Still here? return 0 as default.
    test = 0
    ' no need for an Exit Function because we're about to exit anyway.
End Function 

Da dies der Fall ist, ist es auch gut zu wissen, dass Sie die Rückgabevariable wie jede andere Variable in der Methode verwenden können. So was:

Public Function test(ByVal x As Integer) As Integer

    test = x ' <-- set the return value

    If test <> 1 Then ' Test the currently set return value
        test = 0 ' Reset the return value to a *new* value
    End If

End Function 

Oder das extreme Beispiel , wie die Rückgabevariable funktioniert (aber nicht unbedingt ein gutes Beispiel dafür, wie Sie eigentlich codieren sollten) - die, die dich nachts wach hält:

Public Function test(ByVal x As Integer) As Integer

    test = x ' <-- set the return value

    If test > 0 Then

        ' RECURSIVE CALL...WITH THE RETURN VALUE AS AN ARGUMENT,
        ' AND THE RESULT RESETTING THE RETURN VALUE.
        test = test(test - 1)

    End If

End Function
34
LimaNightHawk