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 AsBoolean)AsIntegerIf justReturnOne Then
test =1ExitFunctionEndIf'more code...
test =2EndFunction
Dla kompletności należy zauważyć, że gdy zwracasz obiekt (jak Rangena przykład), musisz używać tego Setsamego, 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").
Jay Carr
Dlaczego to jest @JayCarr?
PsychoData,
4
@PsychoData - Po prostu dlatego, że tak w ogóle ustawiasz zmienną obiektową, a wykonywanie jej bez setmoże prowadzić do problemów. Miałem problemy bez robienia tego, ale jeśli używam, setnie mam :).
Jay Carr
1
Myślę, że warto również wspomnieć, że zachowanie funkcji różni się, gdy wywołujesz ją z arkusza kalkulacyjnego, w porównaniu z wywoływaniem jej z innej funkcji VBA lub Sub.
Doug Jenkins,
2
Gdy zostanie wywołana w VBA, funkcja zwróci obiekt zakresu, ale gdy zostanie wywołana z arkusza, zwróci tylko wartość, więc set test = Range("A1")jest dokładnie równoważna test = Range("A1").Value, gdzie „test” jest zdefiniowany jako wariant, a nie zakres.
Doug Jenkins,
86
Funkcje VBA traktują samą nazwę funkcji jako rodzaj zmiennej. Zamiast używać returnwyraż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ść.
Właściwie odpowiedziałeś na pytanie jaśniej, dodając dodatkowe informacje (które mogłyby potencjalnie doprowadzić do kolejnego pytania od nowego do VBA). Kontynuujcie dobra prace
Adarsha
Przepraszam, wyglądało na to, że właśnie odpowiedziałeś tak samo jak moja odpowiedź, którą otrzymałem jako pierwszy, ale dodałem tylko fakt, że nie wyłamuje się z funkcji. To miły dodatek, pomyślałem, że będzie bardziej odpowiedni jako komentarz. Nie jestem pewien, jaka jest właściwa etykieta, wydaje mi się, że głosowanie za nią było trochę niegrzeczne, ponieważ jest to dobra odpowiedź, ale nie pozwoli mi jej cofnąć.
Dan
41
Samo ustawienie wartości zwracanej na nazwę funkcji wciąż nie jest dokładnie takie samo jak instrukcja Java (lub inna) return, ponieważ w java returnwychodzi z funkcji, tak jak poniżej:
publicint test(int x){if(x ==1){return1;// exits immediately}// still here? return 0 as default.return0;}
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:
PublicFunction test(ByVal x AsInteger)AsIntegerIf x =1Then
test =1' does not exit immediately. You must manually terminate...ExitFunction' to exitEndIf' Still here? return 0 as default.
test =0' no need for an Exit Function because we're about to exit anyway.EndFunction
Ponieważ tak jest, miło jest wiedzieć, że możesz używać zmiennej zwracanej jak każdej innej zmiennej w metodzie. Lubię to:
PublicFunction test(ByVal x AsInteger)AsInteger
test = x ' <-- set the return valueIf test <>1Then' Test the currently set return value
test =0' Reset the return value to a *new* valueEndIfEndFunction
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:
PublicFunction test(ByVal x AsInteger)AsInteger
test = x ' <-- set the return valueIf test >0Then' RECURSIVE CALL...WITH THE RETURN VALUE AS AN ARGUMENT,' AND THE RESULT RESETTING THE RETURN VALUE.
test = test(test -1)EndIfEndFunction
„miło jest również wiedzieć, że możesz używać zmiennej zwracanej, jak każdej innej zmiennej w metodzie”, jest to w większości prawda - ale np. jeśli typem zwracanym jest, Varianta 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 Integersjak 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.
John Coleman,
@JohnColeman, całkowicie zgadzam się w obu punktach. W żadnym wypadku ostatni przykład nie powinien być zalecaną metodologią. Ale pytanie tematyczne dotyczy tego, jak zwrócić zmienną, więc jest to tylko próba pełnego wyjaśnienia wyniku zwracanego przez VB, a przez to, w jaki sposób działają. Z pewnością ostatni przypadek nie jest zaleceniem. (Z pewnością nie kodowałbym tego jako przykładu.) Zatem twoje punkty są dobrze przyjęte i dobre uzupełnienia. Dziękuję Ci.
LimaNightHawk
Jest to użyteczne dla funkcji niewielkie, a to coś, co każdy programista powinien wiedzieć o VBA, więc nie miałem problemu z wami o tym wspomnieć. Pomyślałem, że należy dołączyć ostrzeżenie.
John Coleman,
Dzięki, wyjaśniając, w jaki sposób Exit Functionodnosi się doreturn
Austin D
@JohnColeman, oczywiście nie można 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, testa następnie przypisz („=”) tę tablicę testjako wartość zwracaną. Aby dalej manipulować, podobnie jak ReDimgo, musisz przypisać zwróconą wartość do zmiennej, np. Dim x as VariantI wywołać x = test, po czym xto, co stworzyłeś test!
Gene
-6
Poniższy kod przechowuje wartość zwracaną w zmiennej, retVala następnie MsgBoxmożna jej użyć do wyświetlenia wartości:
Dim retVal AsInteger
retVal = test()
Msgbox retVal
Odpowiedzi:
W przypadku typów obiektów niebędących obiektami musisz przypisać wartość do nazwy swojej funkcji, tak jak poniżej:
Przykładowe użycie:
Jeśli funkcja zwraca typ obiektu, musisz użyć
Set
słowa kluczowego w ten sposób:Przykładowe użycie:
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:Dokumentacja: http://msdn.microsoft.com/en-us/library/office/gg264233%28v=office.14%29.aspx
źródło
Range
na przykład), musisz używać tegoSet
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 takset 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żnatest = 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ć: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ść.źródło
Samo ustawienie wartości zwracanej na nazwę funkcji wciąż nie jest dokładnie takie samo jak instrukcja Java (lub inna)
return
, ponieważ w javareturn
wychodzi z funkcji, tak jak poniżej: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:
Ponieważ tak jest, miło jest wiedzieć, że możesz używać zmiennej zwracanej jak każdej innej zmiennej w metodzie. Lubię to:
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:
źródło
Variant
a Twoim celem jest zwrócenie tablicy, wówczas coś podobnegoReDim test(1 to 100)
spowoduje błąd. Ponadto, mimo że jest możliwe, aby traktować podstawowy typ takiegoIntegers
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 jakoVariant
, 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 jakReDim
go, musisz przypisać zwróconą wartość do zmiennej, np.Dim x as Variant
I wywołaćx = test
, po czymx
to, co stworzyłeśtest
!Poniższy kod przechowuje wartość zwracaną w zmiennej,
retVal
a następnieMsgBox
można jej użyć do wyświetlenia wartości:źródło