VSTO - 中止打开 Excel 工作簿
VSTO - Abort opening an Excel workbook
我有一个 Excel 2016 工作簿,它在打开时进行了一些验证。我正在使用 VSTO,这里是代码片段:
Private Sub ThisWorkbook_Open() Handles Me.Open
Try
If (DoNotOpen()) Then
Me.Close() 'this throws a System.Threading.ThreadAbortException
...
发生的异常不能被吞噬,因为它将被重新抛出,如解释的那样here。我明白为什么抛出异常(因为在打开工作簿之前关闭它)。我正在寻找中止打开的最佳方法(我发现我可以通过执行 Me.Application.Quit 以编程方式完全关闭 Excel,但我这样做并不完全舒服,因为代码没有正确退出).提前谢谢你。
与其尝试关闭(一半)打开的工作簿,不如考虑以相反的方式工作。仅当您认为事件处理程序应该处于活动状态以仅打开适当的工作簿时才激活(添加)事件处理程序。
还有其他已知的替代方案,其中打开事件就位,有些非常棘手,比如在 DoNotOpen() 就位时激活计时器,隐藏打开的工作簿,稍后当计时器触发关闭打开的工作簿时或者只打开设置为不可见的工作簿并在 Excel 关闭时关闭而不保存隐藏的工作簿。
我有一个 Excel 2016 工作簿,它在打开时进行了一些验证。我正在使用 VSTO,这里是代码片段:
Private Sub ThisWorkbook_Open() Handles Me.Open
Try
If (DoNotOpen()) Then
Me.Close() 'this throws a System.Threading.ThreadAbortException
...
发生的异常不能被吞噬,因为它将被重新抛出,如解释的那样here。我明白为什么抛出异常(因为在打开工作簿之前关闭它)。我正在寻找中止打开的最佳方法(我发现我可以通过执行 Me.Application.Quit 以编程方式完全关闭 Excel,但我这样做并不完全舒服,因为代码没有正确退出).提前谢谢你。
与其尝试关闭(一半)打开的工作簿,不如考虑以相反的方式工作。仅当您认为事件处理程序应该处于活动状态以仅打开适当的工作簿时才激活(添加)事件处理程序。
还有其他已知的替代方案,其中打开事件就位,有些非常棘手,比如在 DoNotOpen() 就位时激活计时器,隐藏打开的工作簿,稍后当计时器触发关闭打开的工作簿时或者只打开设置为不可见的工作簿并在 Excel 关闭时关闭而不保存隐藏的工作簿。