Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1848to1852
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

Nur Wenn Zell X, dann Zelle Y = Zelle Z

Nur Wenn Zell X, dann Zelle Y = Zelle Z
27.09.2021 22:27:45
LeoMun
Hallo zusammen,
ich habe mir bereits sehr viele Beiträge zum Thema durchgelesen, aber ich finde keine funktionierende Lösung.
Es geht um einen Aufgabentracker.
Zu beginn wird in der Spalte E das jeweilige Level angegeben "0", "1", "2" oder "3" ein.
Dies wird dann in den Spalten A-D mit Formeln entsprechend dargestellt und nummeriert.
In Spalt I gibt an, wann die Aufgabe beginnt und in Spalte K wie lange diese dauert.
Die Formel in Spalte J gibt dann entweder das Datum der jeweiligen Aufgabe zurück (Level = 3) oder gibt das frühste Datum der jeweiligen Gruppe an (Level = 0, 1, 2).
So ist der 27.04.2021 das frühste Startdatum der Gruppe 1.1 in der Beispieldatei.
Nun soll der berechnete Wert auf J in die Spalte I übernommen werden, wenn das Level 0, 1 oder 2 ist. Spalte J wird dann im Nachgang ausgeblendet.
Bei Level 3 soll der händisch in Spalte I eingetragene Wert erhalten bleiben.
Später allerdings nur im Bereich ab Zeile 14, in der Beispieldatei habe ich die oberen Zeilen mit "Blalba" nur entfernt.
Sinn des Makros ist, dass wenn in Spalte E eine "3" steht, der Wert in Spalte I händisch eingetragen wird, bei "0", "1" und "2" soll der Wert aus Spalte J übernommen werden.
Ich habe jetzt ein entsprechendes Makro zusammen, aber das läuft extrem langsam... daher habe ich die Berechnung schon eingeschränkt, aber es dauert bei nur 100 Zeilen teilweise mehrere Sekunden bis das aktualisiert wurde. Ich glaube mir fehlt irgendwie ein entsprechender Stopp der Schleife.
Folgende Anpassung hat zwar ein geringe Verbesserung gebracht, wenn das Makro ausgeführt wurde (Spalte I), aber dafür gab es dann Dauerwartezeiten :(

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
die Aktualisierung der Ansicht und die Neuberechnung der Zellen ausschalten.
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Call Calculate
Makro

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Range("I13:I100")) Is Nothing Then
Dim c As Range
lz = 100 'Cells(Rows.Count, 1).End(xlUp).Row
For Each c In Range("E13:E" & lz).Cells
If c.Value Like "2" Or c.Value Like "1" Or c.Value Like "0" And c.Offset(0, 5).Value > "1" Then
c.Offset(0, 4).Value = c.Offset(0, 5).Value
End If
Next c
End Sub
Beispiel:
https://www.herber.de/bbs/user/148299.xlsm
Was mache ich beim Marko falsch? Oder liegt die Trägheit an den ganzen Formeln?
Es gibt mehrere Beiträge, die ähnliche Themen behandeln, aber ich habe leider keinen gefunden der das so macht :(
Falls es doch einen gibt, den ich übersehen habe, sehr gerne verlinken.
Vielen Dank im Voraus für jeden Input und einen wunderschönen Abend.
Leo

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Nur Wenn Zell X, dann Zelle Y = Zelle Z
27.09.2021 22:37:10
{Boris}
Hi,
weshalb muss das Makro denn ausgeführt werden, sobald man eine Zelle (in den angegebenen Bereichen) selektiert? Was kann da in der Zwischenzeit passiert sein, das eine Ausführung notwendig macht?
VG, Boris
AW: Nur Wenn Zell X, dann Zelle Y = Zelle Z
28.09.2021 08:48:33
LeoMun
Hallo!
Vielen Danke für die schnelle Rückmeldung!
Meinst du bezüglich

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
?
Wenn ich dies in

Private Sub Worksheet_Change(ByVal Target As Range)
ändere hängt es nach der ersten Berechnung :(
Oder wie müsste das richtig heißen?
Vielen Dank im Voraus und viele Grüße
Leo
Anzeige
AW: Nur Wenn Zell X, dann Zelle Y = Zelle Z
28.09.2021 09:16:30
MCO
Moin!
Target ist schon richtig.
Es erscheint mir aber unlogisch, alle Zeilen neu zu berechnen, wenn du nur 1 Wert änderst...
Also wäre es aus meiner Sicht besser, nur 1 Zeile zu behandeln.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim c As Range
If Not Application.Intersect(Target, Range("I13:I100")) Is Nothing Then
If Target.value  1 Then 'ich vermute es handelt sich um Zahlen, nicht um Text
c.Offset(0, 4).value = c.Offset(0, 5).value
End If
End If
End Sub
Auch die beiden verschachtelten IF-Bedingungen kann man noch in 1 Zeile packen....
Gruß, MCO
Anzeige
Aber doch nicht Selection_Change...
28.09.2021 09:17:34
{Boris}
Hi,
...sondern "nur" Change.
VG, Boris
AW: Aber doch nicht Selection_Change...
28.09.2021 10:31:01
LeoMun
Hallo MCO,
vielen Dank für den Input, ich habe das probiert, aber leider klappt das bei mir nicht.
Ich trage in Spalte I mein Datum ein, dann müsste das Makro prüfen, ob der Wert in E Das

"Target.value 
weiß, dass es in Spalte I sein soll, da hier

"Application.Intersect(Target, Range("I13:I100"))"
die Range entsprechend definiert wurde, oder ?
Mit der "einen Zeile" habe ich mir auch schon gedacht, allerdings war ich mir unsicher wie Worksheet_SelectionChange bzw. Worksheet_Change hier Änderungen interpretiert. Wenn ich z. B. in I15 Werte eintrage, ändert sich nicht nur J15 sondern ggf. noch J13, J14 usw.
Werden diese geänderten (berechneten) ebenfalls als Veränderung interpretiert? Muss ich dann ggf.

"Application.Intersect(Target, Range("I13:J100"))"
eintragen?
Vielen Dank im Voraus und viele Grüße
Leo
Anzeige
Du hast völlig Recht, Boris...
28.09.2021 12:26:08
MCO
das kommt davon, wenn man nicht alles testet und den Fokus nicht weit genug gesetzt hat...
Gruß, MCO
AW: Nur Wenn Zell X, dann Zelle Y = Zelle Z
28.09.2021 09:16:31
{Boris}
Hi,
das Selection_Change-Ereignis reagiert auf jede Änderung der Selektierung. Das Change-Ereignis hingegen reagiert auf eine konkrete Zelländerung.
Dann klappert man - in Deinem Fall - auch nicht einen gesamten Bereich ab, sondern "bearbeitet" nur den Teil, der durch die konkrete Zellveränderung betroffen ist.
Ich lass mal offen, da ich jetzt erstmal abwesend bin.
VG; Boris
AW: Nur Wenn Zell X, dann Zelle Y = Zelle Z
28.09.2021 09:21:40
Werner
Hallo,
dein Code in deiner geposteten Datei passt aber mal gar nicht zu deiner Tabelle.

If Not Application.Intersect(Target, Range("N13:N100")) Is Nothing Then
Hier sprichst du den Bereich N13 bis N100 an. In deiner Beispieldatei gibt es aber die Spalte N überhaupt nicht.
Dann hast du hier einen Spalten Offset auf die Spalte E drin

e.Offset(0, 9).Value = e.Offset(0, 10).Value
Ausgehend von Spalte E wäre Offset(0, 9) die Spalte N, die es nicht gibt und Offset(0, 10) ware die Spalte O, die es auch nicht gibt.
Gruß Werner
Anzeige
AW: Nur Wenn Zell X, dann Zelle Y = Zelle Z
28.09.2021 10:04:40
LeoMun
Hallo Werner,
sehr berechtigter Einwand, das liegt daran, dass es in der Originaldatei noch mit ein paar Spalten (N, O, usw.) weiter geht.
Ich habe es aus Gründen der Übersichtlichkeit in der Beispieldatei rausgenommen, aber vergessen das Makro entsprechend anzupassen.
Sorry!
Vielen Dank für den Hinweis und viele Grüße
Leo
AW: Nur Wenn Zell X, dann Zelle Y = Zelle Z
28.09.2021 10:38:27
Werner
Hallo,
dann poste die Datei, die auch dem Original entspricht.
Und welche Spalten sollen auf Eingaben überwacht werden?
Gruß Werner
AW: Nur Wenn Zell X, dann Zelle Y = Zelle Z
28.09.2021 10:56:50
LeoMun
Hallo Werner,
die entsprechende Datei findest du hier: https://www.herber.de/bbs/user/148310.xlsm
Zum Thema Überwachung, hier bin ich mir unsicher ob nur die Spalte überwacht werden muss, in die ich händisch Werte eintrage, oder auch die Spalte in der Werte berechnet werden, siehe dazu: https://www.herber.de/forum/messages/1849452.html
Das gleiche Spiel wie in Spalte I und J habe ich noch in Spalte K (händisch eintragen) und L (zu kopierender Wert) und nochmal in Spalte N (händisch eintragen) und O (zu kopierender Wert).
Vielen Dank dir und viele Grüße
Leo
Anzeige
AW: Nur Wenn Zell X, dann Zelle Y = Zelle Z
28.09.2021 11:27:46
Werner
Hallo,
meinst du so?

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Ausgang
If Target.CountLarge = 1 Then
Select Case Target.Column
Case 9, 11, 14
Select Case Cells(Target.Row, "E")
Case 0, 1, 2
Application.EnableEvents = False
Target = Target.Offset(, 1)
Case Else
End Select
Case Else
End Select
End If
Ausgang:
On Error GoTo -1
Application.EnableEvents = True
End Sub
Gruß Werner
AW: Nur Wenn Zell X, dann Zelle Y = Zelle Z
28.09.2021 12:15:56
LeoMun
Hallo Werner,
vielen Dank für deine schnellen Antworten! :)
Wow - das ist wirklich simpel und funktioniert - eigentlich - auch.
Wenn ich in I ein Wert eintrage, ändern sich allerdings in J mehrere Zeilen (also I17 wird geändert -> J17, J15 und J14 berechnen sich neu).
Dann müssten auch die Werte J14 nach I14 und J15 und I15 kopiert werden, obwohl ich eigentlich nur in I17 was geändert habe.
Du hast mich aber auf eine Idee gebracht, vielleicht wäre es sogar noch einfacher.
Sobald in der Spalte J, L oder N ein Wert neu berechnet wird, soll dieser Wert in die Spalte I, K bzw. N kopiert werden.
Hier könnte es zu einer Endlosschleife kommen, da die Formel in Spalte J teilweise den Wert aus I wiedergibt

wenns( xyz ; [@Lvl]=3;[@Start]) -> wenns( xyz ;E=3;I)
.
Ich kann es leider nicht testen, da mir der Code bezüglich der Veränderung unklar ist :(
Sonst müsste man auch dies in Abhängigkeit von Spalte E machen (wenn hier Wert 0, 1, 2).
Was meinst du?
Vielen Dank und viele Grüße
Leo
Anzeige

307 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige