Hoe kan ik een resultaat van een functie teruggeven?
Bijvoorbeeld:
Public Function test() As Integer
return 1
End Function
Dit geeft een compileerfout.
Hoe kan ik deze functie een geheel getal laten teruggeven?
Voor niet-object return types moet je de waarde toewijzen aan de naam van je functie, zoals dit:
Public Function test() As Integer
test = 1
End Function
Voorbeeld gebruik:
Dim i As Integer
i = test()
Als de functie een Object type teruggeeft, dan moet je het Set
sleutelwoord gebruiken zoals dit:
Public Function testRange() As Range
Set testRange = Range("A1")
End Function
Voorbeeld gebruik:
Dim r As Range
Set r = testRange()
Merk op dat het toekennen van een return-waarde aan de functienaam de uitvoering van je functie niet beëindigt. Als je de functie wilt beëindigen, dan moet je expliciet Exit Function
zeggen. Bijvoorbeeld:
Function test(ByVal justReturnOne As Boolean) As Integer
If justReturnOne Then
test = 1
Exit Function
End If
'more code...
test = 2
End Function
Documentatie: http://msdn.microsoft.com/en-us/library/office/gg264233%28v=office.14%29.aspx
VBA functies behandelen de functienaam zelf als een soort variabele. Dus in plaats van een "return
" statement te gebruiken, zou je gewoon zeggen:
test = 1
Merk echter op dat dit de functie niet verbreekt. Alle code na dit statement zal ook worden uitgevoerd. Je kunt dus veel opdracht-statements hebben die verschillende waarden aan test
toekennen, en wat de waarde is als je het einde van de functie bereikt, zal de teruggegeven waarde zijn.
Alleen de return-waarde op de functienaam zetten is nog steeds niet exact hetzelfde als het Java (of andere) return
statement, omdat in java, return
de functie afsluit, zoals dit:
public int test(int x) {
if (x == 1) {
return 1; // exits immediately
}
// still here? return 0 as default.
return 0;
}
In VB, duurt het exacte equivalent twee regels als je de return waarde niet aan het eind van je functie zet. Dus, in VB zou de exacte corollary er als volgt uitzien:
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
Aangezien dit het geval is, is het ook leuk om te weten dat je de return variabele kunt gebruiken zoals elke andere variabele in de methode. Zoals dit:
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
Of, het extreme voorbeeld van hoe de return variabele werkt (maar niet noodzakelijk een goed voorbeeld van hoe je eigenlijk zou moeten coderen)-het voorbeeld dat je 's nachts wakker zal houden:
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