Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1644to1648
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 Event

Worksheet-Change Event
21.09.2018 19:23:41
JohnM.
Hallo liebe community,
ich habe ein kleines Excel-Problem bei dem ich nicht weiterkomme.
Zum Sachverhalt:
In den Zellen A1 bis A10 können jeweils Kontonummern eingetragen werden und die dazugehörigen Geldbeträge werden dann von A11 bis A21 wiedergegeben. Ich möchte nun erreichen, dass sobald eine Kontonummer eingegeben wird, im unteren Bereich ab A11 der Wert zunächst auf "0€" gesetzt wird, da der Wert im Anschluss geändert werden soll. Sprich wenn ich in A1 eine Kontonummer eingebe, soll in A11 "0€" erscheinen und wenn in A2 eine Kontonummer eingegeben wird, soll in A12 "0€" erscheinen und so weiter.
Im Anschluss soll der Benutzer in der Lage sein, die "0€" problemlos zu ändern, ohne dass dabei ein Loop entsteht.
Das Problem lässt sich wahrscheinlich über das Event Worksheet-Change lösen.
Nur lässt sich die Application.EnableEvent nicht mehr auf true stellen, sobald ich diese im Code auf false stelle um loops zu vermeiden.
Über Hilfe jeglicher Art wäre ich sehr dankbar!
Vielen lieben Dank im Voraus.
JohnM.

25
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Worksheet-Change Event
21.09.2018 19:32:59
onur
Das genügt:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim z, s
z = Target.Row
s = Target.Column
If s  1 Or z > 10 Then Exit Sub
Cells(z + 10, s) = 0
End Sub

AW: Worksheet-Change Event
21.09.2018 19:39:23
Hajo_Zi
es fehlt
Application.EnableEvents =False
Application.EnableEvents =True

Beiträge von Werner, Luc, robert, J.O.Maximo und folgende lese ich nicht.
AW: Worksheet-Change Event
21.09.2018 20:04:20
JohnM
Vielen Dank schonmal, doch leider klappt der Code noch nicht so richtig. Hier werden ja auch nicht die entsprechenden Zeilen angegeben, oder mache ich etwas falsch?
Anzeige
AW: Worksheet-Change Event
21.09.2018 20:10:07
onur
EINFACH EINFÜGEN UND TESTEN.
AW: Worksheet-Change Event
21.09.2018 20:09:17
onur
WOZU?
das Makro reagiert nur auf Zeile 1-10 und Spalte 1.
AW: Worksheet-Change Event
21.09.2018 20:25:38
Hajo_Zi
und es wird nochmal ausgelöst, da eine andere Zelle geändert wird.
Gruß Hajo
AW: Worksheet-Change Event
21.09.2018 20:35:00
onur
Und springt sofort wieder raus, wenn nicht Zeile 1-10 Spalte1 betroffen ist.
Schliesslich wird das Event IMMER auisgelöst, wenn IRGEND EINE Zelle ausgelöst wird.
Das Makro kann sich aber nicht selber aufrufen, da es nur auf Zeile 1-10 und Spalte 1 reagiert aber dann nur Zeile 11-20 und Spalte 1 verändert.
Wenn DAS der Fall wäre, wäre
Application.EnableEvents =False
Application.EnableEvents =True
unbedingt erforderlich.
Gruß
Onur
Anzeige
Weil das schlechter Programmierstil ist
21.09.2018 20:30:28
EtoPHG
onur,
Bei jeder manueller oder VBA Änderung wird das _Change Ereignis angestossen, ausser die Events sind abgeschaltet. Also sollte man einen rekursiven Aufruf durch den Ereigniscode selbst verhindern. Diesen rekursiven Aufruf kannst mit Deinem Code einfach mit F8 (Step-Debugging) testen! Zudem werden in deinem Code völlig unnötige Variablen gesetzt, die dann erst in der If-Bedingung hinfällig werden.
Hier mein Vorschlag (ohne rekursiven Aufruf und auch der Verarbeitung durch gleichzeitige Änderungen mehrerer Zellen im Überwachungsbereich, z.B. durch eine Copy-Paste Aktion):
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rCell As Range
If Not Intersect(Target, Range("A1:A10")) Is Nothing Then
Application.EnableEvents = False
For Each rCell In Intersect(Target, Range("A1:A10"))
rCell.Offset(10) = 0
Next rCell
Application.EnableEvents = True
End If
End Sub
Gruess Hansueli
Anzeige
AW: Weil das schlechter Programmierstil ist
21.09.2018 22:11:48
onur
Hallo Hansueli,
Mit den überflüssigen Variablen hast du insofern schon Recht, ich hätte auch statt z und s direkt Target.Row und Target.Column nehmen können, aber das sind doch nur Nanosekunden an Rechenzeit.
Ebenso ist es besser, mit "For Each" und "Intersect" zu arbeiten, da ja der User einen ganzen Block einfügen könnte.
Aber "Application.EnableEvents = False" finde ich immer noch überflüssig, da der Code sich nicht selbst aufrufen kann, da jede vom Makro getätigte Änderung zwar, wie jede Zelländerung, das Event auslöst, aber durch das "IF .." sofort wieder den Code verlässt, weil die geänderte Zelle nicht den Bedingungen entspricht.
Ich habe mal aus Jux deinen und meinen Code getestet und 250.000 Änderungen in A1 generiert.
Deiner braucht dafür 28,46 sec und mein erster Code 21,79 sec.
Dieser (umgeschrieben für multiple Änderungen):
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell
For Each cell In Target
If cell.Column  1 Or cell.Row > 10 Then Exit Sub
Cells(cell.Row + 10, cell.Column) = 0
Next
End Sub

braucht 23,6 sec.
Wenn der Code durch das Aus- und Wiedereinschalten der Events nicht schneller läuft, als mit eingeschalteten Events , macht es keinen Sinn, sie abzuschalten, auch wenn dies der Lehrbuchmeinung widerspricht oder in deinen Augen schlechter Programmierstil sein mag.
Gruß
Onur
Anzeige
AW: Weil das schlechter Programmierstil ist
22.09.2018 00:07:55
Sulprobil
Und ich dachte, der Worksheet Change Event an sich ist der schlechte Programmierstil :-)
SCNR,
Bernd
AW: Weil das schlechter Programmierstil ist
22.09.2018 09:01:26
Luschi
Hallo Onur,
wenn Du das so siehst, dann wünsche ich Dir viel Spaß beim nächsten LZF-28 (Nicht genügend Stapelspeicher).
In der Programmierung geht es doch nicht darum, für bestimmte Spezialfälle die Einstellung auf ON oder OFF zu schalten, sondern einem gewissen Schema zu folgen.
In den höheren Programmiersprachen nennt man dies PATTERN und sind Richtlinien/Empfehlungen, die man schon einhalten sollte.
Wer in Vba einen Zellwert ändert und dabei nicht mit 'Application.EnableEvents = False' arbeitet, handelt auf eigene Gefahr.
Gruß von Luschi
aus klein-Paris
Anzeige
AW: Weil das schlechter Programmierstil ist
22.09.2018 15:08:30
onur
Hi Luschi,
Ich sehe das nur in diesem einen Fall so.
Wenn auch nur die kleinste Gefahr bestünde, daß DIESES MAKRO (für diesen einen Fall) eine "Rückkopplung" generiert, weil durch das Makro Zellen verändert werden könnten, auf die das Makro reagieren soll, hätte ich natürlich die Events abgeschaltet.
Und ich habe nie behauptet, dass dieser Code für ALLE Worksheet_Change_Events gültig ist.
Wie gesagt, ich habe das Makro bis zu 1.000.000 in einer Schleife aufgerufen, ohne daß ich IRGEND eine Fehlermeldung erhielt.
Etwas zu machen, nur weil es so üblich ist, ohne zu verstehen, warum man es so machen sollte, ist nicht so mein Ding.
Ich habe auch schon hier Kritik von "Experten" einstecken müssen, weil ich schrieb:
If a >

Reaktion: "Der Code wird nich funktionieren, das ist völlig falsch, das muss so heissen:"
If a  b Then

Was mir nur gezeigt hat, daß manche Leute anscheinend keine Ahnung haben, daß es dem Editor völlig Latte ist, ob ich "" oder ">".
Sie machen es halt so, wie sie es so gelernt zu haben, es ist eben in Stein gemeisselt.
Gruß
Onur
Anzeige
Eigentlich wollte ich schweigen und...
22.09.2018 13:19:35
EtoPHG
mich nicht mehr zu deiner erneuten Verteidung deines Codes äussern, Onur.
Sie erinnert mich zu stark an das geflügelte Wort "Mancher Leute Horizont beschränkt sich auf einen Punkt und das nennen sie dann ihren Standpunkt!".
Mit dem Zitat: "..., da der Code sich nicht selbst aufrufen kann,..."
beweist du, dass du weder Rekursivität noch Event-Triggering verstehst.
Es hat niemand ausser Dir behauptet: "Der Code ruft sich selber auf!".
Du darfst ruhig so weiter machen, was ich bedaure ist die Tatsache, dass damit den Anfragern Code mitgegeben wird, der gerade mal für den Spezialfall funktioniert. Aber, wie du selbst schreibst "Wenn DAS der Fall wäre, wäre (code) unbedingt erforderlich." lässt Du die Empfänger in eine Falle laufen. Sie werden sich kaum an diese Diskussion erinnern und bei der
nächsten Anwendung deine Schemas plötzlich mit Laufzeitfehlern konfrontiert. Dann kann das Karussell wieder von Vorne beginnen ;-)
Gruess Hansueli
Anzeige
AW: Eigentlich wollte ich schweigen und...
22.09.2018 14:39:17
onur
Dass du wieder dein wahres Niveau zeigst, und assozial und beleidigend wirst, hätte ich eigentlich schon bei deinem letzten Beitrag erwartet und hatte mich gewundert, warum du plötzlich "freundlich" bist.
Aber offensichtlich bist du ja ein Excel-Gott, dessen Wort Gesetz ist und du bist der Einzige, der so "komplizierte" Begriffe wie Event-Triggerung und "rekursiv" versteht und glaubst wahrscheinlich, mit einem IQ von 120 wäre man ein Genie.
Wahrscheinlich würdest du in der obigen Datei auch noch im ganzen Code stur alle Zeilen heraussuchen, die in Zellen schreiben, die nicht zwischen A1 und A10 liegen, und eine Zeile vorher die Events abschalten und danach wieder einschalten, damit sie bloss kein Change_Event auslösen, weil: Du hast es ja so gelernt.
Wie du eigentlich wissen solltest, sind die Codes, die man hier postet, NUR FÜR DIESEN EINEN FALL gedacht, und nicht allgemein für alle Worksheet_Change_Events, das hat hier keiner behauptet.
Danke, daß ich so weiter machen DARF, zu gütig von Euer Gnaden.
Ich wäre Dir dankbar, wenn du mich in Zukunft in Ruhe lassen könntest mit deinen Standpunkten.
Wenn du schon zitierst, dann bitte richtig:
Der Horizont vieler Menschen ist wie ein Kreis mit Radius Null. Und das nennen sie dann ihren Standpunkt (Albert Einstein)
Er sagte ebenfalls:
Wenn einer mit Vergnügen zu einer Musik in Reih und Glied marschieren kann, dann hat er sein großes Gehirn nur aus Irrtum bekommen, da für ihn das Rückenmark schon völlig genügen würde.
Geniale Menschen sind selten ordentlich, Ordentliche selten genial.
Es ist schwieriger, eine vorgefaßte Meinung zu zertrümmern als ein Atom.
Gruß
Onur
Anzeige
Ich habe nur Dich zitiert und schreibe keine...
22.09.2018 16:34:25
EtoPHG
nicht belegten Zitate irgendjemandem zu, schon gar nicht Albert.
"...und wovon man nicht reden kann, darüber muß man schweigen." Ludwig Wittgenstein
Dein 'Du hast es ja so gelernt', ...
22.09.2018 18:48:24
Luc:-?
…onur,
impliziert, dass es sich hier um erlesenes, gelehrtes, „traditionsrituelles“ bzw sonstiges, nicht eigenständig erworbenes Wissen handeln würde. Das träfe weder auf Hansueli (höchstwahrscheinlich) noch auf mich und auf viele Andere sicher ebenfalls nicht zu. Ich hatte das Privileg, schon sehr frühzeitig erfahren zu dürfen, was passieren kann, wenn man derartige Basics nicht beachtet. Wer aber bisher überall mit Simplem durchgekommen ist, wird wohl kaum die Notwendigkeit einsehen, sorgfältig zu arbeiten, auch, wenn es sich nur um eine überschaubare Angelegenheit handelt. Hier geht's nämlich auch um Gewohnheits­bildung, gerade auch bei Anfängern.
Und A.E. meint im ihm zugeschriebenen Zitat garantiert Triviales, denn Dynamik, also auch und gerade Leben erzeugt stets Unord­nung. D.h. aber nicht, dass das eine allgemeine Vorbedingung für Genialität wäre, denn die kommt ohne eine gewisse Ordnung nun mal nicht aus, will sie nicht wertvolle Zeit für Trivialitäten verschwenden. Und die liegt eher im sich im Ergebnis dokumentie­ren­den „geistigen Betriebs­system“ als in reinen Äußerlichkeiten. Nur sehr routinierte Schnelldenker und -macher leisten es sich (häufi­ger), viele Umwege zu gehen und damit letztlich vieles mehrfach zu tuen. Aber Routine impliziert nun mal nicht Genialität… :-]
Ansonsten ärgert es mich gelegentlich schon, dass gezeigtes Sinnvolles nicht übernommen und damit zum Allgemein­gut wird, son­dern immer wieder (gern) quasi bei Null begonnen wird…
Gruß, Luc :-?
Anzeige
vermittelnd:
24.09.2018 09:56:56
lupo1
Auch ich finde es schön, wenn eine einzige Zeile Event-Code ohne Deklarationen, Sicherheits- und Fehlerbehandlungen ausreicht.
Onur hat recht, wenn er die (häufige) Nichtübertragbarkeit von Antworten anspricht.
Zum Glück gibt es genug sauberen, allgemein übertragbaren Code von vielen Seiten, so dass Anfänger sich auch daran halten können.
Und lernen tut man bekanntlich gut an kurzen, nicht ausreichenden Beispielen für sein eigenes Programmierverhalten.
Bei Tabellen-Formeln tendiere ich auch zu der möglichst einheitlichen Schreibweise, obwohl es dort weniger nötig erscheint.
AW: 6,5/250.000tel Sek. ist doch enorm! m.T.
22.09.2018 17:14:39
Gerd
Hallo, macht weiter so! Luc ist z.Z. nicht da. Da fehlt das Gequatsche.:-)
Gruß Gerd
jez is er da! ;-) (owT)
22.09.2018 17:53:58
EtoPHG

...Und hat d.Despektierlichkeit wohl bemerkt! owT
22.09.2018 18:54:14
Luc:-?
:-?
was unter Männern despektierlich wirkt,
24.09.2018 09:16:57
lupo1
sehen Frauen ganz anders ;)
Oller Sexist... ;-) Gruß owT
24.09.2018 15:29:30
Luc:-?
:-?
Betonung der wenigen Unterschiede
24.09.2018 16:28:15
lupo1
unserer Unisex-Welt.
:-)
AW: Worksheet-Change Event
21.09.2018 20:54:39
Gerd
Hallo,
es fehlt noch der Hinweis,dass das Währungformat über das Zahlenformat für A11-A20 eingestellt werden kann und man Plausibilitäten für die Kontonummern im Code oder mittels der Datenüberprüfung einstellen könnte.
Gruß Gerd
AW: Worksheet-Change Event
21.09.2018 22:09:36
JohnM.
wow, es klappt wunderbar. Vielen Dank. Ihr seid klasse :)

105 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige