Live-Forum - Die aktuellen Beiträge
Datum
Titel
29.03.2024 13:14:12
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1672to1676
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Dateieigenschaften: Datumswerte

Dateieigenschaften: Datumswerte
01.02.2019 14:04:28
Sven
Hallo zusammen,
da wir viel mit teilweise sehr alten Exceldateien unterschiedlicher Herkunft arbeiten, benötigen wir eine kleine Historie der Dateien.
Hierfür haben wir ein Makro, welches Informationen ausliest und darstellt. Genutzt werden die BuildinDocumentProperties (BiDP) sowie das FileSystemObject (FSO).
If Workbooks.Count > 0 Then
Set FSO = CreateObject("Scripting.FileSystemObject")
Set objFile = FSO.GetFile(ActiveWorkbook.FullName)
'Dates
lstHist.Clear
With lstHist
'BiDP: Last print date
On Error Resume Next
.AddItem "BiDP"
.List(0, 1) = "Druck"
.List(0, 2) = ActiveWorkbook.BuiltinDocumentProperties(10).Value
.List(0, 3) = ""
On Error GoTo 0
'BiDP: Creation date (and Author)
On Error Resume Next
.AddItem "BiDP"
.List(1, 1) = "Erstellung"
.List(1, 2) = ActiveWorkbook.BuiltinDocumentProperties(11).Value
.List(1, 3) = ActiveWorkbook.BuiltinDocumentProperties(3).Value
On Error GoTo 0
'BiDP: Last save time (and Last Author)
On Error Resume Next
.AddItem "BiDP"
.List(2, 1) = "Speicherung"
.List(2, 2) = ActiveWorkbook.BuiltinDocumentProperties(12).Value
.List(2, 3) = ActiveWorkbook.BuiltinDocumentProperties(7).Value
On Error GoTo 0
'FSO: DateCreated
On Error Resume Next
.AddItem "FSO"
.List(3, 1) = "Erstellung"
.List(3, 2) = objFile.DateCreated
.List(3, 3) = ""
On Error GoTo 0
'FSO: DateLastModified
On Error Resume Next
.AddItem "FSO"
.List(4, 1) = "Änderung"
.List(4, 2) = objFile.DateLastModified
.List(4, 3) = ""
On Error GoTo 0
'FSO: DateLastAccessed
On Error Resume Next
.AddItem "FSO"
.List(5, 1) = "Zugriff"
.List(5, 2) = objFile.DateLastAccessed
.List(5, 3) = ""
On Error GoTo 0
End With
Die Liste wird anschließend nach Datum sortiert und tut gut ihren Dienst.
Aber:
- Wie kann es sein, dass das BiDP-CreationDate manchmal einige Jahre vor dem DateCreated im FSO liegt? Was ist in diesen Fällen mit der Datei passiert?
- Außerdem ist aufgefallen, dass DateLastModified sowie DateLastAccessed (FSO) in der Regel identisch sind. Kann das jemand bestätigen?
- Öffne ich die Dateieigenschaften im Windows-Explorer finde ich die FSO-Informationen auf dem ersten Reiter "Allgemein" wieder. Auf dem Reiter "Details" gibt es unter Ursprung aber ein "Letzte Speicherung"-Datum, welches weder einem der FSO- noch einem BiDP-Wert entspricht. Wo kommt der denn her?
- Und letztlich: Die BiDPs kann ich ja jederzeit ändern. Lassen sich auch die anderen Dateiinformationen anpassen?
Ich danke Euch!

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Crosspost ohne Hinweis
01.02.2019 14:21:16
Werner
Hallo Sven,
würdest du bitte deine Beiträge in den verschiedenen Foren untereinander verlinken.
Gruß Werner
AW: Crosspost ohne Hinweis
01.02.2019 14:37:06
Sven
Hallo Werner,
man muss also hier schreiben, dass man die Frage auch anderswo gestellt hat? Also sieht ein Beitrag dann so aus:
"Hallo Leute, könnt Ihr mir die Frage im Forum-XY bitte beantworten? Ihr müsst Euch dann da bitte nur anmelden."
Was soll das bringen?
AW: Crosspost ohne Hinweis
01.02.2019 14:43:01
Werner
Hallo Sven,
auch eine Einstellung, ob die aber richtig ist überlasse ich dem geneigten Mitleser.
Scheint dir ja egal zu sein, dass u.U. in verschiedenen Foren verschiedene Helfer an deinem Problem arbeiten, ohne voneinander zu wissen. Da ist Doppelarbeit bzw. Arbeit für den Papierkorb vorprogrammiert. Aber kostet ja nichts oder?
Wenn du zum Bahnhof fahren willst, bestellst du dann auch 3 Taxis, kommen halt zwei umsonst, aber wahrscheinlich nicht kostenlos.
Gruß Werner
Anzeige
AW: Crosspost ohne Hinweis
01.02.2019 14:51:38
Sven
Hallo Sven,
ich bestelle hier keine fertig entwickelte Anwendung, sondern habe eine kleine Frage zu einem Code.
Dein Beispiel passt demnach natürlich nicht.
Sehr wohl Frage ich Freunde und Bekannte auf Party A nach ihrer Meinung und manchmal sogar auch noch auf Party B. Die Leute auf Party B haben dann in der Regel besseres zu tun, als die Teilnehmer von Party A zu fragen, ob das Thema da schon mal aufgekommen ist. Sie reden mit mir oder lassen es sein.
Dass Du in unterschiedlichen Foren die Beiträge abgleichst und Dich dann beschwerst, dass man nicht nur eines nutzt ist - nun - beeindruckend.
Anzeige
AW: Crosspost ohne Hinweis
01.02.2019 14:54:34
SF
Hola,
du fragst in zwei Foren, bekommst in beiden die Lösung, mindestens einer hat also umsonst gearbeitet da er nicht nachschauen konnte, ob du schon eine Lösung hast. Auch beeindruckend?
Arbeitest du gerne umsonst?
Gruß,
steve1da
in midestens 3 o.w.T.
01.02.2019 14:56:36
Werner
AW: Dateieigenschaften: Datumswerte
01.02.2019 17:33:59
Nepumuk
Hallo Sven,
zur Frage 3:
ja, die Werte lassen sich ändern. Die Datümer per API. Die anderen Daten per DSO. Und das ohne die Datei zu öffnen was ja wieder die Daten von LastAccess und LastModify ändern würde.
Gruß
Nepumuk
AW: Dateieigenschaften: Datumswerte
04.02.2019 09:07:12
Sven
Hallo Nepumuk,
vielen Dank.
Hast Du ggf. noch einen Link für mich?
Schöne Grüße
Sven
AW: Dateieigenschaften: Datumswerte
04.02.2019 13:32:20
Nepumuk
Hallo Sven,
Datum und Zeit ändern geht so:
Option Explicit

Private Declare Function GetFileTime Lib "kernel32.dll" ( _
    ByVal hFile As Long, _
    ByRef lpCreationTime As FILETIME, _
    ByRef lpLastAccessTime As FILETIME, _
    ByRef lpLastWriteTime As FILETIME) As Long
Private Declare Function SetFileTime Lib "kernel32.dll" ( _
    ByVal hFile As Long, _
    ByRef lpCreationTime As FILETIME, _
    ByRef lpLastAccessTime As FILETIME, _
    ByRef lpLastWriteTime As FILETIME) As Long
Private Declare Function CreateFileA Lib "kernel32.dll" ( _
    ByVal lpFileName As String, _
    ByVal dwDesiredAccess As Long, _
    ByVal dwShareMode As Long, _
    ByRef lpSecurityAttributes As Long, _
    ByVal dwCreationDisposition As Long, _
    ByVal dwFlagsAndAttributes As Long, _
    ByVal hTemplateFile As Long) As Long
Private Declare Function SystemTimeToFileTime Lib "kernel32.dll" ( _
    ByRef lpSystemTime As SYSTEMTIME, _
    ByRef lpFileTime As FILETIME) As Long
Private Declare Function LocalFileTimeToFileTime Lib "kernel32.dll" ( _
    ByRef lpLocalFileTime As FILETIME, _
    ByRef lpFileTime As FILETIME) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" ( _
    ByVal hObject As Long) As Long

Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type

Private Type SYSTEMTIME
    wYear As Integer
    wMonth As Integer
    wDayOfWeek As Integer
    wDay As Integer
    wHour As Integer
    wMinute As Integer
    wSecond As Integer
    wMilliseconds As Integer
End Type

Private Const GENERIC_WRITE = &H40000000
Private Const OPEN_EXISTING = 3&
Private Const FILE_SHARE_READ = &H1
Private Const FILE_SHARE_WRITE = &H2

Public Sub ChangeFiletime()
    Dim udtFileTime1 As FILETIME, udtFileTime2 As FILETIME
    Dim udtFileTime3 As FILETIME, udtFileTimeNew As FILETIME
    Dim udtLocalTime As FILETIME, udtSystemTime As SYSTEMTIME
    Dim dtmNewFiletime As Date, lngHandle As Long
    dtmNewFiletime = DateAdd("d", -10, Now) '10 Tage vor Heute
    udtSystemTime.wYear = Year(dtmNewFiletime)
    udtSystemTime.wMonth = Month(dtmNewFiletime)
    udtSystemTime.wDay = Day(dtmNewFiletime)
    udtSystemTime.wDayOfWeek = Weekday(dtmNewFiletime)
    udtSystemTime.wHour = Hour(dtmNewFiletime)
    udtSystemTime.wMinute = Minute(dtmNewFiletime)
    udtSystemTime.wSecond = Second(dtmNewFiletime)
    udtSystemTime.wMilliseconds = 0
    SystemTimeToFileTime udtSystemTime, udtLocalTime
    LocalFileTimeToFileTime udtLocalTime, udtFileTimeNew
    lngHandle = CreateFileA("C:\Test.xls" _
        , GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, _
        ByVal 0&, OPEN_EXISTING, 0&, 0&)
    ' 1 = Erstellt , 2 = letzter Zugriff , 3 = geändert
    GetFileTime lngHandle, udtFileTime1, udtFileTime2, udtFileTime3
    SetFileTime lngHandle, udtFileTime1, udtFileTime2, udtFileTimeNew
    CloseHandle lngHandle
End Sub

Die DSo-DLL kannst du die heir herunterladen:
https://www.microsoft.com/en-us/download/confirmation.aspx?id=8422
Hier ein Beispiel wie du den Titel und den Autor ändern kannst:
Option Explicit

Public Sub SubMetaDatenBearbeiten()
    
    Dim objOleDocumentProperties As DSOFile.OleDocumentProperties
    Dim objSummaryProperties As DSOFile.SummaryProperties
    
    Set objOleDocumentProperties = New DSOFile.OleDocumentProperties
    
    objOleDocumentProperties.Open "G:\Eigene Dateien\Eigene Dokumente\Addin_Anleitung.doc" 'Anpassen!!!
    
    Set objSummaryProperties = objOleDocumentProperties.SummaryProperties
    
    Debug.Print objSummaryProperties.Title
    Debug.Print objSummaryProperties.Author
    
    objSummaryProperties.Title = "Der Titel"
    objSummaryProperties.Author = "Der Autor"
    
    objOleDocumentProperties.Save
    
    Debug.Print objSummaryProperties.Title
    Debug.Print objSummaryProperties.Author
    
    objOleDocumentProperties.Close
    
    Set objSummaryProperties = Nothing
    Set objOleDocumentProperties = Nothing
End Sub

Das funktioniert aber nur bei Office-Dateien.
Gruß
Nepumuk
Anzeige
AW: Dateieigenschaften: Datumswerte
04.02.2019 14:40:39
Sven
Super, vielen Dank!
AW: Dateieigenschaften: Datumswerte
04.02.2019 14:49:00
Sven
Hallo Nepumuk,
noch eine Kleinigkeit:
Wenn ich die BuiltinDocumentProperties(12) auf ein anderes Datum setze, klappt das zwar temporär, beim Speichern wird der Wert aber ja wieder mit dem dann aktuellen überschrieben. Kennst Du eine Möglichkeit, auch diesen Wert zu korrigieren?
Grüße
Sven
AW: Dateieigenschaften: Datumswerte
04.02.2019 15:19:21
Nepumuk
Hallo Sven,
nein. Das geht auch mit DSO-File nicht da die Eigenschaft schreibgeschützt ist.
Gruß
Nepumuk

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige