イベントを配線すると、イベントがトリガーされない場合でも、vba マクロの実行時間が 2 倍になるという問題があります。
C# 相互運用機能から、保険証券の特別な格付け情報を計算する Excel ブック内のマクロを呼び出します。また、このワークブックは別のワークブックを呼び出して、いくつかの標準評価数値を計算します。また、ユーザーが別の (関連のない) スプレッドシートを開いた場合に別のアプリケーション インスタンスで開かれるように、ブックを開いたときにイベントを関連付けます。これはすべてうまくいきます。
ユーザーは VDI 環境で操作します。彼らは、このプロセスに最大 30 秒かかり、もっと速くしてほしいと不満を漏らしています。物理マシンでは、ポリシーにもよりますが、通常 3 ~ 10 秒しかかかりません。
テストでは、ブックを開くイベントを接続しないと、プロセスが 2 倍 (またはそれ以上) 速くなることがわかりました。イベントを再度追加すると、マクロが完了するまでに 2 倍の時間がかかります。これは、イベント内のコードがトリガーされていない場合でも発生します。これを確認するために、ブレークポイントとログを追加しました。イベントは入力されていません (もちろん、別のスプレッドシートを開かない限り)。
Excel 用のカスタム VSTO アドインもあります。これをアンインストールしましたが、違いはありません。私は、相互運用ワークブックのオープン コードをアドインに移動することをテストし、実行時間を短縮することに成功しましたが、上級開発者は、そこにコードを配置しないことを望んでいます。私の質問は、相互運用ワークブックのオープン イベントを配線すると実行時間が長くなるのはなぜですか。また、コードをアドインに移動することを伴わずにこれを防ぐ方法はありますか? エクセル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);