Mam taki nawyk, że co około 5 minut naciskam magiczną kombinację klawiszy Ctrl+S, aby zapisać projekt. Czasami jednak człowiek jest tak wciągnięty w proces pisania kodu, że o tym zapomina. Po naciśnięciu klawisza F5 następuje chwila konsternacji bo nagle okazuje się, że mój kod wpada w nieskończoną pętlę i zawiesza całego Excela. A opcja autozapisu nie zawsze działa jak trzeba.
Po kilku takich sytuacjach zacząłem się zastanawiać, czy jest jakaś opcja autozapisu projektu tuż przed uruchomieniem programu. Nawet myślałem o tym, aby napisać jakąś wtyczkę do środowiska Visual Basic Editor, która przechwytuje zdarzenie uruchomienia programu i tuż przed tym zapisuje projekt. No, ale że pod IDE VBA nigdy nie pisałem rozszerzeń, to dość szybko się zniechęciłem tym pomysłem. Wtem nagle przyszło mi do głowy olśnienie…
Otóż w przypadku Excela możemy sprawdzić czy skoroszyt jest zapisany.
MsgBox ThisWorkbook.Saved
Jeśli zostanie zwrócona wartość False to oznacza, że skoroszyt nie został zapisany lub od czasu ostatniego zapisu dokonano jakiś zmian (np. dodano nową wartość do komórki). Co ciekawe jeśli zmieniliśmy zawartość jakiejś komórki, zapisaliśmy zmiany i w kodzie VBA choćby dopiszemy jeden znak nadal ThisWorkbook.Saved zwróci wartość False.
Wniosek? Otóż na początku naszego kodu możemy dopisać taką magiczną linijkę:
If ThisWorkbook.Saved = False Then ThisWorkbook.Save
Nie jest to może idealne rozwiązanie, ale jest proste i działa. Natomiast należy pamiętać, że jeśli piszesz dużą aplikację złożoną z wielu formularzy i przystępujesz do testowania nowo utworzonego formularza to należy ową linijkę dodać w zdarzeniu np. UserForm_Activate w nowo utworzonego formularza.
Pamiętaj jednak, aby usunąć tę linijkę z kodu produkcyjnego. Nie chciałbyś, aby użytkownik Twojej aplikacji bez Twojej wiedzy był na siłę uszczęśliwiany auto-zapisem skoroszytu w momencie, gdy np. pojawia się jakiś formularz Twojej aplikacji.
W przypadku Worda nasza magiczna linijka będzie nieco inna (tutaj mamy obiekt ThisDocument a nie ThisWorkbook)
If ThisDocument.Saved = False Then ThisDocument.Save
Z kolei w aplikacji PowerPoint mamy obiekt ActivePresentation więc nasz kod wygląda nastepująco:
If ActivePresentation.Saved = False Then ActivePresentation.Save