2013-01-07 23 views
5

Mam dodatek z obiektem aplikacji. Obiekt jest zadeklarowany WithEvents. Dzięki temu mogę opróżniać niektóre punkty danych do centralnej bazy danych za każdym razem, gdy użytkownik zapisuje plik. Działa to przez większość czasu. Istnieje jednak jeden użytkownik, który zamyka program Excel, który wywołuje okno dialogowe Zapisz. Wygląda na to, że zamknięcie programu Excel z niezapisanym plikiem oznacza, że ​​zdarzenie WorkbookBeforeSave nie uruchamia się.Excel VBA - WorkbookBeforeSave Event Czy

Podkreślam, że zdarzenie zostało wywołane, gdy użytkownik kliknie CTRL-S, lub naciśnie przycisk zapisu. Potwierdziłem również, że zdarzenie NIE uruchomi się, jeśli zamknę aplikację.

Mogę wymyślić kilka obejść (na przykład automatycznie zapisuję co 10 sekund), ale nie szaleję z tego powodu. Czy ktokolwiek może potwierdzić to zachowanie i/lub czy ktoś ma lekarstwo?

Option Explicit 

Private WithEvents mapp As Excel.Application 

Private Sub mapp_WorkbookBeforeSave(ByVal Wb As Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean) 

    ' Sanity preservation device 
    Msgbox "WorkbookBeforeSave event fired." 
    SaveSomeData Wb 

End Sub 
+0

, więc czy zdarzenie w ogóle się wystrzeliwuje? Być może chcesz się upewnić, że 'Application.enableEvents = True' – Larry

+0

Tak, zdarzenie zostanie wywołane, jeśli zapisuję skoroszyt za pomocą CTRL-S lub wciskam przycisk zapisu na wstążce. Jednakże, jeśli zakończę program Excel (ALT-F4), zostanie wyświetlony monit o zapisanie pliku, ale zdarzenie WorkbookBeforeSave nie zostanie uruchomione. Gdyby było coś takiego jak OnQuit lub coś dla obiektu Application, użyłbym tego. Jednak nie widzę czegoś takiego. – PirateGrunt

Odpowiedz

2

Czy zastanawiałeś się nad wykorzystaniem przed BeforeClose? To może być lepsza alternatywa.

5

Można użyć rutyny Workbook_BeforeClose i właściwości obiektu skoroszytu obiektu Saved.

Private Sub Workbook_BeforeClose(Cancel As Boolean) 

    If ThisWorkbook.Saved = False Then 
     'Call save function 
    End If 

End Sub 
+0

Niestety nie mogę użyć zdarzenia BeforeClose. Oto trochę więcej: kiedy tu przybyłem, były setki plików Excel, które miały mniej więcej takie samo kodowanie, ale dla każdego klienta był osobny plik. Próbując wydobyć te pliki dla informacji, utworzyłem dodatek, który zapisałby dane do bazy danych Access. Aby użyć BeforeClose, musiałbym dodać to wydarzenie do setek skoroszytów. Ugh. Dodatkowym problemem jest to, że skoroszyty są dość duże, około 15 MB każdy. Jeśli otworzę dziesięć z nich, zabraknie mi pamięci. Zrobimy to inaczej, idąc dalej, sprzątając teraz spuściznę. – PirateGrunt

+0

Brzmi jak raczej lepka sytuacja, w której się tam znajdujesz! Upewnij się, że dodasz to wszystko do pytania, ja osobiście nie potrafię wymyślić schludnego rozwiązania, ale inni mogą to zrobić. Powodzenia. –