Excel 更改加载项的加载行为



我创建了一个 Excel VSTO 加载项,用户可以安装该加载项。但是,使用外接程序后,下次启动 Excel 时,不会再自动加载外接程序。

用户可以通过启用加载项来解决此问题,但每次都会发生这种情况,我想停止此操作。

发生的情况是,在注册表中,键:HKEY_CURRENT_USERSoftwareMicrosoftOfficeExcelAddinsTiaGeneratorLoadBehavior设置为 2,表示默认情况下处于非活动状态。我可以将其改回 3(启动时加载),但在运行 Excel 后,它又改回 2。

编辑: 正如@Cindy Meister所说:Excel应该在启动后将加载行为更改为3,因此一定存在问题。经过一番搜索,事实证明问题出在一个名为 ErrorWriter 的自制类的构造函数中。问题似乎出在此调用中:

Public Class Errorwriter
Inherits IO.StreamWriter
Sub New()
MyBase.New("C:tmpnewLog.txt")
End Sub
End Class

有谁知道为什么这会导致 Excel 更改加载行为?

感谢@Cindy Meister的评论,我能够更深入地挖掘,这是我发现的:

通常,如果加载项在启动期间遇到未经处理的异常,Excel 会更改加载项的加载行为。

在启动例程中,我创建了一个"ErrorWriter"对象的新实例,该实例继承自"StreamWriter",并使用对此文件的引用。

发生的情况是加载了Excel,锁定了此文件。使用此加载项的某些功能后,将在后台启动第二个 Excel 实例,该实例也会尝试使用此文件。这会导致未经处理的异常,但由于第二个实例不可见,因此永远不会向用户(或程序员)显示此错误。

由于 Excel 的第二个实例中不需要 ErrorWriter,因此永远不清楚错误是否以任何方式被阻止。

这会导致 Excel 更改其加载行为。

通过将有问题的代码移动到单独的函数中来修复此问题,该函数仅在调用加载项函数时调用。

我已经彻底调查了这个问题并找到了解决方案。更改"LoadBehavior"是正确的方法,但您必须小心一件事。Outlook 或 Excel 都会还原每个加载项的先前设置。但不是在加载项开始时,而是在加载项启动之后。

换句话说,如果您尝试在启动过程中更改Windows注册表中的加载行为,它将永远无法正常工作。之后你必须这样做。

我希望这会有所帮助。 谢谢你,VJ

最新更新