Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Anzeige
Inhaltsverzeichnis

Wenn Zellenwert verändert wurde, dann in Nachbarzelle "C"

Forumthread: Wenn Zellenwert verändert wurde, dann in Nachbarzelle "C"

Wenn Zellenwert verändert wurde, dann in Nachbarzelle "C"
12.12.2024 10:17:37
Viktor_L
Hallo ihr Lieben,
ich habe folgende Herausforderung vor mir.
In einem Tabellensheet soll überprüft werden ob sich in bestimmten Spalten der Zellenwert geändert hat.
Falls der Zellenwert sich verändert hat soll in der Nachbarzelle rechts ein "C" eingetragen werden (soll für "changed" stehen)
Ich habe euch eine Beispieldatei mit vorher und nachher zum Verständnis angehängt.
Der Bereich "Geändert" soll ist nur zur Darstellung gedacht

https://www.herber.de/bbs/user/174321.xls

Ich danke euch sehr für eure Expertise :-)
Liebe Grüße
Viktor
Anzeige

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Wenn Zellenwert verändert wurde, dann in Nachbarzelle "C"
12.12.2024 11:51:24
{Boris}
Hi,

erstmal als reine Antwort auf Deine Frage. Der Code orientiert sich an der rechten Nachbarzelle der (geänderten) Zelle: Wenn dort "OK" steht, wird entsprechend geprüft und ggfls. auf "C" geändert, andernfalls passiert nix. Der gesamte Code gehört in das Tabellenmodul 'Tabelle1'.

Option Explicit

Public oldValue As Variant

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo ERR_HANDLER
With Target
If .Count = 1 Then
If .Offset(0, 1) = "OK" Then
If .Value > oldValue Then
Application.EnableEvents = False
.Offset(0, 1) = "C"
End If
End If
End If
End With
ERR_HANDLER:
Application.EnableEvents = True
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
oldValue = Target(1, 1).Value
End Sub


Code prüft nur auf Einfacheingabe. Wenn mit Mehrfacheingabe gearbeitet wird, greift der Code nicht.

VG, Boris
Anzeige
AW: Wenn Zellenwert verändert wurde, dann in Nachbarzelle "C"
12.12.2024 12:41:32
Viktor_L
Hallo Boris,
vielen Dank für deine Antwort.
Es soll tatsächlich ohne auf OK zu prüfen reagiert werden:
Also wenn Wert in "C3" geändert wurde soll in "D3" "C" eingetragen werden.

Deine Aussage bzgl. Einfacheingabe verstehe ich nicht so ganz.
Die Vorgehensweise wäre:
Mehrere Personen haben Zugriff auf einer Tabelle und könnten wie im Beispiel dargestellt zB. in der Spalte "C", "I" und "M" die Werte (beliebig viele) verändern.
Das Skript (oder der Code) soll dabei die Änderungen live erkennen und in der Nachbarzelle den Wert auf "C" setzen und das fortlaufend bis die Tabelle geschlossen wurde.


Da ich nicht genau weiß, wie mächtig die EXCEL Programmierung ist wäre noch ein anderer Ansatz:
Mehrere Personen haben Zugriff auf einer Tabelle und könnten wie im Beispiel dargestellt zB. in der Spalte "C", "I" und "M" die Werte (beliebig viele) verändern.
Würden dann das Script / Code aktiv ausführen und dieses würde die Änderungen live erkennen und in der Nachbarzelle den Wert auf "C" setzen und das fortlaufend bis die Tabelle geschlossen wurde.

Liebe Grüße
Viktor
Anzeige
AW: Wenn Zellenwert verändert wurde, dann in Nachbarzelle "C"
12.12.2024 12:50:44
{Boris}
Hi,

der Code muss halt "wissen", wann er arbeiten soll. Bisher bin ich halt von dem "OK" in der Nachbarspalte ausgegangen. Jetzt kann man den natürlich auch auf fixe Zellbereiche beschränken, beispielsweise Deine Spalten C, I und M. Dann die Frage: Bezogen auf die gesamten Spalten oder nur einen bestimmten Zeilenbereich?
Das ist aber alles noch nicht ausgegoren. Jetzt ändert einer ne 3 in eine 4 - dann kommt rechts daneben ein "C". Was ist, wenn einer die 4 anschließend wieder in eine 3 ändert? Das wäre dann ja wieder der Ausgangszustand - aber den kennt Excel nicht mehr, weil der Wert bereits 1 mal geändert wurde.

Mit Mehrfacheingabe sind gleichzeitige Eingaben in mehreren Zellen gemeint. Also man markiert einen Bereich (nicht eine einzelne Zelle), gibt was ein und schließt die Eingabe mit Strg+Enter ab. Damit hat man dann viele Änderungen auf ein mal.

Long story short: Ich glaube, Du bist mit der Vorgehensweise nicht gut beraten - oder es ist zumindest noch nicht zu Ende gedacht.

VG, Boris
Anzeige
AW: Wenn Zellenwert verändert wurde, dann in Nachbarzelle "C"
12.12.2024 14:20:26
Viktor_L
Hi,
vielen Dank nochmals für deinen Support.

Mehrfacheingabe:
Ok jetzt habe ich es verstanden.
Nein jede Zelle hat einen eigenen Wert und dieses wird auch beachtet.
Also wird jede Zelle für sich alleine editiert.

Die Bearbeitung setzt etwas Intelligenz voraus.
Wenn der Wert bearbeitet wird, wie in deinem Beispiel von einer 3 auf eine 4 dann springt der wert in der Nachbarzelle auf ein "C".
Wenn die Person den Wert wieder zurück auf die 3 ändert dann sollte die Person den Wert in der Nachbarzelle auch wieder auf OK setzen.
Sobald eine Änderung erfolgte sollte ein C vermerkt werden.
Ansonsten müsste man ja mit einer kopierten Tabelle arbeiten und dann vergleichen usw... das würde ich jedoch gerne vermeiden.

Liebe Grüße
Viktor





Anzeige
AW: Wenn Zellenwert verändert wurde, dann in Nachbarzelle "C"
12.12.2024 14:27:26
daniel
"Ansonsten müsste man ja mit einer kopierten Tabelle arbeiten und dann vergleichen usw... das würde ich jedoch gerne vermeiden."

das wäre aber das einfachste und würde sogar ohne Code auskommen.
du hinterlegst auf einem zweiten Tabellenblatt in den jeweiligen Parallelzellen (gleiche Adresse) den Sollwert.
dann reicht beispielsweise in Zelle D2 die Formel: =Wenn(C2=Tabelle2!C2;"ok";"C")
die Formel kannst du dann in die anderen Zellen kopieren.

Gruß Daniel
Anzeige
AW: Wenn Zellenwert verändert wurde, dann in Nachbarzelle "C"
12.12.2024 14:32:35
Viktor_L
Ja aber so viel Intelligenz und Aufwand wird nun doch nicht erwartet :-)
Das wäre mein Ansatz ohne den Code.
Ich würde es doch gerne Intelligenter Lösen und dann mit einem Code arbeiten welcher diese Fehleranfälligkeit (Vergessen usw..) eliminiert.

Das wäre das Ziel und wäre super wenn man das so lösen könnte.

Liebe Grüße
Anzeige
AW: Wenn Zellenwert verändert wurde, dann in Nachbarzelle "C"
12.12.2024 14:58:56
{Boris}
Hi,

ich halte Deine Vorgehensweise nach wie vor nicht für wirklich gut, aber nun denn. Dieser Code springt bei jeder Änderung in den Spalten C, I und M an.

Option Explicit


Public oldValue As Variant

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo ERR_HANDLER
With Target
If Not Intersect(Target, Range("C:C,I:I:M:M")) Is Nothing Then
If .Count = 1 Then
If .Value > oldValue Then
Application.EnableEvents = False
.Offset(0, 1) = "C"
End If
End If
End If
End With
ERR_HANDLER:
Application.EnableEvents = True
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
oldValue = Target(1, 1).Value
End Sub


VG, Boris
Anzeige
Nachtrag:
12.12.2024 15:00:45
{Boris}
Der Code reagiert auch, wenn in eine LEERE Zelle in den Spalten C, I oder M eine Eingabe erfolgt. Falls das nicht sein soll, muss man das noch eben anpassen.

VG, Boris
AW: Wenn Zellenwert verändert wurde, dann in Nachbarzelle "C"
12.12.2024 16:17:38
Viktor_L
Hallo Boris,
woow vielen Dank es tut genau was es soll.
Das mit den Leeren Zeilen ist nicht tragisch.
Die Lösung mit dem

Eine Frage hätte ich noch wenn der Checkstart erst bei C2, I2, und M2 starten soll und bis ende der Spalte gehen soll wie definiert man das denn?
Bzw. geht das überhaupt?
Ich habe folgendes probiert aber das geht nicht.
If Not Intersect(Target, Range("C2:C,I2:I:M2:M")) Is Nothing Then


habe es dann so gelöst weil es für mich völlig ausreicht mehr als 5000 Einträge wird es in einer der Spalten nicht geben.

If Not Intersect(Target, Range("C2:C5000,I2:I5000:M2:M5000")) Is Nothing Then



Liebe Grüße
Anzeige
AW: Wenn Zellenwert verändert wurde, dann in Nachbarzelle "C"
12.12.2024 16:46:36
{Boris}
Hi,

Spaltenende ist in Deiner Version 1.048.576. Aber das brauchst Du ja gar nicht, somit belasse es bei 5000 (für die ganze Spalte müsstest Du nur 5000 gegen 1048576 austauschen).

Wenn leere Zelle nicht berücksichtig werden sollen, dann ergänze diese Zeile wie folgt:

If .Value > oldValue And oldValue >"" Then

VG, Boris
Anzeige
AW: Wenn Zellenwert verändert wurde, dann in Nachbarzelle "C"
16.12.2024 09:35:07
Viktor_L
Guten Morgen Boris,

Vielen Dank die Zeile werde ich sicherlich gut anwenden können.
Ich bin ja noch im Aufbau.

Was meine letzte Frage wäre:
Wenn in der erwähnten Nachbarspalte die Zellen eine "DropDown-Auswahlliste" wäre wie würde man dann das "C" für changed setzen?
Voaraussetzung ist "C" für changed wäre natürlich in der DropDown Liste definiert und würde sich an der 2ten Position befinden
OK
C

If .Value > oldValue Then

Application.EnableEvents = False
.Offset(0, 1) = "C"
End If



Vielen Dank und Liebe Grüße
Viktor
Anzeige
Ich versteh die Frage nicht...
16.12.2024 21:48:44
{Boris}
Hi,

der Code schreibt doch in dem Fall ein "C" in die Nachbarspalte - völlig egal, ob da ne Dropdownliste existiert oder nicht, und auch völlig egal, ob "C" in der Dropdownliste überhaupt vorkommt (die Datenüberprüfung greift nicht, wenn per VBA Werte in Zellen eingetragen werden).
Worum genau geht es Dir noch?

VG, Boris
Anzeige
AW: Ich versteh die Frage nicht...
17.12.2024 10:59:53
Viktor_L
Guten Morgen Boris,

ich muss mich entschuldigen. Anscheinend hatte es nichts mit der DropDown Auswahl zu tun.
Ich hatte die Bereiche für den Check etwas ausgeweitet und zusätzlich noch die DropDown Auswahl hinzugefügt.
Option Explicit


Public oldValue As Variant

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo ERR_HANDLER
With Target
If Not Intersect(Target, Range( _
"L3:L5000,N3:N5000,P3:P5000,R2:R5000,T3:T5000,V3:V5000,X3:X5000,Z3:Z5000," & _
"AB3:AB5000,AD3:AD5000,AF3:AF5000,AH3:AH5000,AJ3:AJ5000,AL3:AL5000,AN3:AN5000,AP3:AP5000,AR3:AR5000,AT3:AT5000,AV3:AV5000,AX3:AX5000," & _
"BB3:BB5000,BD3:BD5000,BF3:BF5000,BH3:BH5000,BJ3:BJ5000,BL3:BL5000,BN3:BN5000,BP3:BP5000,BR3:BR5000,BT3:BT5000,BV3:BV5000,BX3:BX5000," & _
"CB3:CB5000,CD3:CD5000,CF3:CF5000,CH3:CH5000,CJ3:CJ5000,CL3:CL5000,CN3:CN5000,CP3:CP5000,CR3:CR5000,CT3:CT5000,CV3:CV5000,CX3:CX5000," & _
"DB3:DB5000,DD3:DD5000,DF3:DF5000,DH3:DH5000,DJ3:DJ5000,DL3:DL5000,DN3:DN5000,DP3:DP5000,DR3:DR5000,DT3:DT5000,DV3:DV5000,DX3:DX5000," & _
"EB3:EB5000,ED3:ED5000,EF3:EF5000,EH3:EH5000,EJ3:EJ5000" _
)) Is Nothing Then
If .Count = 1 Then
If .Value > oldValue Then
Application.EnableEvents = False
.Offset(0, 1) = "c"
End If
End If
End If
End With
ERR_HANDLER:
Application.EnableEvents = True
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
oldValue = Target(1, 1).Value
End Sub


Leider hat das schreiben "c" dann nicht mehr funktioniert. Deswegen hatte ich die Vermutung auf das DropDown gelegt.
Wenn ich jedoch den check Bereich abspecke funktioniert das ganze.
Option Explicit


Public oldValue As Variant

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo ERR_HANDLER
With Target
If Not Intersect(Target, Range("L3:L5000")) Is Nothing Then
If .Count = 1 Then
If .Value > oldValue Then
Application.EnableEvents = False
.Offset(0, 1) = "c"
End If
End If
End If
End With
ERR_HANDLER:
Application.EnableEvents = True
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
oldValue = Target(1, 1).Value
End Sub


Wo ist denn der Fehler im ersten Code?

Danke
Liebe Grüße
Anzeige
Stringlängenbegrenzung
17.12.2024 11:38:40
{Boris}
Hi,

die Stringlänge für Range ist auf 256 Zeichen beschränkt - die überschreitest Du aber deutlich.
Allerdings sieht es ja so aus, dass es um jede 2. Spalte geht - beginnend bei L im Zeilenbereich 3 bis 5000.

Dann kann man den Code deutlich vereinfachen, indem man den gesamten Bereich mit Intersect prüft und zusätzlich prüft, ob die Division der Spaltennummer mit 2 einen Rest von Null ergibt (L = Spalte 12, N = Spalte 14 etc. - und Division durch 2 ergibt Rest Null):

Option Explicit


Public oldValue As Variant

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo ERR_HANDLER
With Target
If Not Intersect(Target, Range("L3:EJ5000")) Is Nothing And .Column Mod 2 = 0 Then
If .Count = 1 Then
If .Value > oldValue Then
Application.EnableEvents = False
.Offset(0, 1) = "c"
End If
End If
End If
End With
ERR_HANDLER:
Application.EnableEvents = True
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
oldValue = Target(1, 1).Value
End Sub


VG, Boris
Anzeige
AW: Stringlängenbegrenzung
17.12.2024 12:02:55
Viktor_L
Hallo Boris,
Vielen Dank somit funktioniert nun alles :-)

Liebe Grüße
Viktor
Anzeige
Anzeige
Live-Forum - Die aktuellen Beiträge
Datum
Titel
14.05.2026 13:31:09
14.05.2026 09:50:42
13.05.2026 19:14:18