Wie gebe ich ein Ergebnis von einer Funktion zurück?
Beispielsweise:
Public Function test() As Integer
return 1
End Function
Dies führt zu einem Kompilierungsfehler.
Wie kann ich dafür sorgen, dass diese Funktion eine Ganzzahl zurückgibt?
Wie gebe ich ein Ergebnis von einer Funktion zurück?
Beispielsweise:
Public Function test() As Integer
return 1
End Function
Dies führt zu einem Kompilierungsfehler.
Wie kann ich dafür sorgen, dass diese Funktion eine Ganzzahl zurückgibt?
Antworten:
Bei Rückgabetypen, die keine Objekte sind, müssen Sie den Wert dem Namen Ihrer Funktion wie folgt 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 SetSchlüsselwort 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 dies explizit angeben Exit Function. 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
Rangez. B. eines) Setgenau wie beim Festlegen einer Objektvariablen in einer regulären Methode verwenden müssen. Wenn zum Beispiel "test" eine Funktion wäre, die einen Bereich zurückgibt, würde die return-Anweisung so aussehen set test = Range("A1").
setkann dies zu Problemen führen. Ich hatte Probleme damit, aber wenn ich es benutze, settue ich es nicht :).
set test = Range("A1")Dies entspricht genau dem Wert test = Range("A1").Value, bei dem "Test" als Variante und nicht als Bereich definiert ist.
VBA-Funktionen behandeln den Funktionsnamen selbst als eine Art Variable. Anstatt 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, denen unterschiedliche Werte zugewiesen werden. testUnabhängig vom Wert, den Sie am Ende der Funktion erreichen, wird der Wert zurückgegeben.
Das Festlegen des Rückgabewerts auf den Funktionsnamen entspricht immer noch nicht genau der Java- returnAnweisung (oder einer anderen Anweisung), da returndie Funktion in Java wie folgt beendet wird:
public int test(int x) {
if (x == 1) {
return 1; // exits immediately
}
// still here? return 0 as default.
return 0;
}
In VB dauert das genaue Äquivalent zwei Zeilen, wenn Sie den Rückgabewert nicht am Ende Ihrer Funktion festlegen . In VB würde die genaue Folge also 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 schön 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 dafür, wie die Rückgabevariable funktioniert (aber nicht unbedingt ein gutes Beispiel dafür, wie Sie tatsächlich codieren sollten) - das, das Sie nachts auf Trab 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
Variantund Ihr Ziel darin besteht, ein Array zurückzugeben, wird so etwas wie ReDim test(1 to 100)einen Fehler auslösen. Auch wenn es möglich ist, den Basistyp so zu behandeln Integers, wird er als etwas unidiomatisch angesehen. Dies erschwert das Lesen des Codes. VBA-Programmierer suchen nach Zeilen, die dem Funktionsnamen zugewiesen sind, um zu verstehen, was eine Funktion tut. Die Verwendung des Funktionsnamens als reguläre Variable verdeckt dies unnötig.
Exit Functionbeziehtreturn
ReDim test(1 to 100)ohne einen Fehler auslösen, nur weil 'Test' nicht als Array deklariert ist! und aus keinem anderen Grund! Sie können eine Funktion nicht als Array deklarieren. Deklarieren Sie es als Variant, erstellen Sie dann einfach Ihr Ausgabearray (es kann dynamisch oder statisch sein) in dieser Funktion testund weisen Sie dieses Array dann testals Rückgabewert zu ("=") . Um weiter zu manipulieren, ReDimmüssen Sie den zurückgegebenen Wert einer Variablen zuweisen, z. B. Dim x as Variantund aufrufen x = test. xDanach haben Sie das gemacht, was Sie sein testsollen!