VSTO-中止打开Excel工作簿

VSTO-中止打开Excel工作簿,excel,vsto,Excel,Vsto,我有一个Excel 2016工作簿,在打开时进行一些验证。我正在使用VSTO,下面是一段代码: Private Sub ThisWorkbook_Open() Handles Me.Open Try If (DoNotOpen()) Then Me.Close() 'this throws a System.Threading.ThreadAbortException ... 发生的异常不能被吞并,因为它将被重新抛出,正如所解释的那样。我理解引发

我有一个Excel 2016工作簿,在打开时进行一些验证。我正在使用VSTO,下面是一段代码:

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

发生的异常不能被吞并,因为它将被重新抛出,正如所解释的那样。我理解引发异常的原因(因为在完成打开工作簿之前关闭工作簿)。我正在寻找中止打开的最佳方法(我发现我可以通过执行Me.Application.Quit以编程方式完全关闭Excel,但这样做并不完全舒服,因为代码没有正确退出)。提前谢谢。

与其试图关闭(半)打开的工作簿,不如换一种方式。仅当您认为事件处理程序应该处于活动状态时才激活(添加)事件处理程序,以仅打开适当的工作簿


还有其他一些已知的替代方法,比如打开事件,有些非常棘手,比如当DoNotOpen()就位时激活计时器,隐藏打开的工作簿以及稍后计时器触发关闭打开的工作簿时,或者只打开工作簿集不可见,然后在Excel关闭时关闭,而不保存隐藏的工作簿。

谢谢您的建议。在Open()之前是否有我可以锁定的事件?您的第一个建议是在工作簿打开之前执行DoNotOpenCall()。我找不到这样做的方法。我也尝试过计时器的建议:我向这个工作簿添加了一个DontOpen布尔属性,在打开工作簿时设置它,然后调用我在新模块中添加的StartTimer函数。计时器函数async等待,然后读取DontOpen值,如果为True,则调用Close()。同样的错误,仍然…遗憾的是没有WorkbookBeforeOpen(cf WorkbookBeforeClose)事件(您可以通过进入VBA中的对象浏览器进行检查,选择应用程序对象,右键单击应用程序成员列表并选择组成员。现在,所有事件都集中在底部的列表中)。这里有一个延迟关闭计时器的例子:我认为你需要在计时器上使用一些时间,以使其符合你的需要。再次感谢你。您引用的计时器示例要求工作簿启用宏。由于客户强加的安全原因,我无法启用宏。我几乎可以得出这样的结论:如果不抛出ThreadAbortException,就没有已知的方法可以从托管代码关闭工作簿。这是不幸的,但不是交易破坏者(通过添加环境系统变量VSTO_SUPPRESSDISPLAYALERTS=1,可以抑制在Excel中显示错误消息)。最后一点注意:Me.Application.Quit关闭Excel的所有实例,因此使用它可能不安全。