Excel Speicher Datum / Erstelldatum automatisch in Zelle einfügen

Dieser Thread ist Teil einer Diskussion zu einem Artikel:  Zum News-Artikel gehen

gustav1947

Neues Mitglied
Ich möchte das Speicherdatum oder das Erstelldatum einer Datei in eine Zelle mit VBA automatisch einfügen lassen. Am Besten noch mit dem Ortsnamen davor wie z.B. Zürich, ...........

Ich benutze Excel 2010.

Kann mir jemand helfen?
 

nochEinAndreas

Stammgast
Hallo Gustav,

also das mit dem Ort wird nix werden. Woher sollte Excel wissen, wo du gerade bist.
Das mit dem Datum geht:
Mach den VBA Editor auf (z.B. über Alt-F11) und kopiere in den Codebereich von "DieseArbeitsmappe" Folgendes:
Code:
Private Sub Workbook_AfterSave(ByVal Success As Boolean)
    If Success Then ActiveSheet.Range("A1") = "Gespeichert: " & Now
End Sub

Damit wird das aktuelle Datum und die Uhrzeit in Zelle A1 des momentan aktiven Blattes geschrieben.

Gruß, Andreas
 

Gaby Salvisberg

Super-Moderator
Muss es mit VBA sein oder gehts auch ohne? Wenn der Ort feststeht, dann z.B. so:
="Zürich, "&TEXT(HEUTE();"TT.MM.JJ")

[edit] Die obige Formel fügt einfach das aktuelle Datum ein. Sobald das Blatt neu berechnet wird, wird auch das Datum aktualisiert. Wenn du das letzte Speicherdatum brauchst, wirst du um VBA wohl nicht herumkommen. Ich wundere mich gerade, dass sich eine simple Dokumenteigenschaft wie "Speicherdatum" nicht als ganz normale Formel einfügen lässt.

Herzliche Grüsse
Gaby
 
Zuletzt bearbeitet:

nochEinAndreas

Stammgast
Hallo Gaby,

ich habe eben gesehen, dass VBA diese Speicher-Info zur Verfügung stellt, über
Code:
DieseArbeitsmappe.BuiltinDocumentProperties("Last save time")
Daraus könnte man eine Funktion basteln, die man dann aus einer Zelle aufrufen könnte:
Code:
Function letztesSpeichern()
    letztesSpeichern = DieseArbeitsmappe.BuiltinDocumentProperties("Last save time")
End Function
In der Zelle müsste dann
Code:
=letztesSpeichern()
stehen.
Der Haken an der Sache ist, dass das Ergebnis beim Speichern nicht automatisch neu berechnet wird. Nur Funktionen, die sich auf andere Zellen beziehen werden neu berechnet. In unserem Fall müsste man mit Strg-Alt-F9 nachhelfen. Unschön.

Gruß, Andreas
 

nochEinAndreas

Stammgast
Hallo Gustav,

ich habe hier noch 'ne Korrektur. Bei der vorherigen Version wurde zwar das Speicherdatum in die Zelle eingetragen. Der neue Eintrag wurde aber nicht gespeichert. Bei der neue Version passiert das nicht mehr.

Code:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    ActiveSheet.Range("A1") = "Gespeichert: " & Now
End Sub

Private Sub Workbook_AfterSave(ByVal Success As Boolean)
    If Not Success Then ActiveSheet.Range("A1") = "Nicht gespeichert"
End Sub

Grüße, Andreas
 

gustav1947

Neues Mitglied
@ Andreas 19:32: Für mich die perfekte Lösung:

Private Sub Workbook_AfterSave(ByVal Success As Boolean)
If Success Then ActiveSheet.Range("A1") = "Zürich, " & Date
End Sub

Dein zweiter Vorschlag gefällt mir noch besser (mit meiner Korrektur).

@ Andreas 19:37: Diesen Vorschlag muss ich mir noch in Ruhe ansehen.

Was müsste ich noch ändern, wenn ich das Erstelldatum einsetzen möchte?

Danke für den Input

@ Gaby: Diesen Vorschlag kannte ich schon. Und eben: Warum diese Lösung (direkt in der Zelle) nicht für ein unveränderbares Datum angeboten wird?

@ Andreas: Wie fügst du die Codes in diesen Thread ein?

Grüsse
Gustav
 

nochEinAndreas

Stammgast
Hallo Gustav,

@ Andreas 19:32: Für mich die perfekte Lösung:

Private Sub Workbook_AfterSave(ByVal Success As Boolean)
If Success Then ActiveSheet.Range("A1") = "Zürich, " & Date
End Sub
Wie von mir im Beitrag #5 geschrieben: Wenn du es so machst, wird zwar das Speicherdatum in die Zelle geschrieben, dies aber nicht gespeichert. Deswegen der geänderte Code in #5.
Der Beitrag #4 war eher für Gaby gedacht. Sie vermisste ja eine Funktion in Excel, die das Speicherdatum ausgibt. Wie in #4 gesagt: Der Haken daran ist, dass man es händisch neu berechnen muss.

Und hier eine Version, die in A2 auch das Erstelldatum der Datei schreibt:

Code:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    ActiveSheet.Range("A1") = "Gespeichert: " & Now
End Sub

Private Sub Workbook_AfterSave(ByVal Success As Boolean)
    If Not Success Then ActiveSheet.Range("A1") = "Nicht gespeichert"
    ActiveSheet.Range("A2") = "Erstellt: " & DieseArbeitsmappe.BuiltinDocumentProperties.Item("Creation date")
End Sub

Und wie kriegt man Code angezeigt?: Wenn du einen Beitrag schreibst, klick auf das Drei-Punkte-Icon in der Iconleiste und dann auf das </> Symbol.

Grüße, Andreas
 
Zuletzt bearbeitet:

gustav1947

Neues Mitglied
Hallo Andreas

Danke für deinen Vorschlag.

Ich möchte das Datum aber ohne Uhrzeit. Was muss ich ändern? Meine Versuche sind fehlgeschlagen.

Gruss

Gustav
 

nochEinAndreas

Stammgast
Na gut, Gustav,

dann so:
Code:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    ActiveSheet.Range("A1") = "Gespeichert: " & Format(Now, "dd.mm.yyyy")
End Sub

Private Sub Workbook_AfterSave(ByVal Success As Boolean)
    If Not Success Then ActiveSheet.Range("A1") = "Nicht gespeichert"
    ActiveSheet.Range("A2") = "Erstellt: " & Format(DieseArbeitsmappe.BuiltinDocumentProperties.Item("Creation date"), "dd.mm.yyyy")
End Sub

Grüße, Andreas
 

Gaby Salvisberg

Super-Moderator
Fun fact: Bin bei dieser Gelegenheit über einen interessanten Excel-"Bug" gestolpert, für den weder du noch dein Makro etwas kann.

Bei mir zeigte es beim Testen des Makros das Erstelldatum 5.6.2015 an. Dabei war das eine heute neu erstellte Datei! Auch bei Datei/Informationen erscheint unter "Relevante Datumsangaben" das alte Datum. In den Dateieigenschaften im Explorer erscheint im Reiter Allgemein das richtige; unter Details (die Excel-eigenen Metadaten) wieder das falsche. Ich habe die Ursache dafür auf Anhieb vermutet, weil ich mich an diese andere Geschichte mit Word erinnert fühlte (dort gings ums Dateiformat, aber die Sache mit der Vorlage blieb mir in Erinnerung).

Es verhält sich so: Erstellt man die (leere) Excel-Datei via Rechtsklick/Neu/Microsoft Excel-Arbeitsblatt, dann greift Excel zu einer Vorlagendatei, die offenbar 2015 entstanden ist. In Excel selbst (und im aus dem Makro stammenden Datum) wird dieses alte Datum angezeigt. Will man das richtige Erstelldatum haben, darf man zum Erzeugen der Datei nicht die Rechtsklick/Neu-Methode wählen, sondern startet besser erst Excel, fügt erste Inhalte ein und speichert die Datei.

Hier hatten schon andere User das Problem:

Microsoft Office ist ein steter Quell der Überraschungen!

Man kann das Erstelldatum manuell ändern. Wieder mit VBA, indem man in der betroffenen Datei dies einmal in den VBA-Editor wirft und über die Play-Taste abspielt, danach kann man den Code wieder löschen und die Datei speichern:

Aktuelles Datum:
Code:
Sub ChangeDate()
ThisWorkbook.BuiltinDocumentProperties("Creation Date") = Date
End Sub

Ein anderes Datum, z.B. den 1.1.2020 (hier die Datumszahl kurz über eine Excel-Zelle ermitteln, deren Zellformat man von Datum auf Standard umschaltet):
Code:
Sub ChangeDate()
ThisWorkbook.BuiltinDocumentProperties("Creation Date") = 43831
End Sub

Herzliche Grüsse
Gaby
 
Zuletzt bearbeitet:

nochEinAndreas

Stammgast
Hi Gaby, das ist ja geil!

Was ich eben noch ausprobiert habe: In beiden fällen erhält man das richtige Datum, wenn man folgenden Code benutzt:

Code:
Sub erstelldatum()
    Dim fso As Object
    Dim datei As Object
   
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set datei = fso.GetFile(ActiveWorkbook.FullName)
    MsgBox datei.DateCreated
    Set datei = Nothing
    Set fso = Nothing
End Sub

Grüße, Andreas
 

nochEinAndreas

Stammgast
... und noch ein Bisschen mehr Spielerei:
Man erstelle eine Excel Datei über Rechtsklick - neu - Microsoft Excel Arbeitsblatt.
Man benenne das Anhängsel .xlsx um in .zip
Man öffne die Datei per Doppelklick.
Im Zip-Ordner navigiere man nach docProps und öffne die Datei core.xml
Hier findet man genau das falsche Datum (Erstelldatum der Vorlage):

core_xml.JPG
Man schließe core.xml und den Zip-Ordner.
Man benenne die Datei wieder zurück von .zip nach .xlsx
Man öffne die Datei mit Excel.
Man öffne den VBA-Editor
Man gebe in den Direktbereich ein: ThisWorkbook.BuiltinDocumentProperties("Creation Date") = 43831
Man schließe den VBA-Editor
Man gehe nach Datei - Informationen. Dort steht jetzt (ohne das man gespeichert hat!) das Erstelldatum 01.01.2020 00:00.
Man speichere die Datei.
Jetzt noch mal die Prozedur mit umbenennen nach .zip und öffnen der (internen) Datei core.xml. Jetzt steht dort:

core_xml2.JPG
nicht etwa der 01.01.2020 00:00, sondern 1 Std. früher, also vermutlich GMT.

Und was lernen wir draus? Innerhalb Excel und VBA gilt als Erstelldatum das, was in den Tiefen der Datei steht.
Benutzt man (auch aus VBA heraus) den Windows Skript Host, dann bekommt man das Erstelldatum, wie es in Windows abgelegt ist.
ob das alles so stimmt - keine Ahnung. Es ist nur meine Vermutung.

Grüße, Andreas
 

nochEinAndreas

Stammgast
und noch ein kleiner Nachtrag: Bei MS steht:

Workbook. BuiltinDocumentProperties-Eigenschaft (Excel)​

Gibt eine DocumentProperties -Auflistung zurück, die alle integrierten Dokumenteigenschaften für die angegebene Arbeitsmappe darstellt. Schreibgeschützt.

Man beachte das letzte Wort. Wieso man also das Erstelldatum ändern kann (ThisWorkbook.BuiltinDocumentProperties("Creation Date") = 43831),
ist mir völlig schleierhaft.
So, jetzt bin ich aber ruhig.
Schöne Grüße, Andreas
 

Gaby Salvisberg

Super-Moderator
Das lässt sich dann auch kombinieren, wie es scheint:

Code:
Sub DatumAnpassen()
    Dim fso As Object
    Dim datei As Object
 
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set datei = fso.GetFile(ActiveWorkbook.FullName)

ThisWorkbook.BuiltinDocumentProperties("Creation Date") = datei.DateCreated
   
    Set datei = Nothing
    Set fso = Nothing
End Sub

Was denkst du darüber? Spricht etwas dagegen, dies z.B. in die Persönliche Makro-Arbeitsmappe zu stecken?

Herzliche Grüsse
Gaby
 

nochEinAndreas

Stammgast
Die Idee klingt gut. Eventuell könnte man das noch in eine Application Ereignisprozedur packen. dann würde das richtige Datum z.B. immer vor dem Speichern einer Mappe gesetzt werden. Wie das genau mit den Ereignisprozeduren für das Application-Object geht, da muss ich mich erst noch schlau machen, z.B. hier:

Schöne Grüße, Andreas
 

nochEinAndreas

Stammgast
So Gaby, ich habs.

Füge in die persönliche Arbeitsmappe (PERSONAL.XLSB) folgenden Code in den Bereich "DieseArbeitsmappe" ein:

Code:
Option Explicit
Private WithEvents App As Application

Private Sub App_WorkbookBeforeSave(ByVal Wb As Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim fso As Object
    Dim datei As Object

    Set fso = CreateObject("Scripting.FileSystemObject")
    With Wb
        On Error Resume Next
        Set datei = fso.GetFile(.FullName)
        If Err.Number = 0 Then .BuiltinDocumentProperties("Creation Date") = datei.DateCreated
        On Error GoTo 0
    End With
    Set datei = Nothing
    Set fso = Nothing
End Sub

Private Sub Workbook_Open()
    Set App = Application
End Sub

Dann musst du Excel (bzw. die PERSONAL.XLSB) speichern, schließen und neu öffnen.
Beim öffnen werden durch die Workbook_Open Routine die Application Events freigeschaltet.
Vor dem Speichern irgend einer Mappe wird jetzt immer das App_WorkbookBeforeSave Event abgearbeitet.
Hierbei wird dein Vorschlag
Code:
BuiltinDocumentProperties("Creation Date") = datei.DateCreated
benutzt, sodass jede Datei vor dem Speichern ihr echtes Erstelldatum bekommt.
Es wird noch ein Fehler abgefangen: Wenn eine Datei noch nie gespeichert war, gibt es noch kein "DateCreated". Das ist der Fall, wenn nicht die Excel-Vorlage benutzt wurde. Aber das macht ja nichts, da stimmt das Erstelldatum ja sowieso.

Ich hoffe, das funktioniert so. Bei mir hat es geklappt.

Grüße, Andreas
 

Gaby Salvisberg

Super-Moderator
Hallo Andreas

Interessante Idee, dies automatisch machen zu lassen. Bei automatisch beim Öffnen oder Speichern ausgeführten Makros bin ich allerdings etwas skeptisch und mit solchen lieber zurückhaltend. Wie wäre es denn, wenn man das Makro zwar in die Personal.xlsb stecken, aber nur auf "Zuruf" ausführen wollte?

Ich habe das vorhin mit der Variante in #14 versucht und das Makro in die Schnellzugriffsleiste verknüpft. Aber das scheint nicht zu funktionieren (keine Fehlermeldung) bzw. scheint eher das Erstelldatum der Personal.xlsb zu ändern - und nicht jenes der Arbeitsmappe, in der ich das Makro ausführe bzw. gerne ausführen würde :unsure:

Herzliche Grüsse
Gaby
 

nochEinAndreas

Stammgast
Hallo Gaby,

im Code in #14 steht "ThisWorkbook". Das bezieht sich immer auf die Mappe, in der der Code steht, bei dir also auf die Personal.xlsb
Ersetze mal ThisWorkbook durch ActiveWorkook. Dann sollte immer das Datum der aktiven Mappe geändert werden.

Gruß, Andreas
 
Oben