Aktuelles Datum und Zeit in Excel einfügen per Makro
Hallo,
Ich habe ein chronologisches Logbuch in Excel erstellt. Ich habe außerdem einen Button "Datum/Zeit einfügen" erstellt.
Beim Klick auf den Button soll ab Zeile 11, Spalte B das aktuelle Datum und gleichzeitig ab Zeile 11, Spalte C die aktuelle Zeit eingetragen werden. Beim erneuten Button-Klick soll sich das ganze fortführen, d.h. aktuelles Datum in Zeile 12, Spalte B und Zeit in Zeile 12, Spalte C.
Wie lautet das makro hierzu?
2 Antworten
ich hab auch schon viel in VBA programmiert, was einige Versionen später von xl automatisch gemacht wurde...
Datum bekommst du in eine Zelle ganz einfach mit Strg+. (Punkt)
Zeit bekommst du mit Strg+Shift+.
Lässt sich auch kombinieren (Leerzeichen dazwischen!, sogar mit beliebigem Text!)
Schreib das in zwei Zellen untereinander, markiere beide Zellen und doppelklicke auf das Ausfüllkästchen: Das Datum (bzw. die Zeit) wird eingetragen, soweit wie die Nachbarspalte gefüllt ist (auch Lücken werden toleriert, daneben aber eingetragen).
(entspricht dem Runterziehen: markierst du nur EINE Zelle, bekommst du eine DatumsLISTE, also jeweils den nächsten Tag (die nächste Stunde).
Ist unterhalb eine Zelle gefüllt, wird das nur in die freien Zellen darüber eingetragen: Du kannst also von unten her arbeiten und verschiedene Datumsblöcke nacheinander füllen.
Probier erst mal ein bisschen rum, aber eigntlich dürfte nichts passieren.
Hab noch vergessen: Du kannst natürlich vorher (oder danach) die Spalte auf ein bestimmtes Format bringen (zB 1.2.14, das dann vorher, damits schon beim Einfügen in die Spalte passt und lesbar bleibt,
aber auch ein Bendef. Format wie Mi, 19.11.2014 19:41 müsste gehen.
Sind denn die Zellen darunter alle leer? Wenn nicht, würde ich mir die aktuelle Zeile in einer Zelle merken (Im Beispiel H1):
Sub DatumZeitEintragen()
Cells(Range("H1").Value, 2).Value = Date
Cells(Range("H1").Value, 3).Value = Time
Range("H1").Value = Range("H1").Value + 1
End Sub
Hast du denn in H1 die 11 geschrieben?
Wenn die Zeilen darunter leer sind, kannst du auch die erste freie Zelle suchen:
Sub DatumZeitEintragen2()
Dim rFreieZelle As Range
Set rFreieZelle = Range("B11").End(xlDown).Offset(1, 0)
rFreieZelle.Value = Date
rFreieZelle.Offset(0, 1).Value = Time
End Sub
Habe es jetzt so eingetragen:
Private Sub btn1_Click()
Dim rFreieZelle As Range
Set rFreieZelle = Range("B11").End(xlDown).Offset(1, 0)
rFreieZelle.Value = Date
rFreieZelle.Offset(0, 1).Value = Time
End Sub
Beim Button KLick kommt immer noch der Laufzeitfehler...
Komisch. Funktionieren denn Makros generell? Versuch mal
Private Sub btn1_Click()
debug.print x
End Sub
Sollte das funktionieren, ändere folgende Zeile des Makros:
Set rFreieZelle = ActiveSheet.Range("B11").End(xlDown).Offset(1, 0)
Normale makros funktionieren.
beim debuggen makiert er diese zeile gelb:
Set rFreieZelle = ActiveSheet.Range("B11").End(xlDown).Offset(1, 0)
und gibt wieder den fehler aus..
Es handelt sich um einen Zugriffsfehler. Das Makro kann auf das Tabellenblatt nicht zugreifen. Der Code an sich ist korrekt. Da es bei mir funktioniert, kann ich dir leider an dieser Stelle nicht mehr weiterhelfen, da der Fehler für mich nicht reproduzierbar ist.
Versuche mal, das Tabellenblatt per Namen anzusprechen oder sogar noch das Workbook bei der Referenzierung mit anzugeben.
Makros aktiv? Nirgends Schreibschutz? Datei als xlsm gespeichert?
Sonst zeichne mal ein Makro auf, bei dem du nur B11 markierst und etwas hineinschreibst. Dann schaust du dir den Quellcode dazu an und kopierst die Referenzierung von B11 in mein Makro hinein.
Das Problem ist nicht der ZUgriff sondern das End(xlDown)
Was genau ist denn daran das Problem und wieso geht es bei mir?
Es funktioniert erst wenn mindestens die Zeile 11 und die Zeile 12 gefüllt sind. Solange die Leer sind ergibt End(xldown) immer 1048576 und das mit offset 1 nach unten schieben ist schwer :-)
Das stimmt. Habe ich auch gerade bemerkt. Habe aber Fehler 400 bekommen, nicht 1004. Eine Verbesserung wäre schonmal
...Range("B10").End(xlDown)...
Dann muss nur Zeile 11 gefüllt sein.
Also jetzt mit Korrektur:
Sub DatumZeitEintragen2()
Dim rFreieZelle As Range
If Range("B11").Value = "" Then
Set rFreieZelle = Range("B11")
Else
If Range("B12").Value = "" Then
Set rFreieZelle = Range("B12")
Else
Set rFreieZelle = Range("B11").End(xlDown).Offset(1, 0)
End If
End If
rFreieZelle.Value = Date
rFreieZelle.Offset(0, 1).Value = Time
End Sub
Schade, jetzt ist das Programm nicht mehr so schmal. :(
Kann es aber sein:
Sub DatumZeitEintragen2()
Dim rFreieZelle As Range
Set rFreieZelle = Cells(WorksheetFunction.Max(11, Range("B1045876").End(xlUp).Row), 2).Offset(1, 0)
rFreieZelle.Value = Date
rFreieZelle.Offset(0, 1).Value = Time
End Sub
Sorry es soll ja in 11 losgehen:
Sub DatumZeitEintragen2()
Dim rFreieZelle As Range
Set rFreieZelle = Range("B" & WorksheetFunction.Max(10, Range("B1045876").End(xlUp).Row)).Offset(1, 0)
rFreieZelle.Value = Date
rFreieZelle.Offset(0, 1).Value = Time
End Sub
Range("B1045876")
So etwas versuche ich zu vermeiden. Gibt es einen Befehl, der mir das Ende einer Spalte oder Zeile liefert?
Solange die Spalte leer ist kommst du hier immer auf Zeile 1045876 da ich mit MIN nicht arbeiten kann, da hier dann immer Zeile 11 rauskommen würde, habe ich mich der leeren Zelle von unten genähert da ich hier mit MAX arbeiten kann.
Den Beweis hast du wenn du in folgendem Code auf eine leere Spalte referenzierst
wert1 = Range("A1").End(xlDown).Row
wert2 = Range("A1000000").End(xlUp).Row
wert1 = 1045876
wert2 = 1
Was ich meine ist, das ein Befehl Range("B1").EntireColumn.LastRow oder ähnlich schöner wäre als Range("B1045876"). Fügt man das Makro in Excel 2000 ein, hat man wahrscheinlich ein Problem.
Ja die Zellen da drunter sind alle leer. Bei deinem Makro kommt bei mir Laufzeitfehler 1004..