Aktuelles Datum und Zeit in Excel einfügen per Makro

2 Antworten

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

karl123 
Beitragsersteller
 19.11.2014, 13:08

Ja die Zellen da drunter sind alle leer. Bei deinem Makro kommt bei mir Laufzeitfehler 1004..

0
Suboptimierer  19.11.2014, 13:17
@karl123

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
0
karl123 
Beitragsersteller
 19.11.2014, 13:22
@Suboptimierer

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...

0
Suboptimierer  19.11.2014, 13:25
@karl123

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)

0
karl123 
Beitragsersteller
 19.11.2014, 13:28
@Suboptimierer

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..

0
Suboptimierer  19.11.2014, 13:31
@karl123

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.

0
augsburgchris  20.11.2014, 11:56
@augsburgchris

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 :-)

1
Suboptimierer  20.11.2014, 11:57
@augsburgchris

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.

0
Suboptimierer  20.11.2014, 12:04
@augsburgchris

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. :(

0
augsburgchris  20.11.2014, 12:12
@Suboptimierer

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
0
augsburgchris  20.11.2014, 12:17
@augsburgchris

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
0
Suboptimierer  20.11.2014, 12:19
@augsburgchris
Range("B1045876")

So etwas versuche ich zu vermeiden. Gibt es einen Befehl, der mir das Ende einer Spalte oder Zeile liefert?

0
augsburgchris  20.11.2014, 12:27
@Suboptimierer

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

0
Suboptimierer  20.11.2014, 12:30
@augsburgchris

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.

0

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.


Iamiam  19.11.2014, 19:42

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.

0