Πώς μπορώ να επιστρέψω ένα αποτέλεσμα από μια συνάρτηση;
Για παράδειγμα:
Public Function test() As Integer
return 1
End Function
Αυτό οδηγεί σε σφάλμα μεταγλώττισης.
Πώς μπορώ να κάνω αυτή τη συνάρτηση να επιστρέψει έναν ακέραιο;
Για τύπους επιστροφής μη αντικειμένων, πρέπει να αναθέσετε την τιμή στο όνομα της συνάρτησής σας, όπως παρακάτω:
Public Function test() As Integer
test = 1
End Function
Παράδειγμα χρήσης:
Dim i As Integer
i = test()
Αν η συνάρτηση επιστρέφει έναν τύπο αντικειμένου, τότε πρέπει να χρησιμοποιήσετε τη λέξη-κλειδί Set
όπως παρακάτω:
Public Function testRange() As Range
Set testRange = Range("A1")
End Function
Παράδειγμα χρήσης:
Dim r As Range
Set r = testRange()
Σημειώστε ότι η ανάθεση μιας τιμής επιστροφής στο όνομα της συνάρτησης δεν τερματίζει την εκτέλεση της συνάρτησής σας. Αν θέλετε να τερματίσετε τη συνάρτηση, τότε πρέπει να πείτε ρητά Exit Function
. Για παράδειγμα:
Function test(ByVal justReturnOne As Boolean) As Integer
If justReturnOne Then
test = 1
Exit Function
End If
'more code...
test = 2
End Function
Τεκμηρίωση: http://msdn.microsoft.com/en-us/library/office/gg264233%28v=office.14%29.aspx
Οι συναρτήσεις VBA αντιμετωπίζουν το ίδιο το όνομα της συνάρτησης ως ένα είδος μεταβλητής. Έτσι, αντί να χρησιμοποιήσετε μια δήλωση "return
", θα λέγατε απλώς:
test = 1
Παρατηρήστε, ωστόσο, ότι αυτό δεν ξεφεύγει από τη συνάρτηση. Οποιοσδήποτε κώδικας μετά από αυτή τη δήλωση θα εκτελεστεί επίσης. Έτσι, μπορείτε να έχετε πολλές εντολές ανάθεσης που αναθέτουν διαφορετικές τιμές στο test
, και όποια και αν είναι η τιμή όταν φτάσετε στο τέλος της συνάρτησης θα είναι η τιμή που θα επιστραφεί.
Το να ορίσετε απλώς την τιμή επιστροφής στο όνομα της συνάρτησης δεν είναι ακόμα ακριβώς το ίδιο με τη δήλωση return
της Java (ή άλλης), επειδή στη java, η return
τερματίζει τη συνάρτηση, όπως εδώ:
public int test(int x) {
if (x == 1) {
return 1; // exits immediately
}
// still here? return 0 as default.
return 0;
}
Στη VB, το ακριβές ισοδύναμο χρειάζεται δύο γραμμές αν δεν ορίζετε την τιμή επιστροφής στο τέλος της συνάρτησης. Έτσι, στη VB το ακριβές επακόλουθο θα έμοιαζε ως εξής:
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
Εφόσον συμβαίνει αυτό, είναι επίσης καλό να γνωρίζετε ότι μπορείτε να χρησιμοποιήσετε τη μεταβλητή return όπως οποιαδήποτε άλλη μεταβλητή στη μέθοδο. Όπως αυτό:
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
Ή, το ακραίο παράδειγμα για το πώς η μεταβλητή return λειτουργεί (αλλά όχι απαραίτητα ένα καλό παράδειγμα για το πώς θα έπρεπε να κωδικοποιείτε στην πραγματικότητα)-αυτό που θα σας κρατήσει ξύπνιους τη νύχτα:
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