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,但由於代碼不能正確退出,所以我並不完全舒服。先謝謝你。
感謝您的建議。 Open()之前是否有事件發生,我可以鎖定?您的第一個建議是在工作簿打開之前執行DoNotOpenCall()。我找不到這樣做的方法。我也嘗試了計時器建議:我爲ThisWorkbook添加了一個DontOpen布爾屬性,在打開工作簿時設置它,然後調用我在新模塊中添加的StartTimer函數。定時器函數async等待,然後讀取DontOpen值並在True時調用Close()。同樣的錯誤,仍然... – Moto
可悲的是沒有WorkbookBeforeOpen(cf WorkbookBeforeClose)事件(您可以通過進入VBA中的對象瀏覽器,選擇應用程序對象並右鍵單擊應用程序成員列表並選擇組成員。所有的事件都在底部的列表中)。下面是延遲關閉計時器的例子之一:http://excelribbon.tips.net/T008192_Forcing_a_Workbook_to_Close_after_Inactivity.html我認爲你需要花一點時間在計時器上使用,以適應你的需要。 –
再次感謝您。您正在引用的計時器示例需要工作簿啓用宏。出於安全原因,我無法啓用宏。我非常接近地斷定,在沒有引發ThreadAbortException的情況下,沒有從託管代碼關閉工作簿的已知方法。這是不幸的,但不是一個交易斷路器(顯示Excel中的錯誤消息可以通過添加環境系統變量VSTO_SUPPRESSDISPLAYALERTS = 1來抑制)。最後一個注意事項:Me.Application.Quit關閉Excel的所有實例,因此可能不安全。 – Moto