2013-04-02 17 views
7

Naprawiam arkusz kalkulacyjny. Programista wykonał makr dla każdego arkusza do uruchomienia po zmianie arkusza. Jest to dobre, ponieważ kolor koordynuje szczegóły arkusza po dodaniu nowych informacji, więc chciałbym zachować tę funkcję.Arkusz zmian arkusza zdarzeń VBA?

Napisałem makro, które sortuje dane i pozwala na usuwanie i dodawanie nowych pracowników, jest to w konflikcie z makrem zmian i powoduje, że moje makro ma błędy, jeśli oba działają.

P. Czy istnieje sposób na obejście zdarzenia zmiany arkusza roboczego podczas działania makra, a następnie jego ponowne uruchomienie po zakończeniu makra?

Oto kod zdarzenia zmiany.

Private Sub Worksheet_Change(ByVal target As Excel.Range, skip_update As Boolean) 
If skip_update = False Then 
    Call PaintCell(target) 
End If 
End Sub 

Moje makro wywołuje błędy w odniesieniu do arkuszy lub zakresów.

+0

Czy rozumiem poprawnie, że podczas sortowania jest wywoływane zdarzenie zmiany? – pintxo

Odpowiedz

15

myślę chcesz własność obiektu ApplicationEnableEvents. Po ustawieniu wartości EnableEvents na False, nic, co zrobi twój kod, nie spowoduje żadnych zdarzeń i żaden z pozostałych kodów zdarzeń nie zostanie uruchomiony. Jeśli, na przykład, twój kod zmieni komórkę, zwykle wywoła zdarzenie Zmień lub zdarzenie SheetChange. Jeśli jednak skonstruujesz go w ten sposób, zmiana A1 nie spowoduje żadnych zdarzeń.

Czasami korzystne jest posiadanie kodu wyzwalającego kod, a czasami nie. Użyj EnableEvents, gdy chcesz temu zapobiec.

0

Zbyt ryzykowne według mojej własnej oceny.

Użyłbym zmiennej o nazwie "skip_update", która jest ustawiona na "True" na początku każdego makra i na false, gdy się kończy.

np:

dim skip_update as Boolean = False 

sub auto_macro_when_modify() 
    if skip_update == True then 
     exit sub ' NO CHANGE ! 
    end if 
end sub 

sub other_macro 
    skip_update = True 
    ' (do stuff) 
    skip_update = False 
end sub 
+0

Cześć, dziękuję za odpowiedź, to świetny pomysł. Próbowałem wprowadzić go w błąd, ale wydaje się, że nie bierze tego pod uwagę. Opublikuję kod, aby był jaśniejszy, ale zaraz po umieszczeniu zdarzenia zmiany w programie, moje makro zaczyna wywoływać błędy, gdy tylko kliknę uruchamiam. I zaraz po usunięciu zdarzenia zmiany, działa znowu idealnie. Wydaje się, że podczas wstępnych kontroli przed uruchomieniem programu występuje jego błąd. – user1545643

+0

Twój "skip_update" musi być zdefiniowany jako "globalny", czyli poza jakimkolwiek sub. Sposób, w jaki to zrobiłeś, może nie być wyłączony. (Ja też zredagowałem swoją odpowiedź) – mansuetus

+0

Cześć, zdefiniowałem to tak, jak powiedziałeś, ale nadal jest problem. Dostaję błędy zdefiniowane przez aplikację lub zdefiniowane przez obiekt w moim makrze, gdy włączone jest inne makro, nawet jeśli zawiera ono instrukcję. – user1545643

0

Jest to ważna modyfikacja odpowiedzi z @ Dick Kusleika.

Po wyłączeniu ustawienia EnableEvents warto włączyć obsługę błędów, aby ponownie włączyć EnableEvents. Jeśli tego nie zrobisz, a skrypt zgłosi błąd, wyzwalacz zmiany (skrypt) przestanie działać, dopóki nie włączysz ponownie włączania EnableEvents.

Idealnie byłoby umieścić następującą linię bezpośrednio przed jakimkolwiek kodem, który ponownie uruchomił zdarzenie zmiany. Pierwsza linia mówi VBA, aby uzyskać etykietę o nazwie "enableEventsOn", gdy napotka błąd. Drugi wiersz omija zmiany wydarzeń.

On Error Goto enableEventsOn: 
Application.EnableEvents = False 

Następnie należy umieścić ten kod natychmiast po kodzie, który ponownie wywołał zdarzenie zmiany. To powoduje, że wydarzenie zmiany uruchamia się ponownie i przywraca normalny mechanizm obsługi błędów do skryptu.

Application.EnableEvents = True 
On Error Goto 0 

Na koniec umieść ten kod na końcu skryptu. Jest to etykieta wspomniana powyżej. Jeśli napotkany zostanie błąd między "On Error Goto enableEventsOn:" i "On Error Goto 0", skrypt przejdzie do tego miejsca i ponownie włączy EnableEvents, pozostawiając go gotowym do uruchomienia skryptu przy kolejnej zmianie arkusza roboczego.

enableEventsOn: 
Application.EnableEvents = True 
0

Możesz przytrzymać klawisz CTRL podczas robienia wpisu, który spowoduje zmianę rutyny zdarzenia. Mam procedurę do sumowania wartości w wybranym zakresie w danej kolumnie. Jeśli przeciągnę kursor z wiersza od 1 do 5, podświetlając je, wówczas ich suma zostanie zapisana w schowku. Każdy wpis w komórce w tej kolumnie uruchamia procedurę. Jeśli przytrzymam klawisz CTRL podczas wykonywania zamierzonego działania lub dowolnego wpisu w komórce w kolumnie, procedura nie zostanie zainicjowana. Może nie działać w przypadku bardziej skomplikowanych scenariuszy ChangeEvent.

+0

Kilka zdjęć podświetlających kroki może być tutaj użytecznych. –

Powiązane problemy