Le câblage de l'événement interop double le time d'exécution de macro Excel VBA

J'ai un problème où le câblage d'un événement entraîne une double rotation de la macro vba en time d'exécution même lorsque l'événement ne se triggers pas.

À partir de l'intercalaire C #, j'appelle une macro dans un classur Excel qui calcule des informations de notation spécialisées pour une police d'assurance. Ce classur appelle également un autre classur pour calculer certains numbers de notation standard. Je transfère également un événement sur le classur ouvert afin que, si un user ouvre une feuille de calcul distincte (non reliée), il s'ouvre dans une instance d'application distincte. Tout cela fonctionne bien.

Les users fonctionnent dans un environnement VDI. Ils se plaignent parce que ce process prend jusqu'à 30 secondes et ils voudraient qu'il soit plus rapide. Sur une machine physique, il ne prend généralement que 3 à 10 secondes selon la politique.

En test, je remarque que si je ne filter pas l'événement ouvert du classur, le process est deux fois plus rapide (ou plus). Dès que j'ajoute l'événement, la macro prend deux fois plus pour compléter. Cela se produit même si le code dans l'événement n'est pas déclenché. J'ai ajouté des points de coupure et de la journalisation pour vérifier cela. L'événement n'est pas entré (sauf si j'ouvre une autre feuille de calcul bien sur).

Nous disposons également d'un complément VSTO personnalisé pour Excel. J'ai désinstallé ceci, mais cela ne fait aucune différence. J'ai essayé de déplacer le code ouvert du classur interop dans l'add-in et j'ai réussi à get des time d'exécution rapides, mais les développeurs supérieurs préfèrent que je ne mette pas le code là-dedans. Donc, ma question est de savoir pourquoi le câblage de l'événement ouvert du classur interop cause une telle augmentation du time d'exécution et existe-t-il un moyen d'éviter cela qui n'implique pas le déplacement du code dans le complément? J'utilise Excel 2010.

Code pertinent ci-dessous:

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);