2013-01-07 36 views
5

我有一個外接與應用對象。該對象被聲明爲WithEvents。這使我可以在每次用戶保存文件時將某些數據點刷新到中央數據庫。這在大部分時間都適用。但是,有一個用戶退出Excel應用程序,該應用程序調用保存對話框。看起來,使用未保存的文件退出Excel意味着WorkbookBeforeSave事件不會觸發。Excel的VBA - WorkbookBeforeSave事件不

只是強調,我已經證實,當用戶點擊CTRL-S,或按下保存按鈕時會被觸發。我也證實,如果我退出申請,事件不會觸發。

我可以想到幾個解決方法(例如每10秒自動保存一次),但我對此並不滿意。任何人都可以證實這種行爲和/或任何人有補救措施?

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

事件還是會發生?也許你想確認'Application.enableEvents = True' – Larry

+0

是的,如果我使用CTRL-S保存工作簿或按功能區中的保存按鈕,事件會觸發。不過,如果我退出Excel(ALT-F4),那麼我會提示保存文件,但WorkbookBeforeSave事件不會被解僱。如果在Application對象中有OnQuit之類的東西,我會使用它。但是,我沒有看到這樣的事情。 – PirateGrunt

回答

2

您是否考慮過在BeforeClose之前使用?這可能是一個更好的選擇。

5

您可以使用Workbook_BeforeClose日常和工作簿對象的Saved財產。

Private Sub Workbook_BeforeClose(Cancel As Boolean) 

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

End Sub 
+0

不幸的是,我無法使用BeforeClose事件。這裏有更多的背景:當我來到這裏,有數以百計的Excel文件,其或多或少相同的編碼,但沒有爲每個客戶單獨的文件。在試圖挖掘這些文件以獲取信息時,我創建了一個將數據寫入Access數據庫的加載項。要使用BeforeClose,我必須將該事件添加到數百個工作簿中。啊。另外一個問題是工作簿都很大,大約每個15MB。如果我打開其中的十個,我的內存不足。我們將以不同的方式繼續前進,現在清理遺產。 – PirateGrunt

+0

聽起來像是你有事情有一個相當棘手的局面!確保你把所有的問題都加入到了這個問題中,我個人不會想到一個簡潔的解決方案,但其他人可能能夠做到。祝你好運。 –