Datenüberprüfung nicht kompatibel mit Änd.datum?

Bild

Betrifft: Datenüberprüfung nicht kompatibel mit Änd.datum?
von: Jannik Manderla
Geschrieben am: 20.04.2015 15:14:04

Hallo,
ich habe hier folgendes Problem; ich habe in eine Tabelle eine Zusatzspalte eingebaut, die mit dem Makro im Hintergrund automatisch bei Änderungen in den anderen Zellen das aktuelle Datum dort hineinschreibt.

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Target.Row < 2 Then
Cells(Target.Row, "C").Value = Date
End If
End Sub

Jetzt habe ich aber in einer Spalte eine Datenüberprüfung und jedes Mal, wenn ich dort etwas auswähle, stürzt Excel ab.
Dazu habe ich auch ein kleines Beispiel mit meinem Code vorbereitet
https://www.herber.de/bbs/user/97178.xlsm
Wenn ich in Spalte A einen Eintrag ergänze, funktioniert alles super, sobald ich aber versuche, bei der Spalte B etwas auszuwählen, fliegt mir das gesamte Programm um die Ohren.
Wo liegt mein Fehler?
Grüße Jannik

Bild

Betrifft: Datenüberprüfung nicht kompatibel mit Änd.datum?
von: Klexy
Geschrieben am: 20.04.2015 15:26:00
Das Makro läuft im Kreis, weil mit dem Datumseintrag das Change-Event wieder eintritt und das Datum erneut eingetragen wird.
Du musst die Überprüfung der Spalte 3 ausschließen.

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Target.Row < 2 And Target.Column <> 3 Then
    Cells(Target.Row, "C").Value = Date
End If
End Sub
Hat nix mit der Datenüberprüfung ja/nein-Liste zu tun.

Bild

Betrifft: AW: Datenüberprüfung nicht kompatibel mit Änd.datum?
von: Luschi
Geschrieben am: 20.04.2015 21:24:23
Hallo Klexy,
Deine Begründung ist richtig, nur die Ausführung im Vba-Code nicht konsequent umgesetzt.
Hier meine Korrektur:


Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Row >= 2 Then
       Application.EnableEvents = False
          Cells(Target.Row, "C").Value = Date
       Application.EnableEvents = True
    End If
End Sub
Gruß von Luschi
aus klein-Paris
PS: wenn man per Vba-Code Werte in Zellen schreibt, muß man voher die Excel-Ereignis-Routinen aus- und anschließend wieder einschalten.

Bild

Betrifft: Datenüberprüfung nicht kompatibel mit Änd.datum?
von: Klexy
Geschrieben am: 21.04.2015 09:30:07
Wieder was dazugelernt.

Bild

Betrifft: AW: Datenüberprüfung nicht kompatibel mit Änd.dat
von: Jannik Manderla
Geschrieben am: 21.04.2015 14:05:42
Danke, eure Antworten haben mir gut geholfen.
Jetzt denke ich auch endlich diesen Befehl "EnableEvents" verstanden zu haben und habe beide Vorschläge in mein Makro mit aufgenommen.
Dabei habe ich den ersten Vorschlag mit Spalte 3 aber zweckentfremdet. Es geht mir darum, dass ich dort auch von Hand das Datum ändern kann und nicht beim Schreiben in der Zelle sofort wieder überschrieben werde.

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Row >= 2 And Target.Column <> 3 Then
       Application.EnableEvents = False
          Cells(Target.Row, "C").Value = Date
       Application.EnableEvents = True
    End If
End Sub


Bild

Betrifft: AW:Zellen löschen (Target is nothing ausschließen)
von: Jannik Manderla
Geschrieben am: 22.04.2015 13:13:53
Moin nochmal,
ich habe ein weiterführendes Problem mit dem Makro, das ich jetzt anwende.
Wie kann ich denn den Fall ausschließen, dass ich eine Zelle lösche?
Der Code:


Private Sub Worksheet_Change(ByVal Target As Range)
'If Target.Value = 0 Then Exit Sub
    If Target.Row >= 2 And Target.Column <> 3 Then
       Application.EnableEvents = False
          Cells(Target.Row, "C").Value = Date
       Application.EnableEvents = True
    End If
End Sub
Auch hierzu habe ich mein Beispiel ein wenig erweitert: https://www.herber.de/bbs/user/97229.xlsm
FALL 1: Ich möchte eine Zeile löschen, die sich über einer anderen befindet (hier Zeile 3). Rechtsklick auf die gesamte Zeile und "Zellen löschen". Nun wird bei der Zeile, die vorher 4 war (Datum = 1.1.2000) das Datum geändert, sodass dort das aktuelle steht. Da ich in der Zeile aber eigentlich nichts gemacht habe, soll sich natürlich auch nichts ändern!
FALL 2: Ich möchte die letzte Zeile löschen auch mit Rechtsklick "Zellen löschen". Nun hat die erste freie Zeile einen Datumseintrag, den ich von Hand löschen muss...
Also im Prinzip sind Fall 1 und 2 das Gleiche; die jeweils darunter liegende Zeile wird mit dem neuen Wert beschrieben...
Versucht habe ich bislang verschiedene Befehle, mit denen das Makro stoppt wie
"if target is nothing then exit sub" oder
"if target.value = 0 then exit sub"
Funktioniert leider beides nicht.
Es wäre nämlich ok, auch bei leeren Einträgen (quasi Zelle mit Inhalt löschen), das Datum nicht zu ändern/ das sub zu verlassen.
Welchen Code muss ich nun einfügen?

Bild

Betrifft: AW:Zellen löschen (Target is nothing ausschließen)
von: Jannik Manderla
Geschrieben am: 22.04.2015 14:34:54
habe vergessen, das Kontrollkästchen zu aktivieren...

Bild

Betrifft: AW:Zellen löschen (Target is nothing ausschließen)
von: Jannik Manderla
Geschrieben am: 22.04.2015 14:35:02
habe vergessen, das Kontrollkästchen zu aktivieren...

Bild

Betrifft: AW: Prüfen mit Namen
von: Daniel
Geschrieben am: 22.04.2015 15:08:07
Hi
als Workaround für das Erkennen, ob Zeilen gelöscht wurden, kannst du folgendes verwenden:
1. Erstelle einen Namen mit dem selektierten Zellbereich als Bezug im SelectionChange-Event.
2. Wenn du dann die selektierten Zeilen löscht, hat dieser Name keine Bezugszellen mehr und wird den Bezugsfehler enthalten.
Dies kannst du im Change-Event dann abfragen und daran erkennen, ob Zellen gelöscht wurden oder nicht.


Private Sub Worksheet_Change(ByVal Target As Range)
If ThisWorkbook.Names("Target").Value Like "*REF!" Then Exit Sub
    If Target.Row >= 2 And Target.Column <> 3 Then
       Application.EnableEvents = False
          Cells(Target.Row, "C").Value = Date
       Application.EnableEvents = True
    End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Target.Name = "Target"
End Sub
Gruß Daniel

Bild

Betrifft: AW: Prüfen mit Namen
von: Jannik Manderla
Geschrieben am: 22.04.2015 16:48:08
Aha! So läuft es!

Bild

Betrifft: AW: Prüfen mit Namen
von: Jannik Manderla
Geschrieben am: 22.04.2015 16:48:20
Aha! So läuft es!

Bild

Betrifft: Zeilen löschen bei Worksheet_Change
von: Klexy
Geschrieben am: 22.04.2015 16:40:36
Das geht, wenn du dein Target (Target.Address) überprüfst.
Wenn es eine Zelle ist, dann heißt es z.B. $A$23 - also vorne und hinten unterschiedlich.
Wenn es eine Zeile ist, dann heißt es z.B. $11:$11 - also vorne und hinten gleich.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Länge As Integer, Mitte As Integer, Adr As String, vorne As String, hinten As String
Adr = Target.Address
Länge = Len(Adr)
Mitte = InStr(2, Adr, "$")
vorne = Mid(Adr, 2, Mitte - 3)
hinten = Mid(Adr, Mitte + 1, Länge - Mitte)
  
    If Target.Row >= 2 And Target.Column <> 3 And vorne <> hinten Then
       Application.EnableEvents = False
          Cells(Target.Row, "C").Value = Date
       Application.EnableEvents = True
    End If
End Sub


 Bild

Beiträge aus den Excel-Beispielen zum Thema "wenn formel"