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.
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.
Zmiana w evencie SheetChange
Teraz w evencie SheetChange wprowadzam pętlę, która wykonuje przejście tyle razy, ile jest komórek zaznaczonych.
Przy Targecie, a także do tablicy PoprzedniaWartosc wprowadzam w nawiasie k jako indeks elementu tablicy ( Target w tym wypadku tez będzie tablicą ).
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.
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.
Oczywiście na koniec trzeba jeszcze obsługę eventów włączyć.
Jeśli chcesz, możesz zobaczyć całą dokonywaną przeze mnie modyfikację na nagraniu zamieszczonym na kanale YT.
4 thoughts on “Śledzenie zmian za pomocą Eventu w tablicy komórek”
Dzień dobry,
super macro, jest bardzo przydatne, ale mam problem, jak zaznaczam całą komórke lub cały rząd pojawia mi się error – 6, overflow, czy jest sposób jak uniknąć tego błędu?
Cześć Paweł,
Nie wiem w którym momencie pojawia Ci się overflow ( momencie kodu ), ale widzę, że zmienna którą przyjąłem dla k to jest integer, więc można przerobić w tym makrze maksymalnie 32 tysiące komórek. Jeżeli masz tego więcej to spróbuj zmienną k przerobić na Long.
Witam : Mam pytanie – czy można tak zmodyfikować makro aby uruchomienie było możliwe uzależnione od potrzeb użytkownika / właściciela – pliku do którego napływają dane / . Lub inaczej opisze potrzebę – właściciel pliku winien określić czas / okres / realizacji śledzenia zmian .
Cześć,
Myślę, że może wystarczyłoby na początku tego zdarzenia sprawdzać czy czas pobrany z komputera jest taki jaki nam odpowiada i albo kontynuować zdarzenie, ale je zakończyć.