Moje doświadczenia z Excelem, Accesem i programowaniem w VBA
Blog > Komentarze do wpisu

Wyłączenie obsługi zdarzeń

Wyobraźmy sobie arkusz Excela z kodem reagującym na zdarzenia arkusza. W zależności od tego, jaki jest to kod, jego wykonywanie bardzo łatwo może generować kolejne i zupełnie niepotrzebne zdarzenia arkusza.
Załóżmy, że mamy oprogramowane zdarzenie arkusza, które po zmianie wartości w komórce kolumny A w sąsiadującej z nią komórce kolumny B wstawia datę. Przykładowy kod takiej funkcji wygląda tak:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 1 Then
        Target.Offset(0, 1) = Date()
    End If
End Sub


 

 

 

W trakcie wykonywania kodu, po wstawieniu wartości w kolumnie B następuje wykrycie zdarzenia "przy zmianie" i następuje ponowne uruchomienie makra (mimo, że pierwsze nie doszło jeszcze do końca). W tym przypadku akurat może być praktycznie niezauważalne, ale jeżeli takich zmian jest więcej - owszem. W ekstremalnym przypadku może to doprowadzić do zapętlenia kodu.

Chcąc tego uniknąć musimy na czas wykonywania kodu po prostu wyłączyć obsługę wykrywania zdarzeń. Wykorzystujemy do tego właściwość obiektu Application - EnableEvants. Jest to właściwość typu Boolean czyli może przybierać wartość Prawda lub Fałsz. Ustawiamy ją tak:

Application.EnableEvents=False          'wyłączenie obsługi zdarzeń

Application.EnableEvents=True            'włączenie obsługi zdarzeń

Wykorzystując w kodzie makra jw. mamy więc:

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Column = 1 Then
   Application.EnableEvents = False
   Target.Offset(0, 1) = Date()
   Application.EnableEvents = True
 End If

End Sub


 

 

 

 

 

I już. Na czas wykonywania kodu obsługa zdarzeń jest wyłączona - wstawienie daty w komórce sąsiadującej nie wywoła w tym przypadku ponownej reakcji na zdarzenie.



wtorek, 21 lutego 2017, marzatela













Polecane wpisy

TrackBack
TrackBack URL wpisu:
Komentarze
Gość: Bober, 195.205.221.*
2017/04/06 15:48:26
Zdaje się powinno być tak
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
Application.EnableEvents = False
Target.Offset(0, 1) = Date()
Application.EnableEvents = True
End If
End Sub
-
2017/04/07 08:42:33
@Bober
Zdecydowanie masz rację - moja pomyłka. Wyłączenie obsługi zdarzeń na początku procedury wymaga włączenia ich na końcu. Poprawiłam.
Dzięki za czujność.


Książki warte polecenia
zobacz szczegóły...


A tu oferta na dziś:





ministat liczniki.org



Napisz do mnie!