我有一个问题,即使事件没有被触发,连接事件也会导致 vba 宏的执行时间加倍。
在 C# interop 中,我在 Excel 工作簿中调用了一个宏,用于计算保险单的专门评级信息。该工作簿还调用另一个工作簿来计算一些标准评级数字。我还在工作簿打开时连接了一个事件,这样如果用户打开一个单独的(不相关的)电子表格,它就会在一个单独的应用程序实例中打开。这一切都很好。
用户在 VDI 环境中操作。他们抱怨是因为这个过程最多需要 30 秒,他们希望它更快。在物理机上,通常只需要 3-10 秒,具体取决于策略。
在测试中,我注意到如果我不连接工作簿打开事件,那么这个过程会快两倍(或更多)。一旦我将事件添加回来,宏就需要两倍的时间才能完成。即使未触发事件中的代码也会发生这种情况。我添加了断点和日志来检查这一点。没有输入事件(当然,除非我打开另一个电子表格)。
我们还有一个用于 Excel 的自定义 VSTO 加载项。我已经卸载了它,但它没有任何区别。我已经测试了将互操作工作簿开放代码移动到加载项中并设法获得快速执行时间,但高级开发人员希望我不要将代码放在那里。所以我的问题是为什么连接互操作工作簿打开事件会导致执行时间增加,有没有办法防止这种情况不涉及将代码移动到加载项中?我正在使用 Excel 2010。
相关代码如下:
var args = new object[] {"RateProcess", "StandardRating.xls"};
_spreadsheet = new Application();
Workbooks workbooks = _spreadsheet.Workbooks;
_commonWorkbook = workbooks.Open("StandardRating.xls", 0, false, 5, "", "", true,
XLPlatform.xlWindows, "\t", true, false, 0, false, false, XLCorruptLoad.xlNormalLoad);
_specialisedWorkbook = workbook.Open("SpecialisedRating.xls", 0, false, 5, "", "", true, XlPlatform.xlWindows, "\t", true, false, 0, false, false, XlCorruptLoad.xlNormalLoad);
// This line causes the problem.
_spreadsheet.WorkbookOpen += spreadsheet_WorkbookOpen;
_spreadsheet.GetType().InvokeMember("Run", BindingFlags.Default | BindingFlags.InvokeMethod, null, _spreadsheet, args);