Czym jest zdarzenie w VBA?
Zdarzenie (lub Event) w VBA to makro, które uruchamia kod w momencie zarejestrowania w Excelu jakiegoś działania. Może nim być np. otwarcie pliku, aktywacja arkusza, czy zmiana zaznaczenia. Zdarzenia dzielą się na takie, które dotyczą arkusza, lub skoroszytu.
Worksheet_Change to zdarzenie, które aktywuje się wtedy, gdy ktoś dokona zmiany wartości w dowolnej komórce. Aby dodać takie zdarzenie wystarczy że na liście projektów kliknę dwukrotnie w wybrany arkusz (ten, dla którego zdarzenie chcę ustawić). Następnie z listy rozwijanej po lewej stronie okna głównego wybieram Worksheet. Tutaj domyślnym zdarzeniem jest Selection_Change. Z listy po prawej stronie okna wybieram Change i pojawia się nowe zdarzenie.
Pytanie brzmi: czy event wychwyci każdą zmianę? Niestety nie, ponieważ rejestruje wyłącznie zmianę wartości w komórce, ale zmianę koloru komórki już nie. Dlatego też wykorzystując inne zdarzenia i zmienne publiczne stworzę mechanizm, który będzie rejestrować zmiany koloru komórki.
Zdarzenie Workbook_Open – otwarcie skoroszytu
Zacznę od zdarzenia dla skoroszytu Workbook_Open, którego nazwa mówi sama za siebie. Kiedy ktoś otworzy plik chcę, aby dwie zdefiniowane przeze mnie zmienne globalne kolor i adres pobrały odpowiednie wartości z aktywnej komórki. Kolor przyjmie wartość koloru tła komórki, a adres przyjmie adres komórki, której wartość koloru została pobrana do zmiennej kolor.
Aby dodać zdarzenie do skoroszytu klikam dwukrotnie w pozycję Ten_skoroszyt na liście projektów. Dalej postępuję podobnie jak w przypadku arkusza. Domyślnym zdarzeniem dla skoroszytu jest Open.
Niestety wartość zmiennych nie może być wymieniana pomiędzy skoroszytem i arkuszem. To powoduje, że nie mogę tu wprowadzić zmiennych globalnych. Dlatego też w zdarzeniu Workbook_Open wprowadzę kod uruchamiający procedurę, która pobierze wartości do zmiennych.
Klikam PPM na projekt z listy projektów i z menu kontekstowego wybieram polecenie Insert/Module. Do stworzonej procedury wprowadzam zmienne globalne, oraz polecenie pobrania wartości do zmiennych.
Zdarzenie Worksheet_Activate – aktywacja arkusza
Użytkownik, który otworzy plik może aktywować inne arkusze np. w celu ich przeglądnięcia. Dlatego kolejnym moim krokiem będzie pobranie wartości do zmiennych w momencie aktywacji docelowego arkusza. W tym celu użyję zdarzenia Worksheet_Activate.
Wracam do zdarzeń arkusza i z rozwijanej listy po prawej stronie wybieram Activate, a w zdarzeniu wprowadzam takie same polecenia jak w procedurze.
Zdarzenie Selection_Change – zmiana zaznaczenia
To już ostatnia część, w której po wychwyceniu zmiany zaznaczenia wykorzystuję instrukcję warunkową IF. Sprawdzam, czy aktualny kolor komórki o adresie zapisanym w zmiennej adres jest taki sam, jak wartość koloru zapisana w zmiennej kolor.
Kolejnym krokiem jest oczywiście przypisanie nowych wartości do zmiennych.
W ten sposób stworzyłem zdarzenie, które wychwytuje zmiany koloru tła komórki, ale to tylko propozycja bo równie dobrze można wyłapywać np. zmiany w kolorze czcionki.
Jeśli chcesz zobaczyć w jaki sposób tworzę to makro na filmie to sprawdź na YT: