VBA - Śledzenie zmian za pomocą Eventu w tablicy komórek

Śledzenie zmian za pomocą Eventu w tablicy komórek

Pierwotna wersja śledzenia zmian

W jednym z wcześniejszych wpisów pokazałem jak za pomocą VBA stworzyć mechanizm śledzący zmiany w arkuszach i zapisujący wszystkie te modyfikacje w arkuszu o nazwie „Raport zmian” ( kliknij, aby przejść do wpisu ).

Niedawno na YT Patryk zapytał czy jest możliwe śledzenie zmian dla wielu komórek,
a konkretnie jeśli ktoś usunął dane z wielu komórek w jednym kroku.

Przypadek wydał mi się ciekawy i postanowiłem sprawdzić co mogłoby zadziałać. Osiągnąłem wynik wykorzystując tablice, które przechowywały wartości ze wszystkich zmienianych komórek, a później wprowadzały te wartości do kolejnych rekordów w Raporcie zmian.

Wykorzystanie zmiennej tablicowej

Pierwszym zabiegiem była modyfikacja zmiennej PoprzedniaWartosc, która działała dla jednej komórki, ale dla tablicy już nie. Dlatego też zmieniłem ją w tablicę bez określenia liczby elementów.

Aby mieć możliwość wprowadzania kolejnych wartości tablicy potrzebowałem pętli, więc dodałem sobie zmienną liczbową, którą wykorzystam do iteracji.

deklaracja zmiennej tablicowej oraz liczbowej

Pętla wprowadzająca wartości do tablicy

Teraz w trzech eventach (Open, SheetActivate, oraz SheetSelectionChange), które pobierały wartość z komórki muszę wprowadzić pętlę. Przed pętlą konieczne jest ustalenie liczby elementów tablicy co robię za pomocą polecenia ReDim gdzie jako liczbę elementów podaję liczbę zaznaczonych komórek tj. Selection.Count.

Pętlą z iteracją od 1 do liczby zaznaczonych komórek wykonuję wprowadzanie wartości do zmiennej tablicowej. Aby odwołać się do konkretnego elementu w nawiasie wprowadzam zmienną k, która iteruje w ramach pętli.

wprowadzanie poprzednich wartości do tablicy

Zmiana w evencie SheetChange

Teraz w evencie SheetChange wprowadzam pętlę, która wykonuje przejście tyle razy, ile jest komórek zaznaczonych.

pętla for next

Przy Targecie, a także do tablicy PoprzedniaWartosc wprowadzam w nawiasie k jako indeks elementu tablicy ( Target w tym wypadku tez będzie tablicą ).

indeksy tablic przy wprowadzaniu danych

Pojawił się dodatkowy problem z wprowadzaniem rzekomo nowych zmian w momencie kiedy zaznaczam kilka komórek, ale dokonuję zmiany tylko w jednej z nich. Dodałem więc warunek, który sprawdza, czy PoprzedniaWartosc, oraz aktualna wartość ( Target ) czymś się od siebie różnią. To pozwala na zignorowanie komórek, w których nie została dokonana zmiana.

porównywanie elementów tablic

Zdarzenie, które się zapętla

Dodałem też pewne usprawnienie, które delikatnie przyspieszy działanie całego mechanizmu. Z uwagi na to, że event SheetChange wprowadza zmiany w arkuszu “RaportZmian“, powoduje to ponowne uruchomienie eventu podczas uzupełniania każdej komórki. I tak 6 razy dla każdej zmodyfikowanej komórki.

Żeby wyłączyć rejestrowanie zmian na czas wprowadzania informacji do RaportuZmian wystarczy użyć polecenia Application.EnableEvents = False.

wyłączenie rejestracji eventów

Oczywiście na koniec trzeba jeszcze obsługę eventów włączyć.

przywrócenie rejestracji eventów

Jeśli chcesz, możesz zobaczyć całą dokonywaną przeze mnie modyfikację na nagraniu zamieszczonym na kanale YT.

Spodobał Ci się artykuł ? Udostępnij go znajomym.

Share on facebook
Share on linkedin
Share on twitter

Leave a Comment

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