To jedno z najczęściej zadawanych pytań w wywiadach VBA. W tym artykule dowiemy się, jaka jest różnica między argumentami ByVal i ByRef w Excel VBA.
Definicje:
Argument ByRef: Jest to dosłowna krótka forma odniesienia. Gdy argument jest przekazywany jako argument ByRef do innej podrzędnej lub funkcji, wysyłane jest odwołanie do rzeczywistej zmiennej. Wszelkie zmiany dokonane w kopii zmiennej zostaną odzwierciedlone w oryginalnym argumencie.
Możemy powiedzieć, że zamiast wartości, lokalizacja wartości jest wysyłana do funkcji za pomocą ByRef do funkcji.
To jest domyślny argument w VBA. Nie musimy pisać ByRef przed argumentem.
Składnia:
Sub x(a jako wariant)
'Lub
Sub x(ByRef a jako wariant)
Argument ByVal: Jest to dosłowna krótka forma określająca wartość. Gdy argument jest przekazywany jako argument ByVal do innej podrzędnej lub funkcji, wysyłana jest tylko wartość argumentu. Oryginalny argument pozostaje nienaruszony. Wszelkie zmiany wprowadzone w funkcji obcej lub sub nie będą odzwierciedlone w oryginalnym argumencie.
Aby zadeklarować argument jako ByVal, musisz użyć słowa kluczowego ByVal przed argumentem.
Składnia:
Sub x(ByVal a jako wariant)
Teraz znamy definicje. Zobaczmy przykład i skończmy z tym.
ByRef Przykład
Oto prosty program.
Sub X(ByRef a As Variant) a = 20 Debug.Drukuj "w sub X wartości a = " & a Koniec Sub Sub Y() a = 10 Wywołaj X(a) Debug.Drukuj "w wartości pod Y a = " & a Napis końcowy
Tak więc mamy tutaj dwa podprogramy. Pierwszy sub to X, który przyjmuje argument wariantu jako ByRef.
(Możesz pominąć słowo kluczowe ByRef. Jest to ustawienie domyślne).
Następnie ustawia wartość a = 20 end następnie wypisuje wartość a.
Pod Tak jest głównym podprogramem, który wywołuje podprogram x. Ustawia wartość a=10 następnie wywołuje podprogram X i przechodzia jako argument. Następnie wypisuje wartość a w Y.
Teraz, gdy uruchomisz Sub Y, to jest to wyjście, które otrzymujesz.
w sub X wartość a = 20
w sub Y wartość a = 20
Wniosek: wartość oryginalnego a jest zmieniana przez sub X i ustawiana na 20 dla obu subów.
widać, że kiedy Sub Y działa, początkowa wartość a wynosiła 10. Y wywołuje X(a). X ustawia wartość a=20. Drukuje „w sub X wartości a = 20”. Sterowanie wraca do y i wypisuje pod Y wartość a = 20.
To efekt argumentu ByRef.
ByVal Przykład:
To jest przykład ByVal
Sub X(ByVal a As Variant) a = 20 Debug.Drukuj "w sub X wartości a = " & a Koniec Sub Sub Y() a = 10 Wywołaj X(a) Debug.Drukuj "w wartości pod Y a = " & a Napis końcowy
Oba przykłady są takie same, z jedyną różnicą w przekazywaniu argumentów. Tutaj w X argumenty są deklarowane jako ByVal. Po uruchomieniu podprogramu Y tym razem dane wyjściowe są następujące:
w sub X wartość a = 20
w sub Y wartość a = 10
Wniosek: Wartość oryginalnego a NIE jest zmieniana przez sub X. Jest to 20 dla X i 10 dla Y.
Kiedy Y wywołuje X z a, wysyła tylko wartość a nie adres a. Dlatego każda zmiana dokonana w a nie jest odzwierciedlona w oryginalnej zmiennej.
Do testu, jeśli wartość wydruku wynosi a w X przed ustawieniem na 20, wypisze 10. Ponieważ 10 jest przekazywane do a w X przy użyciu byVal. Używając ByRef, który wysłałeś z Y do a X.
To proste pytanie, ale wielu z nas myli to w pytaniu wywiadu vba. Powodem jest to, że nie używamy go zbyt często. W większości przypadków kopiujemy wartość w innej zmiennej.
Więc tak, to jest różnica między argumentami ByRef i ByVal w Excelu VBA. Daj mi znać, jeśli masz jakiekolwiek wątpliwości dotyczące tego tematu lub innego tematu VBA lub Excela. Cała sekcja komentarzy jest Twoja.
Dodaj i zapisz nowy skoroszyt za pomocą VBA w programie Microsoft Excel 2016
Wyświetl komunikat na pasku stanu Excel VBA
Wyłącz komunikaty ostrzegawcze za pomocą VBA w programie Microsoft Excel 2016
Popularne artykuły:
Funkcja WYSZUKAJ.PIONOWO w programie Excel
LICZ.JEŻELI w Excelu 2016
Jak korzystać z funkcji SUMIF w programie Excel?