2013-08-06 23 views
4

我正在開發Excel 2010應用程序級外接程序。我需要爲與Workbook接口相關的一些Application事件編寫處理程序,尤其是NewWorkbook事件。Excel VSTO NewWorkbook事件不會在啓動時發生

所以在ThisAddIn_Startup處理我加了這樣的代碼:

Microsoft.Office.Interop.Excel.AppEvents_Event app = Globals.ThisAddIn.Application; 
app.NewWorkbook += MyApp_NewWorkbook; 

當內運行Excel實例創建新的工作簿,它工作正常。但是,當我運行新的Excel實例(在標準情況下,這意味着創建新的工作簿),這個事件不會被我的處理程序捕獲。那麼我想,當我運行新的Excel實例時,NewWorkbook事件發生在ThisAddIn_Startup事件之前。

如果WorkbookOpen事件應用程序的行爲與我所期望的相同 - 當我在運行的Excel實例中打開現有工作簿時以及當我只是雙擊該文件時,捕獲事件。我想知道爲什麼這些事件的處理方式不同?

在這種情況下該怎麼辦?我需要識別是否創建了新的工作簿,或者是否已打開現有工作簿,無論Excel是否已在運行。

+0

我認爲空的工作簿模板並不算作「打開工作簿」。你將不得不註冊一些應用程序啓動事件來處理這種情況。 –

回答

1

如何在加載項加載時打開的所有工作簿上執行操作?

像這樣在ThisAddIn_Startup處理程序? (這裏沒有IDE,所以用手寫):

foreach (var workbook in Globals.ThisAddIn.Application.Workbooks) 
{ 
    // Do your thing 
} 

然後使用您的事件處理來捕獲隨後打開的任何工作簿。

+0

我在想這個解決方案,可能它是唯一的一個,但與Kiru的答案相結合。在啓動時,我將遍歷所有工作簿的集合,並對未保存的工作簿執行我的操作。這將消除處理Workbook打開兩次的風險 - 在啓動時以及在WorkbookOpen事件處理程序中。 – Rav

1

在WorkbookOpen事件支票

string.IsNullOrEmpty(application.ActiveWorkbook.Path) 

這意味着你的工作簿永遠不會保存。對於上面的行,打開Excel時創建的所有新工作簿都是正確的。

+0

沒關係,但它不包括創建新工作簿的情況,因爲WorkbookOpen事件不會引發。但我可以考慮在其他地方使用它 - 例如在啓動時:) – Rav

+0

我會將它與Chris Spicer的答案結合起來,希望它能起作用。 – Rav

相關問題