W Excelu, jak w każdym innym programie, możemy zapisać zmiany w pliku, jak i zapisać plik pod zmienioną nazwą.
Idea Narzędzia
Niewiele programów oferuje jednak możliwość automatycznego tworzenia kopii pliku. Najlepiej z nazwą, która zawiera dokładny czas zapisu. Excel nie jest tutaj żadnym wyjątkiem. Ale od czego mamy VBA?
Moją intencją było stworzenie mechanizmu, który w momencie zapisu zmian, automatycznie zapisywałby również kopię pliku w tym samym folderze.
Bardzo ważne było to, aby nazwa pliku zawierała dokładny czas zapisu. W takiej sytuacji bowiem mogę posortować pliki wg daty zapisu, a tym samym wrócić do dowolnej wersji.
Kod Makra
Kod realizujący to zadanie znajduje się poniżej. Powinien zostać umieszczony w module skoroszytu, a nie w zwykłym module makr.
Private Const msMODUL As String = "ThisWorkbook"
Option Explicit
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim sSciezkaDoPliku As String
Const sFORMAT_DATY As String = "yyyy-mm-dd_hh-mm-ss"
'Zapisujemy tylko wtedy gdy user wybral opcje "Zapisz", a nie "Zapisz jako"
1 If SaveAsUI = False Then
'Zdefiniuj pelna sciezke zapisu
2 sSciezkaDoPliku = ThisWorkbook.Path & "\" & Format$(Now, sFORMAT_DATY, vbMonday) & _
"_[Kopia]_Budżet domowy.xlsm"
'Zapisz plik jako kopia pod wybrana lokalizacja
3 ThisWorkbook.SaveCopyAs Filename:=sSciezkaDoPliku
4 End If '// If SaveAsUI = False Then
End Sub
Analiza Makra
Najpierw sprawdziłem czy użytkownik faktycznie wybrał opcję Zapisz, a nie Zapisz jako…
Następnie zdefiniowałem ścieżkę do pliku, tak aby jego nazwa zaczynała się od roku, miesiąca, dnia, godziny, minuty i sekundy (format yyyy-mm-dd_hh-mm-ss). W ten sposób będę mógł docelowo sortować pliki wg czasu zapisu.
Na samym końcu skorzystałem z metody SaveCopyAs utworzyć kopię pliku, ale wciąż pracować na głównej wersji. W momencie zapisu kopii zapisują się również zmiany w pliku głównym ponieważ parametr Cancel nie został ustawiony na True.
Screen
W momencie zapisu zmian w pliku tworzy się kopia z informacją o czasie zapisu.