Timestamp, aber nur bei leeren Zellen

Crimson_Sabbath

Lieutenant
Registriert
Nov. 2011
Beiträge
707
Hallo zusammen,

ich würde mir gerne eine Tätigkeitenliste pflegen in der ich meine Tätigkeiten mit dem Zeitaufwand erfasse.

Da ich bzgl. VBA noch recht neu bin (lesen klappt bei vielen Makros, "freies" schreiben ist aktuell noch schwierig) habe ich mich mal mit diversen Befehlen am schreiben versucht.

Folgendes soll es mir an Arbeit abnehmen: Bei Eingabe eines Wertes in eine beliebige Zelle in Spalte B, soll in der dazugehörigen Zelle in Spalte A ein Timestamp gesetzt werden.
Allerdings sollte bei einer Änderung in Spalte B der Timestamp in A nicht überschrieben werden (bspw. wenn die Tätigkeit im Nachgang von der Syntax her angepasst wird.

Mein Ansatz ist folgender (ganz nach der Logik aus einem Tages-Crash-Kurs in VBA): Suche die letzte beschriebene Zeile in Spalte B und schreibe (sofern diese leer ist) einen Timestamp in Spalte A.
Nach anfänglicher Fehlersuche bin ich drauf gestoßen... es fehlt der Automatismus. Ich bin mir unschlüssig wie ich den (vermutlich einfachen) Befehl "Prüfe nach jeder Zelleingabe" hier einbringe. Ggfs. fehlen mir auch nur die korrekten Suchparameter bei Google (Afterupdate, nach Zellaktualisierung,...)

Gibt es hier jmd. mit einem Tipp?

Sub Timestamp()
Dim i, letztezeile As Integer

LetzteZeile = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row
For i = 1 To LetzteZeile
If Cells(i, 2).Value <> "" Then
If Cells(i, 1).Value = "" Then
Cells(i, 1).Value = CDate(Format(Now, "dd.mm.yy hh:mm"))
End If
End If
Next
End Sub
 
Hi. Dein Makro funktioniert wunderbar, aber eben nur dann, wenn es explizit aufgerufen wird. Damit es immer automatisch läuft, wenn Du eine Eingabe machst, musst Du entweder über Option_explicit gehen (habe ich keine guten Erfahrungen gemacht, ist recht fehleranfällig imho) oder über eine private_sub IN DEM BLATT*, in dem Deine Eingabe passiert. Das sähe dann hier so aus:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i, letztezeile As Integer

letztezeile = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row
For i = 1 To letztezeile
If Cells(i, 2).Value <> "" Then
If Cells(i, 1).Value = "" Then
Cells(i, 1).Value = CDate(Format(Now, "dd.mm.yy hh:mm"))
End If
End If
Next
End Sub


Jetzt klappt's, und wenn eine Zeile bereits Inhalt hat, wird der Timestamp auch nicht nochmals geändert - sollte also genau das sein, was Du suchst. Das wusste ich jetzt auch so, aber falls es hilft, ich suche VBA Geschichten meist recht "stumpf" bei google. In diesem Falle hier:

"excel vba, makro immer ausführen nach eingabe"

Meistens landet man dann bei Herber oder Office-Loesung.de, sind beide ganz gut finde ich.

* edit: mit IN DEM BLATT meine ich im Makroeditor in dem Blatt, also bspw. durch Doppelklick auf "Tabelle1" den Code dort einfügen
 
Danke für die schnelle Hilfe... Option Explicit hatte ich drin.
Allerdings fehlte das "Private Sub Worksheet_Change(ByVal Target As Range)"... so einfach kann es sein, danke für die Hilfe
 
Für weniger Rechenaufwand kannst du auch einfach nur die betreffende Zeile(n) prüfen, in der / denen geändert wurde:

For each row in target.rows
If cells(Row.row, 2) <> "" and cells(row.row, 1) = "" then cells(row.row, 1) = date & " " & time
Next row
 
Zurück
Oben