VSTO を介して Excel を計算エンジン (ユーザー操作なし) として実行していますが、実行時間の長いマクロをプログラムでキャンセルできるようにしたいと考えています。
私の現在のアプローチは、別のスレッドでマクロ (Application.Run("MyMacro")) を実行するためのブロッキング呼び出しを配置し、メイン スレッドから中断しようとすることです。
Application.Interrupt() など、この目的のための組み込みメソッド呼び出しはないようです。そのため、CTRL+Break または ESC が押されたときに発生するキーボード割り込みをプログラムでトリガーしようとしています。
現在のコードは次のようになります。
Application.CalculationInterruptKey = XlCalculationInterruptKey.xlAnyKey;
Application.EnableCancelKey = XlEnableCancelKey.xlInterrupt;
Application.SendKeys("{ESC}", false); //have tried with true as second argument
この場合、コードはマクロが完了するまで実行されない最終行でブロックされます。
また、Excel のプロセス フックを取得して、アクティブなプロセス/ウィンドウとして設定し、SendKeys を呼び出してみましたが、成功しませんでした。
これはマクロを実行するための一般的なソリューションである必要があるため、マクロの内容を変更したり保証したりすることはできません。
何か案は?
ありがとう、
PS また、Application.SendKeys("^{BREAK}", false); のように CTRL+BREAK キーボード コマンドを送信しようとしました。デバッガーは、マクロの実行が完了するまでこの行で一時停止するため、マクロが完了するまで Application オブジェクトはそれ以上のコマンドの処理をブロックされているように見えます。