Jaka jest różnica między podrzędnym a prywatnym podrzędnym w Excel VBA?


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()

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *