Ako vrátim výsledok z funkcie?
Napríklad:
Public Function test() As Integer
return 1
End Function
To spôsobí chybu kompilácie.
Ako mám túto funkciu prinútiť, aby vracala celé číslo?
V prípade neobjektových návratových typov musíte priradiť hodnotu k názvu funkcie takto:
Public Function test() As Integer
test = 1
End Function
Príklad použitia:
Dim i As Integer
i = test()
Ak funkcia vracia typ Object, musíte použiť kľúčové slovo Set
takto:
Public Function testRange() As Range
Set testRange = Range("A1")
End Function
Príklad použitia:
Dim r As Range
Set r = testRange()
Všimnite si, že priradením návratovej hodnoty k názvu funkcie sa vykonávanie funkcie neukončí. Ak chcete funkciu ukončiť, musíte explicitne povedať Ukončiť funkciu
. Napríklad:
Function test(ByVal justReturnOne As Boolean) As Integer
If justReturnOne Then
test = 1
Exit Function
End If
'more code...
test = 2
End Function
Dokumentácia: http://msdn.microsoft.com/en-us/library/office/gg264233%28v=office.14%29.aspx
Funkcie VBA považujú samotný názov funkcie za druh premennej. Takže namiesto príkazu "return
" stačí povedať:
test = 1
Všimnite si však, že sa tým nevylučuje funkcia. Akýkoľvek kód po tomto príkaze sa tiež vykoná. Môžete teda mať veľa priraďovacích príkazov, ktoré priradia rôzne hodnoty k test
, a akákoľvek hodnota bude po dosiahnutí konca funkcie, bude vrátenou hodnotou.
Samotné nastavenie návratovej hodnoty na názov funkcie ešte stále nie je presne rovnaké ako príkaz return
v Jave (alebo v iných jazykoch), pretože v Jave príkaz return
ukončuje funkciu, napríklad takto:
public int test(int x) {
if (x == 1) {
return 1; // exits immediately
}
// still here? return 0 as default.
return 0;
}
Vo VB trvá presný ekvivalent dva riadky, ak nenastavujete návratovú hodnotu na konci funkcie. Takže vo VB by presný dôsledok vyzeral takto:
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
Keďže ide o tento prípad, je tiež dobré vedieť, že návratovú premennú môžete použiť ako akúkoľvek inú premennú v metóde. Napríklad takto:
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
Alebo extrémny príklad toho, ako návratová premenná funguje (ale nie nevyhnutne dobrý príklad toho, ako by ste mali skutočne kódovať) - ten, ktorý vám nedá spať:
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