每天,一個人需要檢查具體的工作簿是否已經根據彭博和路透市場數據正確更新;即所有數據都已經通過並且'數字看起來正確'。過去,人們並沒有檢查導致其他系統上傳不準確的「數字」。如何正確有效地使用WorkbookBeforeClose事件?
的想法是,「東西」需要發展,防止關閉使用/保存工作簿,除非他/她已經檢查了更新正確/準確。 numbers look correct
動作純粹是一種直觀的練習,因此不會以任何方式進行編碼。
簡單的解決辦法是之前關閉所述特定工作簿,以驗證該數據已被檢查提示用戶。
使用VSTO SE爲Excel 2007,外接程序創建其中掛鉤到其被初始化在外接ThisAddIn_Startup
private void wb_BeforeClose(Xl.Workbook wb, ref bool cancel)
{
//.... snip ...
if (list.Contains(wb.Name))
{
DailogResult result = MessageBox.Show("some message", "sometitle", MessageBoxButtons.YesNo);
if (result != DialogResult.Yes)
{
cancel = true; // i think this prevents the whole application from closing
}
}
}
我已經找到了WorkbookBeforeClose
事件以下ThisApplication.WorkbookBeforeSave
vs ThisWorkbook.Application.WorkbookBeforeSave
其中建議,一要使用ThisApplication.WorkbookBeforeClose
事件,我認爲這是我正在做的事情,因爲將跨越所有打開的文件。
我使用該方法的問題是,假設我打開了幾個文件,其中一些文件位於我的list
中,該事件阻止Excel順序關閉所有文件。現在要求每個文件分別關閉。 編輯:發生這種情況時退出Excel從文件菜單中使用。
問題
- 我是否正確使用
WorkbookBeforeClose
事件,這是有效的&有效地利用事件的? - 我應該使用應用程序級事件
或文檔級別的事件? - 是正常上述行爲?
擺弄周圍,我也試過,嘗試從綁定的情況如下:
- 任何其他建議可在附加
更新[30-MAR-2010]使用在工作簿事件時歡迎從上面的鏈接建議打開的每個工作簿的BeforeClose
事件處理程序。
private void ThisAddIn_Startup(...)
{
// snip
Globals.ThisAddin.Application.WorkbookOpen += Application_Open;
}
private void Application_Open(XL.Workbook wb)
{
wb.BeforeClose += Document_WorkbookBeforeClose; // method does the same as above
}
,我發現這種方法的問題是,是我試圖關閉所有的Excel文件(使用退出Excel選項)事件處理程序不執行。根據我的觀察,當要檢查的文檔不是活動文檔時會發生這種情況。相比我最初的做法
這種方法似乎飄忽不定。每當文檔打開時,我不確定或感到舒服的一件事情就是綁定事件。
更新[07-APR-2010]:
格倫建議的回答是有用的,但不解決手頭現有的問題,我就此澄清了最後一個問題有點進一步。
我還發現這個博客How to Get an Excel VSTO Workbook Closed Event這是我的問題,因爲它可以替代的方法中使用顯示器型的方法來處理工作簿(並且還可能使用新引進的OnWorkbookClosed
事件來我的解決方案有些相關)。
更新[08-APR-2010]:
似乎有一些混亂,我不擔心在工作簿任何驗證自己,但我寧願該方法是否正在使用(即使用的應用程序級別WorkbookBeforeClose
事件)是正確的。 下面@Mathias的評論顯示了與問題3有關的部分問題的正確理解,我認爲這是默認的excel行爲。克服這個問題的解決方案是創建一個關閉功能,只關閉我的特定文件。
- 是正常上述行爲? 是的,但是爲什麼? 由於插件掛接到應用程序級別的事件中,事件的檢查和取消會阻止應用程序關閉任何其他工作簿。這裏的關鍵是
ref bool cancel
參數(cancel=false
允許工作簿(默認)正常關閉,cancel=true
防止關閉工作簿)
VS 2005 VSTO SE
只是爲了確保我正確地理解你的問題,這是你心目中的場景:用戶文件A,B,C開>關閉的Excel(退出Excel)>的回答是肯定要關閉,沒有到文件B. 你目前有什麼:Excel取消關閉A和B和C. 你想要什麼:Excel關閉A,保持B打開,並繼續詢問C是否應該關閉。 我能正確理解你的問題嗎?即您的問題是當用戶退出Excel時,您希望能夠關閉可以關閉的文件,並且只保留需要驗證的文件。 – Mathias 2010-04-07 18:50:28
另外我開始玩這個遊戲,並且2種方法(在應用程序級別或工作簿級別關閉的工作簿)在我的機器上的行爲方式完全相同。 – Mathias 2010-04-07 18:53:39
@mathias - 確切地說,我需要進一步更新問題,因爲我設法實現了你所描述的 – Ahmad 2010-04-08 05:14:19