W dzisiejszej notce chciałbym napisać o sposobach na odczytanie daty utworzenia i modyfikacji skoroszytu.
Sposoby
Możliwości jest przynajmniej kilka i co ciekawe, dają różne wyniki. Nie jest to jednak żaden błąd jak mogłoby się wydawać, wręcz przeciwnie – sposoby te uzupełniają się wzajemnie i inaczej traktują moment utworzenia pliku, o czym przekonamy się analizując trzy funkcje VBA.
Dodatkowo przeanalizujemy dwie funkcje, które określają datę ostatniej modyfikacji pliku.
Funkcje VBA
Rozważmy takie funkcje VBA, które odczytują datę utworzenia i modyfikacji pliku.
Function CreatedByFileDateTime() As Date
CreatedByFileDateTime = FileDateTime(ThisWorkbook.FullName)
End Function
Public Function CreatedByBookProperty() As Date
CreatedByBookProperty = ThisWorkbook.BuiltinDocumentProperties("Creation Date")
End Function
Public Function CreatedByFSO() As Date
Dim fs As Object, f As Object
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.GetFile(ThisWorkbook.FullName)
CreatedByFSO = f.DateCreated
Set fs = Nothing
Set f = Nothing
End Function
Public Function ModifiedByBookProperty() As Date
ModifiedByBookProperty = ThisWorkbook.BuiltinDocumentProperties("Last Save Time")
End Function
Public Function ModifiedByFSO() As Date
Dim fs As Object, f As Object
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.GetFile(ThisWorkbook.FullName)
ModifiedByFSO = f.DateLastModified
Set fs = Nothing
Set f = Nothing
End Function
Pierwsza opiera się na wbudowanej funkcji VBA FileDateTime. Druga na właściwości BuiltinDocumentProperties i stałej Creation Date obiektu Workbook. Trzecia na bibliotece Scripting.FileSystemObject oferującej szeroki dostęp do plików i katalogów na dysku twardym.
Przykład
Aby lepiej unaocznić różnicę, opiszę taki przykład.
Kilka miesięcy temu ściągnąłem z internetu pewien skoroszyt Excela. Wczoraj wieczorem (czyli 28 lipca) postanowiłem skopiować ten plik na pulpit i zmienić mu nazwę.
Wgrałem do niego wszystkie te funkcje, które wkleiłem powyżej.
Teraz, kiedy piszę tego newsa (29 lipca) kilka razy zapisałem zmiany w pliku, a także przeliczyłem jeszcze raz wszystkie formuły.
Screen
Rezultaty tych funkcji są bardzo ciekawe, co pokazuje screen poniżej.
FileDateTime
Pierwsza funkcja CreatedByFileDateTime nie zwraca mi daty utworzenia pliku, lecz czas jego ostatniego zapisu.
Jak możemy wyczytać w helpie „In Excel, the FileDateTime function returns the date and time of when a file was created or last modified”.
Wszystko jest zatem jasne – funkcja ta nie jest zbyt pewna do określania daty utworzenia pliku, ale można ją wykorzystać do przechowywania czasu ostatniego zapisu pliku.
BuiltinDocumentProperties(“Creation Date”)
Druga funkcja CreatedByBookProperty daje bardzo ciekawy wynik – 25 stycznia 2006r….
Ta dziwna data to rzeczywisty czas utworzenia tego pliku po raz pierwszy (pierwsza data zapisu). Jakiekolwiek modyfikacje pliku (zmiana nazwy, przeniesienie na inny dysk, wysłanie e`mailem) nie wpływają na zmianę tej wartości. W większości przypadków jest to rozwiązanie, o które nam chodzi.
GetFile.DateCreated
Trzecia funkcja CreatedByFSO korzysta z zewnętrznej biblioteki Scripting.FileSystemObject i jako datę pokazuje wczorajszy wieczór, czyli moment skopiowania pliku na pulpit. Jest to równoznaczne z utworzeniem nowego pliku na dysku.
BuiltinDocumentProperties(“Last Save Time”)
Czwarta funkcja ModifiedByBookProperty pokazuje datę ostatniego zapisu pliku. Co ciekawe skopiowanie pliku w inne miejsce nie zmienia tej wartości – liczy się rzeczywisty ostatni czas zapisu.
GetFile.DateLastModified
Ostatnia funkcja ModifiedByFSO rejestruje natomiast wszelkie modyfikacje związane z plikiem.
Witaj Mariusz,
Właśnie testuję sposób piąty i zauważyłem chyba ciekawą rzecz:
Jeśli uruchamiam funkcję dzisiaj (05.11.2015) i sprawdzam datę modyfikacji pliku utworzonego wczoraj, to wszystko się zgadza. Natomiast jeśli chcę sprawdzić datę pliku zmodyfikowanego w lipcu, to mam godzinne przesunięcie. Zmiana czasu?