Ś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

4 thoughts on “Śledzenie zmian za pomocą Eventu w tablicy komórek”

  1. 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?

    1. Dariusz Skórniewski

      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.

  2. 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 .

    1. Dariusz Skórniewski

      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ć.

Leave a Comment

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *