2013-04-02 17 views
7

Ich repariere eine Tabelle. Der Programmierer hat ein Makro für jedes Blatt erstellt, das ausgelöst wird, wenn das Blatt geändert wird. Das ist gut, weil es die Bogendetails farblich koordiniert, wenn neue Informationen hinzugefügt werden, also möchte ich diese Funktion behalten.VBA Worksheet Event-Bypass ändern?

Ich habe ein Makro geschrieben, das die Daten sortiert und das Entfernen und Hinzufügen neuer Mitarbeiter ermöglicht. Dies steht im Konflikt mit dem Change Event Makro und verursacht, dass mein Makro Fehler aufweist, wenn beide operativ sind.

Q. Gibt es eine Möglichkeit, das Arbeitsblattänderungsereignis zu umgehen, während das Makro ausgeführt wird, und es dann wieder zu verwenden, sobald das Makro fertig ist?

Hier ist der Code für das Änderungsereignis.

Mein Makro verursacht Fehler, wenn ich auf Arbeitsblätter oder Bereiche verweisen.

+0

Verstehe ich es richtig, dass während der Sortierung das Änderungsereignis ausgelöst wird? – pintxo

Antwort

15

Ich glaube, Sie das Objekt EnableEvents Eigenschaft des Application wollen. Wenn Sie EnableEvents auf False setzen, wird nichts, was Ihr Code auslöst, irgendwelche Ereignisse auslösen und keiner der anderen Ereigniscodes wird ausgeführt. Wenn Ihr Code beispielsweise eine Zelle ändert, würde er normalerweise das Change-Ereignis oder das SheetChange-Ereignis auslösen. Wenn Sie es jedoch so strukturieren

Application.EnableEvents = False 
    Sheet1.Range("A1").Value = "new" 
Application.EnableEvents = True 

dann wird die Änderung A1 keine Ereignisse auslösen.

Manchmal ist es von Vorteil, wenn Ihr Code Ereigniscode auslöst und manchmal nicht. Verwenden Sie EnableEvents, wenn Sie es verhindern möchten.

0

Zu meiner eigenen Meinung zu riskant.

Ich würde eine Variable namens "skip_update" verwenden, die am Anfang jedes Makros auf "True" und am Ende auf "True" gesetzt wird.

z:

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

Hallo, danke für die Antwort, das ist eine großartige Idee. Ich habe versucht, es zu integrieren, aber es scheint das nicht zu berücksichtigen. Ich poste den Code, so dass es klarer ist, aber sobald ich das Änderungsereignis zurück in das Programm lege, startet mein Makro Fehler, sobald ich auf "Ausführen" geklickt habe. Und sobald ich das Change Event entferne, läuft es wieder perfekt. Es scheint in den vorläufigen Überprüfungen vor dem Programm selbst zu laufen, wenn es zu Fehlern kommt. – user1545643

+0

Ihr "skip_update" muss "global" definiert sein, das ist außerhalb jeder Untergruppe. Wie Sie es getan haben, ist der Auslöser möglicherweise nicht deaktiviert. (Ich habe meine Antwort auch bearbeitet) – mansuetus

+0

Hallo, ich habe es so definiert, wie du gesagt hast, aber es ist immer noch ein Problem. Ich bekomme anwendungsdefinierte oder objektdefinierte Fehler in meinem Makro, immer wenn das andere Makro aktiviert ist, sogar mit der Anweisung is. – user1545643

0

Dies ist eine wichtige Änderung der Antwort von @Dick Kusleika.

Wenn Sie die EnableEvents-Einstellung deaktivieren, sollten Sie die Fehlerbehandlung einbeziehen, um EnableEvents wieder einzuschalten. Wenn Sie dies nicht tun und das Skript einen Fehler ausgibt, wird der Auslöser für Änderungsereignisse (Ihr Skript) nicht mehr funktionieren, bis Sie EnableEvents wieder manuell aktivieren.

Im Idealfall würden Sie die folgende Zeile unmittelbar vor jedem Code platzieren, der das Änderungsereignis erneut ausgelöst hat. Die erste Zeile weist VBA an, eine Kennung namens "enableEventsOn" zu erhalten, wenn ein Fehler auftritt. Die zweite Zeile umgeht Änderungsereignisse.

On Error Goto enableEventsOn: 
Application.EnableEvents = False 

Dann platzieren Sie diesen Code sofort nach dem Code, der das Änderungsereignis erneut ausgelöst hat. Dadurch werden Trigger für Änderungsereignisse wieder aktiviert und die normale Fehlerbehandlung wird an Ihr Skript zurückgegeben.

Application.EnableEvents = True 
On Error Goto 0 

Schließlich legen Sie diesen Code am Ende Ihres Skripts. Es ist ein Etikett, auf das oben Bezug genommen wird. Wenn ein Fehler zwischen "Bei Fehler Goto enableEventsOn:" und "Bei Fehler Goto 0" auftritt, wird das Skript hier gehen und EnableEvents wieder einschalten, so dass es das Skript beim nächsten Wechsel des Arbeitsblatts starten kann.

0

Sie können die STRG-Taste gedrückt halten, während Sie einen Eintrag ausführen, der die Ereignisroutine für die Änderung auslösen würde. Ich habe eine Routine, um die Werte in einem ausgewählten Bereich in einer bestimmten Spalte zu summieren. Wenn ich den Mauszeiger aus den Zeilen 1 bis 5 ziehe und diese hervorhebe, wird die Summe in der Zwischenablage gespeichert. Jeder Eintrag in einer Zelle in dieser Spalte löst die Routine aus. Wenn ich die CTRL-Taste gedrückt halte, während ich die beabsichtigte Handlung oder irgendeine Eintragung in einer Zelle in der Spalte durchführe, wird die Routine nicht initiiert. Funktioniert möglicherweise nicht für kompliziertere ChangeEvent-Szenarien.

+0

Ein paar Bilder, die die Schritte hervorheben, können hier nützlich sein. –

Verwandte Themen