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 Set
Schlü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
Range
z. B. eines) Set
genau 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")
.
set
kann dies zu Problemen führen. Ich hatte Probleme damit, aber wenn ich es benutze, set
tue 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. test
Unabhä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- return
Anweisung (oder einer anderen Anweisung), da return
die 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
Variant
und 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 Function
beziehtreturn
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 test
und weisen Sie dieses Array dann test
als Rückgabewert zu ("=") . Um weiter zu manipulieren, ReDim
müssen Sie den zurückgegebenen Wert einer Variablen zuweisen, z. B. Dim x as Variant
und aufrufen x = test
. x
Danach haben Sie das gemacht, was Sie sein test
sollen!