Najlepsza odpowiedź
Podprogramy mają zakres widoczności. W VBA można uzyskać dostęp do publicznej subskrypcji ( o nazwie ) z dowolnego modułu kodu. Private Sub można wywołać tylko z modułu, w którym się znajduje.
Pojęcie to nosi nazwę Zakres. Obiekty i zmienne również mają zasięg .
Tutaj znajduje się krótkie wprowadzenie: Zrozumienie zakresu i widoczności
Gdy wiemy, tworzymy Sub-prywatne że nic poza bieżącym modułem nie powinno nigdy robić to, do czego ten kod jest przeznaczony; tworzymy coś konkretnego zadania i kontekstu. Z drugiej strony powinniśmy się mocno zastanowić, kiedy publikujemy subskrybentów.
Pisząc VBA dla innych użytkowników, prawdopodobnie nie chcesz, aby bezpośrednio wywoływały Twój kod. Każda subskrypcja publiczna, o ile nie ma parametrów, jest widoczna na liście „Makro” użytkownika. (Alt-F8)
Ukrywanie publicznych subskrypcji przed użytkownikiem (powinno) zwykle samo się rozwiązuje; kiedy wywołujesz Sub w innym module, generalnie musisz powiedzieć mu, co musi wiedzieć, przekazując mu odpowiednie parametry, a Publiczne Subskrypcje z parametrami nie pojawiają się na liście użytkowników.
Ale czasami przydatne jest narzędzie Sub, które można wywołać z dowolnego miejsca i nie wymaga parametrów; powiedzmy z przycisku w arkuszu, który wywołuje kod startowy w module publicznym. NIE chcesz, aby Twój moduł startowy był widoczny dla użytkowników.
Więc daj swojemu sub parametrowi, którego nigdy nie używasz. Jeszcze lepiej, podaj parametr, o którym nie musisz wspominać. Zobacz parametr opcjonalny w trzecim podpunkcie poniżej.
Option Explicit
Sub Visible()
" Can call this guy from anywhere;
" from any module or directly by the user.
" Sub (on it"s own) is lazy shorthand for "Public Sub"
Invisible
End Sub
Private Sub Invisible()
" This Sub can ONLY be called from inside its module.
" It is not shown in the Macro list available to the user.
Tricksy
End Sub
Public Sub Tricksy(Optional pIgnore As Boolean = True)
" This sub can be called from anywhere.
" It does not require a parameter (pIgnore).
" BUT, because it has a parameter, it does not appear
" in the user"s list of available "macros".
MsgBox "Hi there", vbExclamation, "Greetings from Tricksy"
End Sub
Użytkownik może przeglądać i wywoływać sub Widoczne . Tylko kod z tego samego modułu może wywołać sub Invisible . Tricksy można wywołać z dowolnego miejsca i nie wymaga parametru, ale użytkownik nie może go „zobaczyć”.
Wywołanie Widoczne skutkuje:
Podczas debugowania możesz wywołać publiczne subskrypcje z okna bezpośredniego i możesz to zrobić w dowolnym momencie, gdy kod jeszcze nie jest uruchomiony.
Ale możesz wywołać prywatne subskrypcje z okna bezpośredniego tylko po osiągnięciu punktu przerwania lub zatrzymaniu gdzieś w jego module hosta .
Odpowiedź
Prywatne i (Publiczne) Sub służą do zadeklarowania zakresu procedury .
Private Sub: sprawia, że procedura może być wywołana tylko w tym samym module przez inną procedurę.
Powiedzmy, że masz moduł o nazwie Moduł A , aw ramach tego modułu masz dwie procedury o nazwie:
- Private Sub Hello\_World ()
- Wiadomość pomocnicza ()
Public Sub Message()
Call Hello\_World()
End Sub
Private Sub Hello\_World()
MsgBox “Hello World”
End Sub
Wiadomość , procedura o nazwie Hello\_World . Było to możliwe, ponieważ obie procedury znajdowały się w tym samym module (Moduł A).
Powiedzmy, że masz Moduł B z następującą procedurą :
Sub Message2()
Call Hello\_World()
End Sub
To zwróci błąd kompilacji: „Podrzędna lub funkcja nie została zdefiniowana”.
Dlaczego?
Ponieważ wywoływała Procedura prywatna ( Hello\_World ) z innego modułu. Niemożliwe.
Public Sub: Twoja procedura może być wywoływana przez inne procedury w różnych modułach. Wszystkie procedury są domyślnie publiczne, więc nie ma potrzeby wcześniejszego deklarowania świata jako „Publicznego”. Wystarczy Sub.
Sub ThisIsEnough()