Excel VBA Änderung der Time-Stamps einer File

gehtnetgibtsnet

Cadet 4th Year
Registriert
März 2019
Beiträge
103
Hallo Forumsmitglieder,

ich erzeuge von Zeit zu Zeit Files, deren Ursprungsdaten aus einer großen Excel-Datenbank stammen. Diese Daten sind im Text-Format und erlauben ein Suchen nach bestimmten Begriffen. Das Problem dabei: beim Erstellen dieser Files erhält jede File das aktuelle Datum und die aktuelle Uhrzeit als "Timestamp".

Auch der Suche nach einer Lösung habe ich im Internet ein kleines Programm gefunden, mit dem es möglich ist, den Änderungs-Timestamp zu verändern.

Hier der Code:

Sub DemoTest()

Dim App As Object
Dim Folder As Object
Dim File As Object

Set App = CreateObject("Shell.Application")
Set Folder = App.Namespace("D:\Demo\")
Set File = Folder.ParseName("DemoFile.txt")

File.ModifyDate = "24.12.2018" 'This works

Set File = Nothing
Set Folder = Nothing
Set App = Nothing

End Sub

Meine Frage an die Spezialisten: kann man auch das "Creation-Date" ändern, und wie lautet dann der Command dazu?

Gruß

gngn
 
Warum muß man sowas über Excel machen und nicht über die shell?
 
  • Gefällt mir
Reaktionen: rocketworm
@CHaos.Gentle:

Danke für Deine Antwort und die Links.

@Twostone:

Der Grund ist sehr leicht erklärbar: über Excel habe ich die Möglichkeit, die zu verwendenden Werte über "eigene" Logik festzulegen. Mit eine GUI-Programm muss ich das manuell machen. Zumindest sehe ich das mit meinen bescheidenen VBA-Kenntnissen so!

Gruß

gngn
 
rocketworm schrieb:
Mit der Powershell kannst du dir ein script nach deinen eigenen anforderungen bauen. Wenn das eine große anzahl an Dateien ist, wird die Datumsänderung damit sicher auch deutlich schneller gehen als mit vba.

So sieht's aus. Mit Excel das machen zu wollen ist in etwa so, als würde man sich einen Hubschrauber kaufen um zum Zigarettenautomaten um die Ecke zu gehen. Kann man machen, ist ggf. jedoch sehr umständlich. Excel ist nunmal eine Tabellenkalkulation (und VBA die reinste Folter) und kein Dateimanager o.ä. Dateisystemmanipulationen macht man imho am Besten aus der shell heraus.
 
Ich mache so was mit dem Autohotkey-Befehl FILESETTIME, ...
Da könnte man sicher auch schnell ne Kommandozeilensache kompilieren, die dann aus VBA aufgerufen wird.

gehtnetgibtsnet schrieb:
Das Problem dabei: beim Erstellen dieser Files erhält jede File das aktuelle Datum und die aktuelle Uhrzeit als "Timestamp".
Ich bin ja auch sehr zeitstempelsensitiv, aber wenn du ein immanentes "Feature" als Problem wahrnimmst, solltest du das erläutern.
Du ziehst Daten aus ner Excel-Datenbank und willst, dass der auf Dateiebene vergebene Zeitstempel irgendetwas zur Entstehungszeit der Daten sagt?
Wäre es nicht leichter, den Dateinamen zu verwenden.
 
  • Gefällt mir
Reaktionen: rocketworm
Hallo rocketworm, Twostone und halwe,

herzlichen Dank für die Diskussion, die Ihr zu meinem Problem geführt hat.

Hier meine Erläuterungen:

1. Neben der "Bezeichnung" ist in der "Excel-Datenbank" auch ein wichtiges fallbezogenes Datum enthalten. Natürlich könnte ich das Datum auch zum Bestandteil des zu erstellenden Dateinamens machen.

2. Mein File-Explorer bietet mir eine Suchfunktion an; das Suchergebnis wird dann sortiert nach Namen dargestellt. Ich habe aber auch die Möglichkeit, diese Liste mit einem Klick nach dem Änderungs-Datum zu sortieren. Das geht aber nicht, wenn das Datum nur Bestandteil des File-Namens ist.

3. Die Files werden bei Bedarf neu erstellt. Es ist also keine Arbeit, die täglich durchgeführt wird; Performance ist somit keine Frage!

4. Ich bin seit Jahren Rentner (+70) und kenne mich seit mehr als 15 Jahren mit VBA soweit aus, dass ich damit einige Dinge für den Privatgebrauch lösen kann. Außer mit VBA kann ich noch mit REXX umgehen. Mit beiden hatte ich auch beruflich zu tun.

5. Das Internet bietet inzwischen zu vielen Themen Hilfe an. So auch in dem gefundenen Code zur Änderung des Änderungsdatum eines Files. Das Problem dabei ist nur, den richtigen Suchbegriff zu benutzen. Ich habe zwar einige Beispiele gefunden, ober nur, um den Änderungs-Timestamp zu verändern. Eine Ausnahme war ein „Riesending“ von Chip Pearson, das mit meinem VBA-Wissen nicht durchschaubar war. Chip ist am 19. April 2018 verstorben; ihn kann ich nicht mehr fragen.

6. Toll wäre es gewesen, wenn es auch eine einfache Möglichkeit gegeben hätte, das Erstelldatum mit VBA zu verändern; dann hätte ich zusätzlich noch das Datum unterbringen können, an dem die Excelfile letztmals verändert wurde.

7. Bestimmt gibt es andere und bessere Methoden zur Lösung meines "Problems". Aber dazu fehlt mir die Kenntnis. Auch möchte ich mich ungern mit einer weiteren "Programmiersprache" beschäftigen. Und da die Daten in Excel gespeichert sind, komme ich auch nur über Excel an diese Daten heran.

8. Ich werde mich in nächster Zeit einmal mit "FILESETTIME“ beschäftigen, dass halwe genannt hat.

9. Zurück zu meiner Fragestellung: mir hätte die Antwort, dass es nur für das Änderungsdatum mit VBA eine Lösung gibt, vollkommen gereicht. Ich hatte auch nirgends eine Information dazu gefunden, dass es neben "ModifyDate" noch weitere, die File-Timestamps betreffenden Funktionen gibt, und dass nur "ModifyDate“ die Möglichkeit bietet, neu gesetzt zu werden.

Für mich ist meine Frage damit ausreichend beantwortet.

Gruß und nochmals: Danke!

gngn
 
  • Gefällt mir
Reaktionen: Gameforce
Hey @gehtnetgibtsnet ,

ich konnte nicht an mir halten, da du so unfassbar freundlich bist. Das ist recht erhebend. Schon an meiner ersten Antwort kann man das generelle Problem der Kommunikation per Internet erkennen. Irgendwie ist man immer "schnippisch".

Naja, ich habe da auf jeden Fall noch etwas gefunden, dass dir helfen könnte. Ist ein wenig komplizierter, weil eben nicht per Standardmethode, sondern per Windows API.

Kurz, was du möchtest ist möglich:
http://www.cpearson.com/excel/FileTimes.htm

Ich hoffe, du findest das hier noch.
 
CHaos.Gentle schrieb:
ich konnte nicht an mir halten, da du so unfassbar freundlich bist.

Ältere Generation. Die es noch lernte, in vollständigen und korrekten Sätzen zu schreiben. Mancher mag allein dies schon als Freundlichkeit verstehen, da es nicht mehr den Gepflogenheiten entspricht.

Ich würde schlichtweg über VBA Powershell-Befehle einbetten und diese die Änderungen von der Shell vollführen lassen.
powershell: Change Creation Date

Nur daß ich mich weder mit VBA noch mit windows herumschlagen würde. Da könnte ich auch versuchen, Code mit einem Zahnstocher in eine Steintafel zu meißeln. Imho genauso komfortabel.
 
  • Gefällt mir
Reaktionen: Gameforce
Vielleicht kannst du uns auch kurz beschreiben warum du das Änderungsdatum überhaupt Ändern möchtest und wofür du das nutzt. Vielleicht können wir dir dann dazu einfachere/weniger Aufwändige Lösungen dafür vorschlagen.

gehtnetgibtsnet schrieb:
2. Mein File-Explorer bietet mir eine Suchfunktion an; das Suchergebnis wird dann sortiert nach Namen dargestellt. Ich habe aber auch die Möglichkeit, diese Liste mit einem Klick nach dem Änderungs-Datum zu sortieren. Das geht aber nicht, wenn das Datum nur Bestandteil des File-Namens ist.
Das sortieren nach Datum anhand des Datei/Ordnernamens funktioniert sehr gut wenn man die Dateien vorne beginnend im Schema Jahr-Monat-Tag benennt. Beispiel:
2019-10-19_geburtstagsfoto.jpg

Als weiteres Beispiel, ich organisiere meine Fotos in einem ähnlichen Schema. Ich habe meine Fotos in Ordnern Organisiert. Die Ordner vorne auch immer Im Schema Jahr-Monat-Tag und hinten dran dann noch worum es ging. So habe ich dann an einem Tag ggf. mehrere Ordner In den Ordnern sind dann die Bilddateien mit den Fortlaufenden Nummern im Dateinamen wie sie aus der Kamera kommen. Beispiel:
2019-10-18 Gras beim Wachsen
2019-10-19 Autotreffen Hamburg
2019-10-19 Grillen bei Mustermann
2019-12-24 Heiligabend
 
@rocketworm: Ich mach das mit den Fotos genauso, hab mir sogar ein Skript geschrieben, welches basierend auf dem Aufnahmedatum der Fotos und Videos aus allen möglichen Quellen einheitlich mit einem YYYY-MM-DD am Namensanfang versieht.
Allerdings, wenn ich sie auf den Handy betrachte, wird je nach Anzeigeprogramm häufig doch eher der Zeitstempel der Datei für die Reihenfolge benutzt, weshalb ich diesen zusätzlich mit dem oben erwähnten FILESETTIME (Autohotkey) setze.
 
Hallo, liebe "Antworter".

Eigentlich hatte ich gedacht, das Thema sei abgeschlossen. Falsch gedacht.

@CHaos.Gentle: Herzlichen Dank für das Lob über meinen Stil. Ja, das hat man früher noch gelernt. Danke auch für den Hinweis auf den Link zu FileTimes.htm. Da hat doch wohl jemand meine lange Antwort nicht gelesen: unter Punkt 5 habe ich genau darauf hingewiesen.

@Twostone: Das ist zwar gut gemeint, aber ich habe 0 (null) Erfahrung mit Powershell. Und noch weniger Erfahrung damit, wie man soetwas unter VBA aufrufen kann. Auf die Schnelle habe ich auch kein passendes Beispiel gefunden, dem ich lediglich meinen eigenen Filenamen und natürlich das Datum mitgeben müsste.

Was mich grundsätzlich immer stört: es werden oft nur (unvollständige) Auszüge von Befehlen als Antwort bereitgestellt, oft noch ungetestet, selten ein lauffähiges kleines Test-Programm. Das wäre für Laien viel besser zu verstehen.

Jetzt habe ich eine weitere Baustelle: Internetsuche nach einem Beispiel, das Datum einer File aus einer VBA-Routine mit Hilfe von Powershell zu ändern.

@rocketworm und @halwe: scheint mir, als hätte Ihr meine Antwort Nr 2 nicht verstanden. Wie wollt Ihr die Liste nach Namen sortieren, wenn die Namen mit dem Datum beginnen? Problem nun erkannt?

Wenn ich die Möglichkeit hätte, das Erstell-Datum und das Änderungsdatum meiner neu zu erstellenden "Auszugsfile" anzupassen, dann könnte ich einerseits das Datum der letzten Änderung der Datenbank und zusätzlich das zum Fall gehörige Datum verwenden, und könnte mein Verzeichnis entweder nach Namen, oder nach "Stand der Tabelle" oder nach "Fallbezogenem-Datum" sortieren. Das war mein Ansatz.

Bitte, habt Verständnis dafür, dass ich die Tabelle ("Datenbank") nicht zur Verfügung stellen möchte; sie enthält zu viele sensible Daten. Der Vorteil meiner "Auszugsliste" liegt darin, dass ich jeden "Fall" mit jedem beliebigen Text-Browser ansehen kann; ich brauche dazu kein Excel. Und eine Auswahl nach "Gruppen" kann ich mit der Suchfunktion meines File-Explorers machen.

Alles klar?

Gruß

gngn
 
N'abend :)
Tatsächlich habe ich deine Ausführung in Punkt 5 nicht gelesen. Asche über mein Haupt.

Ich habe das Projekt von dem Werten Herren soeben einmal getestet und es ist recht einfach.
Du lädst dir einfach seine Module herunter und importierst sie mal in eine neue Excel-Datei. Einfach rechte Maustaste im Projektexplorer und importieren wählen.
Du benötigst nur die "Functions For Retrieving Or Setting File Times"-Module.
Enthalten ist auch eine modTest.bas in der alle Funktionen schon zum Testen bereitstehen. Genauso wie dort, kannst du die einzelnen Funktionen auch in deiner eigenen Datei nutzen.
(Bitte denke daran ein Backup von allem anzulegen, nicht dass irgendetwas schief geht)

Wenn du noch konkrete Fragen dazu hast, immer gerne heraus damit.
 
Guten Morgen, CHaos.Gentle,

ich habe das "Wunderwerk" von Chip Pearson getestet. Man muss nur ein wenig aufpassen: er hat manchmal den Filenamen fest vorgegeben, ein anders Mal eine lokale Variable gesetzt.

Ich habe mir eine Super-Test-Routine zusammengestellt, die alle Funktionen aufruft. Zuvor habe ich in seinem Code nach fest vorgegebenen "File1.txt" und "File2.txt" gesucht, und die Namen an meine beiden globalen Konstanten angepasst.

Public Const TestFile1 = "D:\Demo\File1.txt"
Public Const TestFile2 = "D:\Demo\File2.txt"

Sub Full_Chip_Pearson_Test()
Debug.Print "Starting " & "TestCompareFileTimes"
Call TestCompareFileTimes
Debug.Print "Starting " & "TestGetFileDateTime"
Call TestGetFileDateTime
Debug.Print "Starting " & "TestGetFileTimeAsFILETIME"
Call TestGetFileTimeAsFILETIME
Debug.Print "Starting " & "TestSetFileDateTime "
Call TestSetFileDateTime
End Sub

Das Ergebnis: alles hat funktioniert.

Ich danke Dir, dass Du mich mit Deiner Antwort animiert hast, es trotz dem "Riesending" einmal zu versuchen.
 
gehtnetgibtsnet schrieb:
@rocketworm und @halwe: scheint mir, als hätte Ihr meine Antwort Nr 2 nicht verstanden. Wie wollt Ihr die Liste nach Namen sortieren, wenn die Namen mit dem Datum beginnen? Problem nun erkannt?
Na ja, hättest du geschrieben, dass du die Sortierung nach Dateinamen tatsächlich brauchst (wohl noch aus anderen Gründen), hätten wir uns diesen Tipp sparen können.
Hier ein einfaches AHK-Sript, mit dem du, wenn kompiliert, einen Zeitstempel setzen kannst:
Code:
FILESETTIME, %1%, %2%, C
Das Teil kompilierst zu ne exe und dann kannst du z. B. mit
C:\temp\FileSetTime.exe 201801010200 "C:\temp\test.docx"
das Erstelldatum einer Datei auf den 1.1.2018 1:00 Uhr setzen (es wird GMT gesetzt, deshalb eine Stunde Zeitverschiebung).
 
Hallo halwe,

schon wieder ein neues Problem: ich habe noch nie einen VBA-Code in eine EXE kompiliert. Keine Ahnung wie das geht.

Ich habe schon im Internet gesucht. Manche Seiten, auf die verwiesen wird, gibt es nicht mehr. Dann habe ich mir etwa heruntergeladen, und "Windows Defender Smartscreen" meint, ich solle die Finger davon lassen.

Hast Du so etwas schon gemacht? Welches Tool? Ein paar helfende Worte?
 
Hallo gngn,

wie schon geschrieben rede ich von Autohotkey, s. Hilfedatei.
Du installierst also AHK, schreibst die Zeile in eine .ahk-Datei und kompilierst sie per rechter Maustaste zu 'ner exe.
Die kannst du dann über den Shell-Befehl aus VBA heraus starten.
Ich habe eine ganze Sammlung von solchen Kommandozeilentools, die ich in VBA für all das verwende, was VBA selbst nicht kann, z. B. auch Senden der Win-Taste u. a.

Viele Grüße, Halwe
 
Zurück
Oben