Static to modyfikator VBA nakazujący zachowanie wartości zmiennej między kolejnymi wywołaniami procedury.
Static w języku VBA i jego podstawowe zadanie
W VBA słowo kluczowe Static służy do zadeklarowania zmiennej lokalnej, której wartość pozostaje zachowana pomiędzy kolejnymi wywołaniami tej samej procedury. Zwykła zmienna lokalna istnieje tylko podczas bieżącego wykonania procedury: po zakończeniu Sub albo Function jej wartość przestaje być dostępna. Zmienna zadeklarowana za pomocą Static ma natomiast zakres widoczności ograniczony do procedury, ale jej zawartość nie jest tracona przy wyjściu z procedury.
Przykładowa deklaracja Static Licznik As Long tworzy lokalną zmienną typu Long. Przy pierwszym wejściu do procedury otrzymuje ona wartość początkową właściwą dla danego typu, czyli w tym przypadku zero. Jeżeli procedura zwiększy ją o jeden i zostanie wywołana ponownie, kolejne wykonanie odczyta poprzednio zachowaną wartość. Dzięki temu można przechowywać stan prostego mechanizmu bez udostępniania zmiennej jako globalnej dla całego modułu lub projektu.
Zakres widoczności a czas życia zmiennej Static
Najważniejszą cechą Static jest rozdzielenie zakresu widoczności od czasu życia danych. Kod znajdujący się poza procedurą nie może bezpośrednio odwołać się do jej zmiennej Static, ponieważ pozostaje ona lokalna. Jednocześnie pamięć przeznaczona na tę zmienną zachowuje wartość między wywołaniami. Takie połączenie bywa używane do zapamiętania liczby wykonanych operacji, poprzedniego wyniku obliczeń albo informacji, czy procedura została już zainicjalizowana.
Wartość zmiennej Static nie jest zachowywana bezwarunkowo przez cały czas istnienia pliku. Reset wykonania kodu w edytorze VBA, zatrzymanie projektu po błędzie, użycie polecenia zakończenia wykonywania lub ponowne uruchomienie projektu może wyzerować stan zmiennych. Zamknięcie i ponowne otwarcie skoroszytu również nie służy do trwałego zapisu takich danych. Jeżeli wartość ma przetrwać zamknięcie programu, należy zapisać ją w odpowiednim miejscu, na przykład w arkuszu, pliku konfiguracyjnym albo bazie danych, zależnie od wymagań aplikacji.
Praktyczne zastosowania i ograniczenia w procedurach VBA
Typowym zastosowaniem jest licznik wywołań. Procedura może zadeklarować Static LiczbaWywolan As Long, zwiększać tę zmienną przy każdym uruchomieniu i wykorzystywać jej wartość do wyboru kolejnego etapu działania. Podobnie można zapamiętać poprzednią wartość parametru, czas wykonania lub znacznik informujący, że jednorazowa inicjalizacja została już przeprowadzona. Zmienna Static może być także tablicą, jeżeli procedura musi przechowywać kilka elementów stanu między wywołaniami.
Mechanizm wymaga ostrożności w procedurach obsługujących zdarzenia, ponieważ użytkownik może nie wiedzieć, że wynik zależy od wcześniejszych wywołań. Jeśli kod zostanie zatrzymany w środowisku VBA albo projekt napotka nieobsłużony błąd, przechowywany stan może wrócić do wartości początkowej. Zmienna Static nie jest też automatycznie synchronizowana pomiędzy różnymi procedurami ani instancjami obiektów. Gdy kilka części programu ma korzystać ze wspólnego stanu, trzeba jawnie zaprojektować jego przechowywanie, zakres dostępu i sposób resetowania.
Static podczas analizy makr i naprawy aplikacji biurowej
Podczas diagnozowania makra warto sprawdzić wszystkie deklaracje Static, miejsca ich modyfikacji oraz sytuacje, w których kod może zostać zresetowany. Błąd często nie wynika z samej składni, lecz z założenia, że zmienna zawsze zachowa poprzednią wartość. Należy prześledzić kolejność wywołań procedury, wartości początkowe dla użytego typu oraz ścieżki obsługi błędów. Pomocne jest również kontrolowane uruchamianie makra z punktami przerwania i obserwowanie wartości w oknie lokalnym edytora VBA.
Warszawskie Pogotowie Komputerowe zajmuje się profesjonalną naprawą laptopów i komputerów PC, w tym diagnozowaniem problemów z aplikacjami biurowymi, makrami VBA oraz podzespołami komputerowymi. W przypadku nieprawidłowego działania programu można sprawdzić nie tylko kod procedury, ale także stan środowiska VBA, poprawność pliku skoroszytu i powtarzalność występującego błędu.