Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1844to1848
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Worksheet_Change nur einmal aufrufen

Worksheet_Change nur einmal aufrufen
15.09.2021 20:53:23
SchubertFranzl
Hallo
wie kann man verhindern, dass ein Worksheet_Change 2 mal durchlaufen wird, wenn man Zellen von einen Bereich in den anderen schiebt?
Was ich meine, möchte ich mit folgendem Beispiel zeigen.
Erst mal das Makro Vorbereitung starten. Damit werden C1 bis C10 mit Zahlen befüllt und Spalte C gelb eingefärbt. OK.
Wenn der Anwender nun was in eine Zelle in Spalte C hineinschreibt, löst das eine Farbänderung auf grün aus, bzw. wieder auf gelb. OK
Wenn nun der Anwender händisch zum Beispiel den Zellbereich C3:C5 nach C12:C14 mit der Maus verschiebt, wird das Makro Worksheet_Change zwei Mal aufgerufen, erst mit Target = C3:C5 und dann mit Target = C12:C14.
Es erfolgt keine Änderung der Hintergrundfarbe, besser gesagt zwei Mal, was sich aufhebt. Ich hätte aber gern nur eine Farbänderung, denn dem Anwender möchte eine Farbäbnderung sehen, egal, was er macht.
Kann man im Makro beim ersten Durchlauf bereits abfragen, ob da noch ein zweiter Durchlauf, und wenn ja, mit welchem Target er kommt?
Denn dann könnte man die Farbänderung das zweite Mal verhindern.
Und hier das Makro (im Blattmodul):
Dim NoEvent As Boolean
Sub Vorbereitung()
Dim i As Long
NoEvent = True
Columns("C:C").Clear
Columns("C:C").Interior.Color = 65535
For i = 1 To 10
Range("C" & i) = i
Next i
NoEvent = False
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If NoEvent Then Exit Sub
With Columns("C:C").Interior
If .Color = 65535 Then
.Color = 5296274  'Grün
Else
.Color = 65535    'Gelb
End If
End With
End Sub
LG, Franz

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Worksheet_Change nur einmal aufrufen
15.09.2021 21:02:07
Hajo_Zi
Hallo Franz,
Zu beginn
Application.EnableEvents = False
Vor End Sub
Application.EnableEvents = True
Dein Change Ereignis wird nur einmal ausgeführt, da keine Zelle geändert wird.
GrußformelHomepage
AW: Worksheet_Change nur einmal aufrufen
15.09.2021 21:02:22
Oberschlumpf
Hi Franz,
a) du musst global geltende Variablen in einem allgemeinen Modul deklarieren; nicht in einem Blattmodul
Und dort auch spätestens unterhalb von Option Explicit und nicht innerhalb von Subs und/oder Functions
b) anstelle von...

Dim NoEvent As Boolean
schreib mal

Public NoEvent As Boolean
Hilfts?
Wenn nein, zeig bitte per Upload eine Bsp-Datei.
Ciao
Thorsten
Anzeige
AW: Worksheet_Change nur einmal aufrufen
15.09.2021 21:37:18
SchubertFranzl
Hallo Hajo,
Dein Beitrag ist etwas rätselhaft. Du schreibst "Zu Beginn".
Zu welchem Beginn? Wo genau? Ich kann mir nicht vorstellen, dass das zur Antwort meiner Frage führt.
Hallo Thorsten,
Du schreibst
"du musst global geltende Variablen in einem allgemeinen Modul deklarieren; nicht in einem Blattmodul".
Warum muss ich das tun? Es funktioniert doch.
Die Zeile
If NoEvent Then Exit Sub
erkennt das gesetzte NoEvent und reagiert entsprechend. Und es erkennt auch, wenn zuvor "NoEvent = True" nicht ausgeführt wird.
Aber Du kannst es gerne in ein Modul setzen, Thorsten. Zur Lösung dieses Problems ist es nicht erforderlich. Da genügt, mein Makro in ein Blattmodul zu kopieren.
Weiters schreibst Du:
"Und dort auch spätestens unterhalb von Option Explicit und nicht innerhalb von Subs und/oder Functions".
Ja bitte, kopiere mein Makro in ein Blatt, unterhalb von Option Explicit. Die NoEvent-Deklaration steht vor Sub Vorbereitung, also außerhalb von allen Subs.
Weiters schreibst Du:
"Hilfts? Wenn nein, zeig bitte per Upload eine Bsp-Datei."
Was soll es helfen, wenn die NoEvent-Deklaration in einem Modul steht. Deswegen wird trotzdem das Worksheet_Change zweimal ausgeführt.
Außerdem gibt es Leute, die aus Sicherheitsüberlegungen keine Excel-Dateien runterladen. Daher habe ich das Makro hier hochgeladen.
Falls jemand Ideen hat, würde ich mich über Hilfe sehr freuen.
LG, Franz.
Anzeige
AW: Worksheet_Change nur einmal aufrufen
15.09.2021 21:53:39
Oberschlumpf
Tja Franz,
ich gehöre aber zu den Leuten, die sich durchaus trauen, Dateien aus dem Internet herunterzuladen - auch, und das besonders gern, Excel-Bsp-Dateien aus dem Forum herber.de
Aber ok, du willst keine Bsp-Datei per Upload zur Verfügung stellen. Das ist deine Entscheidung, und ich akzeptiere diese.
Aber ich mag nicht, ohne deine (Bsp-)Datei zu kennen, deine weiteren Fragen beantworten, da es für mich - weil ich ja die Datei inklu Daten + Code nicht kenne - nur Rätselraten ist. Hofftl akzeptierst du meine Entscheidung auch....
Ich wünsch dir weiter viel Erfolg!
Ciao
Thorsten
Anzeige
AW: Worksheet_Change nur einmal aufrufen
16.09.2021 06:15:50
ralf_b
Moin,
Hajo meinte das evtl. so.

Sub Vorbereitung()
Dim i As Long
Application.EnableEvents = False
NoEvent = True
Columns("C:C").Clear
Columns("C:C").Interior.Color = 65535
For i = 1 To 10
Range("C" & i) = i
Next i
NoEvent = False
Application.EnableEvents = True
End Sub
zum weiteren Problem mit der Farbänderung. du kannst deine Makro vielleicht etwas Logik beibringen aber von sich aus weis Excel oder der VBA nicht was als nächstes passiert. Du kannst einen globalen Zähler setzen für deine Targets oder/und mit dem Application.enableevents spielen.
Anzeige
AW: Worksheet_Change nur einmal aufrufen
16.09.2021 06:44:12
SchubertFranzl
Hallo ralf
ja, du könntest recht haben mit dem was Hajo meinen könnte. Ok, eine andere Möglichkeit, den Ereignistrigger abzufangen, betrifft aber nicht mein angesprochenes Problem. Denn die Vorbereitung soll ja nur eine Situation herstellen, in der das geschilderte Problem zu lösen ist.
Du beschreibst das Problem richtig:
VBA weiß nicht, was als nächstes passiert.
Allerdings ist ja schon alles passiert: Das Einfügen eines ausgeschnittenen Bereichs.
Ja, etwas Logik beibringen klingt gut. Hast Du vielleicht einen konkreten Vorschlag dazu? Wie meinst Du das mit einem globalen Zähler hier?
LG,
Franz
Anzeige
AW: Worksheet_Change nur einmal aufrufen
16.09.2021 07:23:11
ralf_b
tut mir leid, für die Uhrzeit ist mir das Textauseinanderpflücken und herumkorrigieren in dem was ich meinen könnte, too much.
application.undo ist vielleicht etwas, oder evtl., oder könnte, usw. was für dich sein.
globaler Zähler = public Variable, die die Änderungen an deinem Zellbereichen zählt.
AW: Worksheet_Change nur einmal aufrufen
16.09.2021 19:43:20
SchubertFranzl
Ich wollte nur genauer wissen, was Du meinst mit dem, was Du geschrieben hast.
Egal, ich habe die Lösung selbst gefunden: Das Change-Makro nur ausführen, wenn der Selection-Bereich der Target-Bereich ist. Denn das ist im ersten Durchlauf nicht und damit kommt es auch zu nur einem Farbwechsel.
Für alle, die es interessiert: Die einzufügende Zeile lautet
If Target.Address Selection.Address Then Exit Sub
LG,
Franz
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige