Wenn "Ja" erfüllt ist, Datum automatisch einsetzen lassen und einfrieren?
Moin!
Meine Frage:
Wie lautet der VBA-Code, wenn ich in Spalte S (Besetzte Zellen: S9:S157) "Ja" schreibe, soll in Spalte U in der jeweiligen Zeile das aktuelle Datum automatisch eingesetzt werden und eingefriert werden ohne das es sich am nächsten Tag aktualisiert. Wenn ich eine Zelle in Spalte S die Zelle freilasse, soll in Spalte U automatisch "Nein" erscheinen.
Danke schonmal im Voraus!
Gruß
Luka
2 Antworten
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("S9:S157")) Is Nothing And _ Target.Count = 1 Then If Target.Value = "Ja" Then Target.Offset(0, 2).Value = Date If IsEmpty(Target) Then Target.Offset(0, 2).Value = "Nein" End If End Sub
Statt Date solltest du die Tabellenblatt-Funktion DATUM verwenden. Das sieht dann so aus:
Target.Offset(0, 2).Formula = "=DATE(YEAR(TODAY()),MONTH(TODAY()),DAY(TODAY()))"
Die Formel wird tatsächlich in die Zelle eingetragen.
Aber eben nur in die Zielzelle, die auch wieder mit "Nein" überschrieben wird, wenn das "Ja" in Spalte S verändert wird.
Du könntest die Funktion auch direkt in die Spalte U eintragen und um die WENN-Funktion ergänzen.
Formel für U1:
=WENN(BEREICH.VERSCHIEBEN(U1;0;-2)="Ja";DATUM(JAHR(HEUTE());MONAT(HEUTE());TAG(HEUTE()));"Nein")
Das hat den Nachteil, dass bei jeder Änderung alle Formeln aktualisiert werden. Das hat bei 157 Zeilen noch keine Auswirkung, aber wenn die Liste länger wird, dauert es immer länger.
Ich lese jetzt deinen Kommentar erst genauer. Wird das Datum denn wirklich eingefroren? Ich kann es gerade nicht testen, aber eigentlich müsste doch sich das Datum dem aktuellen Tagesdatum anpassen, wenn "Ja" in der Zelle steht.
Ich kenne bislang nur den Weg über VBA oder Iterationen, ein Datum einfrieren zu können. Meine Versuche mit DATUM (und HEUTE in den Parametern) oder HEUTE direkt schlugen bislang fehl.
Du hast natürlich recht! 😲 Nur mit der Formel geht das nicht. Sonst müsste man die Blattaktualisierung unterdrücken. Es muss VBA sein. Das Datum sollte sich bei Worksheet_Change-Ereignis verändern, also, wenn die Quellzelle geändert wird. Die Lösung 1 von dir ist die richtige.
An LJakobic: sorry, du wirst das wahrscheinlich schon bemerkt haben 😉
Hallo
Den Code musst du in ein Microsoft Excel Objekt schreiben (also zu der entsprechenden Tabelle, nicht als Modul!!).
Über die Klappliste wählst du links oben "Worksheet" aus und rechts oben "change" (ich glaube. Kann es gerade nicht testen. Deshalb der Code auch ohne Gewähr)
Jetzt kannst du in den Code-Rahmen dein Programm schreiben. Und jedesmal, wenn im Tabellenblatt etwas verändert wird, startet er automatisch dein Programm.
Natürlich musst du jetzt selbst die Rahmenbedingungen festlegen, da das Programm nur starten soll, wenn eben in Spalte Seiten etwas eingetragen wurde.
Zb mit "IF Target.Columns = 19 Then" sollte er den Code nur abarbeiten, wenn Spalte S gerade aktiv war und etwas eingetragen wurde.
Nun kannst du weiter prüfen ob Target.Value ="Ja" ist, dann soll "Cells(Target.Row, Target.Column+2).Value =Date" sein.
Den zweiten Teil mit dem frei lassen, habe ich nicht verstanden
außerdem hab ich es nicht als Modul geschrieben, sondern in das Fenster Visual Basic direkt in das Tabellenblatt, ein Modul hab ich nicht erstellt ;)
Mit dem frei lassen, hab ich das so gemeint, wenn ich in Spalte S "Ja" schreibe dann soll das Datum erscheinen
Wenn ich die Zelle in Spalte S frei lasse, soll statt dem Datum ein "Nein" erscheinen
Als ich das Systemdatum auf den 14.12. gerade geändert habe, haben sich die Daten auch auf den 14.12. geändert, genau das wollte ich nicht ;) ich brauche das Datum dann fixiert auf den 13.12. ;)