Public Sub to procedura VBA dostępna z każdego modułu projektu, w odróżnieniu od procedury prywatnej.
Zakres widoczności procedury Public Sub w VBA
W języku VBA zapis Public Sub definiuje publiczną procedurę typu Sub. Słowo kluczowe Public określa dostępność procedury, a Sub oznacza, że procedura wykonuje instrukcje, lecz nie zwraca wartości jako funkcja. Procedura publiczna umieszczona w standardowym module projektu może być wywoływana przez inne procedury znajdujące się w tym samym projekcie VBA. Dzięki temu można rozdzielić kod na mniejsze elementy i wykorzystywać jedną operację w wielu miejscach aplikacji.
Przykładowa deklaracja ma postać Public Sub PrzygotujRaport(), po której następuje blok instrukcji zakończony przez End Sub. Nazwa procedury musi być unikalna w zakresie, w którym VBA rozpoznaje wywołanie. Jeżeli w projekcie istnieją dwie procedury o tej samej nazwie, użycie nazwy kwalifikowanej nazwą modułu może usunąć niejednoznaczność, na przykład ModulRaport.PrzygotujRaport. Publiczny zakres widoczności nie oznacza automatycznie dostępności procedury z każdego innego projektu.
Składnia, parametry i wywoływanie
Procedura Public Sub może przyjmować parametry. Ich typ należy określić jawnie, na przykład w deklaracji Public Sub FormatujKomorke(ByVal zakres As Range). W VBA parametr bez wskazania ByVal lub ByRef jest domyślnie przekazywany przez referencję, dlatego w kodzie produkcyjnym warto podawać sposób przekazania wprost. ByVal przekazuje wartość lub kopię odwołania, natomiast ByRef pozwala procedurze zmienić wartość zmiennej przekazanej przez wywołującego. Dla obiektów ByVal nie uniemożliwia modyfikowania właściwości samego obiektu; ogranicza zmianę zmiennej przechowującej odwołanie.
Procedurę bez parametrów można uruchomić instrukcją Call PrzygotujRaport albo przez samo podanie nazwy PrzygotujRaport. Przy wywołaniu procedury z argumentami można użyć nawiasów zgodnie z regułami składni VBA, na przykład Call FormatujKomorke(ByVal zakres) lub FormatujKomorke zakres. Procedura Sub nie zwraca wyniku przez nazwę procedury. Jeżeli kod ma obliczyć i zwrócić pojedynczą wartość, właściwym elementem VBA jest Function, a nie Sub.
Procedura może również mieć opcjonalne parametry oznaczone słowem Optional, parametry tablicowe oznaczone ParamArray oraz wartości domyślne dla parametrów opcjonalnych. Każdy parametr powinien mieć sensowny typ, ponieważ pozostawienie wielu elementów jako Variant utrudnia wykrywanie błędów typów i niejawnych konwersji. Przy pracy z obiektami Office należy pamiętać o właściwym typie biblioteki, na przykład Excel.Range w kodzie przeznaczonym dla Excela.
Różnica między Public Sub, Private Sub i procedurą zdarzeniową
Private Sub jest dostępna wyłącznie w module, w którym została zadeklarowana. Taki zakres sprawdza się dla pomocniczych operacji, których inne moduły nie powinny wywoływać bezpośrednio. Public Sub tworzy natomiast interfejs procedury dostępny dla pozostałego kodu w projekcie, dlatego jej nazwa, parametry i oczekiwany stan danych powinny być traktowane jak część wewnętrznego API aplikacji. Publiczność procedury nie zastępuje kontroli poprawności argumentów ani obsługi wyjątków.
W modułach arkuszy, skoroszytu oraz formularzy VBA procedury często są związane ze zdarzeniami, takimi jak kliknięcie przycisku lub zmiana zawartości arkusza. Procedury zdarzeniowe są zwykle deklarowane jako Private Sub i mają ustaloną przez środowisko nazwę oraz listę parametrów, na przykład Private Sub Worksheet_Change(ByVal Target As Range). Publiczna procedura w module obiektu może być wywoływana z kwalifikatorem odpowiedniego obiektu, lecz nie zachowuje się identycznie jak publiczna procedura w standardowym module. Przy projektowaniu kodu warto więc umieszczać wspólne operacje w standardowych modułach, a obsługę zdarzeń ograniczać do przekazywania pracy do tych operacji.
Dobrym uzupełnieniem publicznej procedury jest Option Explicit, które wymusza deklarowanie zmiennych i ogranicza skutki literówek w nazwach. W większym makrze należy też przewidzieć obsługę błędów przez On Error, kontrolować wartości parametrów i przywracać stan aplikacji, jeżeli procedura czasowo wyłącza odświeżanie ekranu lub automatyczne obliczenia. Publiczna procedura powinna kończyć się w sposób przewidywalny także wtedy, gdy operacja na pliku, arkuszu albo zakresie komórek nie może zostać wykonana.
Zastosowanie w diagnostyce i codziennej pracy z komputerem
W praktycznym pliku Excel procedura Public Sub może uruchamiać raport, porządkować dane, sprawdzać zawartość wskazanego arkusza albo wykonywać powtarzalną operację dostępną z kilku przycisków. Jej zakres ogranicza się do projektu VBA, w którym została zdefiniowana; aby użyć podobnej procedury w innym skoroszycie, trzeba udostępnić odpowiedni projekt lub wywołać kod przez mechanizmy automatyzacji, o ile środowisko i ustawienia zabezpieczeń na to pozwalają. Sam fakt użycia słowa Public nie omija blokady makr ani ograniczeń zaufania dokumentu.
Warszawskie Pogotowie Komputerowe zajmuje się profesjonalną naprawą laptopów, komputerów PC i ich podzespołów, w tym diagnostyką problemów z uruchamianiem aplikacji biurowych oraz działaniem makr VBA. Przy zgłoszeniu dotyczącym procedury Public Sub warto przekazać nazwę programu, wersję pliku, dokładny komunikat błędu i informację, czy problem występuje tylko na jednym komputerze. Takie dane pomagają odróżnić błąd w kodzie, brak wymaganej biblioteki, niezgodność wersji Office oraz zablokowanie wykonywania makr przez ustawienia bezpieczeństwa.
Podczas analizy należy sprawdzić, czy procedura znajduje się w odpowiednim module, czy wszystkie używane zmienne i obiekty mają poprawne typy oraz czy wywołanie przekazuje parametry w zgodnej kolejności. Kompilacja projektu z menu edytora VBA może wskazać błędy składni i deklaracji jeszcze przed uruchomieniem makra. Dopiero po usunięciu takich błędów można wiarygodnie oceniać działanie samej procedury i jej wpływ na dane w skoroszycie.