Odpowiedzi:
W przypadku typów obiektów niebędących obiektami musisz przypisać wartość do nazwy swojej funkcji, tak jak poniżej:
Public Function test() As Integer
test = 1
End Function
Przykładowe użycie:
Dim i As Integer
i = test()
Jeśli funkcja zwraca typ obiektu, musisz użyć Set
słowa kluczowego w ten sposób:
Public Function testRange() As Range
Set testRange = Range("A1")
End Function
Przykładowe użycie:
Dim r As Range
Set r = testRange()
Należy pamiętać, że przypisanie wartości zwracanej do nazwy funkcji nie kończy wykonywania funkcji. Jeśli chcesz wyjść z funkcji, musisz wyraźnie powiedzieć Exit Function
. Na przykład:
Function test(ByVal justReturnOne As Boolean) As Integer
If justReturnOne Then
test = 1
Exit Function
End If
'more code...
test = 2
End Function
Dokumentacja: http://msdn.microsoft.com/en-us/library/office/gg264233%28v=office.14%29.aspx
Range
na przykład), musisz używać tego Set
samego, co robisz, jeśli ustawiasz zmienną obiektu w zwykłej metodzie. Gdyby na przykład „test” był funkcją, która zwróciła zakres, instrukcja return wyglądałaby tak set test = Range("A1")
.
set
może prowadzić do problemów. Miałem problemy bez robienia tego, ale jeśli używam, set
nie mam :).
set test = Range("A1")
jest dokładnie równoważna test = Range("A1").Value
, gdzie „test” jest zdefiniowany jako wariant, a nie zakres.
Funkcje VBA traktują samą nazwę funkcji jako rodzaj zmiennej. Zamiast używać return
wyrażenia „ ”, wystarczy powiedzieć:
test = 1
Zauważ jednak, że nie wyłamuje się to z funkcji. Kod po tej instrukcji również zostanie wykonany. W ten sposób możesz mieć wiele instrukcji przypisania, które przypisują różne wartości test
, i niezależnie od wartości po osiągnięciu końca funkcji będzie zwracana wartość.
Samo ustawienie wartości zwracanej na nazwę funkcji wciąż nie jest dokładnie takie samo jak instrukcja Java (lub inna) return
, ponieważ w java return
wychodzi z funkcji, tak jak poniżej:
public int test(int x) {
if (x == 1) {
return 1; // exits immediately
}
// still here? return 0 as default.
return 0;
}
W VB dokładny ekwiwalent zajmuje dwa wiersze, jeśli nie ustawiasz wartości zwracanej na końcu funkcji . Tak więc w VB następująca konsekwencja wyglądałaby następująco:
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
Ponieważ tak jest, miło jest wiedzieć, że możesz używać zmiennej zwracanej jak każdej innej zmiennej w metodzie. Lubię to:
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
Lub skrajna przykładem tego, jak zmienne powrót prace (ale niekoniecznie dobrym przykładem tego, w jaki sposób należy właściwie code) -the który będzie Cię w nocy:
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
a Twoim celem jest zwrócenie tablicy, wówczas coś podobnego ReDim test(1 to 100)
spowoduje błąd. Ponadto, mimo że jest możliwe, aby traktować podstawowy typ takiego Integers
jak to, że jest uważany za nieco unidiomatic. Utrudnia to odczytanie kodu. Programiści VBA szukają linii przypisujących nazwę funkcji, aby zrozumieć, co robi funkcja. Używanie nazwy funkcji jako zwykłej zmiennej niepotrzebnie to zaciemnia.
Exit Function
odnosi się doreturn
ReDim test(1 to 100)
bez wywołania błędu po prostu dlatego, że „test” nie jest zadeklarowany jako tablica! i bez żadnego innego powodu! Nie można zadeklarować funkcji jako tablicy. Zadeklaruj go jako Variant
, a następnie po prostu zbuduj tablicę wyjściową (może być dynamiczną lub statyczną) wewnątrz tej funkcji, test
a następnie przypisz („=”) tę tablicę test
jako wartość zwracaną. Aby dalej manipulować, podobnie jak ReDim
go, musisz przypisać zwróconą wartość do zmiennej, np. Dim x as Variant
I wywołać x = test
, po czym x
to, co stworzyłeś test
!