2016-03-01 137 views
0

我有一個Excel 2016工作簿,在打開時會進行一些驗證。我使用VSTO,這裏的代碼片段:VSTO - 中止打開Excel工作簿

Private Sub ThisWorkbook_Open() Handles Me.Open 
    Try 
     If (DoNotOpen()) Then 
      Me.Close() 'this throws a System.Threading.ThreadAbortException 
... 

出現無法被吞噬的例外,因爲它會被再次拋出,作爲解釋here。我明白爲什麼拋出異常(因爲在完成打開工作簿之前關閉工作簿)。我正在尋找放棄開放的最佳方式(我發現我可以通過執行Me.Application.Quit以編程方式完全關閉Excel,但由於代碼不能正確退出,所以我並不完全舒服。先謝謝你。

回答

0

而不是試圖關閉(一半)打開的工作簿考慮另一種方式。只有當您認爲它應該處於活動狀態才能激活(添加)事件處理程序才能打開正確的工作簿。

還有其他已知的替代方案,其中有一些非常棘手的開放事件,比如在DoNotOpen()就位時激活Timer,隱藏打開的工作簿,稍後當計時器觸發關閉打開的工作簿或稍後只需打開不可見的工作簿並在Excel關閉時關閉而不保存隱藏的工作簿。

+0

感謝您的建議。 Open()之前是否有事件發生,我可以鎖定?您的第一個建議是在工作簿打開之前執行DoNotOpenCall()。我找不到這樣做的方法。我也嘗試了計時器建議:我爲ThisWorkbook添加了一個DontOpen布爾屬性,在打開工作簿時設置它,然後調用我在新模塊中添加的StartTimer函數。定時器函數async等待,然後讀取DontOpen值並在True時調用Close()。同樣的錯誤,仍然... – Moto

+0

可悲的是沒有WorkbookBeforeOpen(cf WorkbookBeforeClose)事件(您可以通過進入VBA中的對象瀏覽器,選擇應用程序對象並右鍵單擊應用程序成員列表並選擇組成員。所有的事件都在底部的列表中)。下面是延遲關閉計時器的例子之一:http://excelribbon.tips.net/T008192_Forcing_a_Workbook_to_Close_after_Inactivity.html我認爲你需要花一點時間在計時器上使用,以適應你的需要。 –

+0

再次感謝您。您正在引用的計時器示例需要工作簿啓用宏。出於安全原因,我無法啓用宏。我非常接近地斷定,在沒有引發ThreadAbortException的情況下,沒有從託管代碼關閉工作簿的已知方法。這是不幸的,但不是一個交易斷路器(顯示Excel中的錯誤消息可以通過添加環境系統變量VSTO_SUPPRESSDISPLAYALERTS = 1來抑制)。最後一個注意事項:Me.Application.Quit關閉Excel的所有實例,因此可能不安全。 – Moto

相關問題