皆様は、Excelアプリケーションスコープを使って構築時した後の検証でExcelでエラーが出まくった経験はないだろうか?
特に、Excelアプリケーションスコープを複数接近させている場合だ。そうすると、動作如何で以下のエラーが出てくる。
Exception from HRESULT: 0x80010108 (RPC_E_DISCONNECTED))
この上記のエラーについてはフォーラムでもたびたび質問に上がっている。
1,そもそもの原因
エラーコード 0x80010108 (RPC_E_DISCONNECTED) の意味は以下の通り。
『アプリ側では参照を保持しているが、その参照は既に COM オブジェクト側から切断されている』
例えば、以下のケースでエラーが発生したと致します。
『実際に、FileAからFileBに対してシートをコピーし、FileAを終了させて
FileBを保存してから終了する処理を実行したところ、FileBを保存するところで
エラー』
この場合、FileAを動かしているExcelアプリをE1。本来、
FileAを閉じて、FileBを操作させたいExcelアプリをE2とします。
本来であれば、以下のような動作順序であれば正常に動くはずです。
【本来の意図した動作】
FileAからFileBにシートをコピーしてFileAを終了・・・・・E1
FileBを保存して終了する処理の実行・・・・・・・・・・・E2
【実際の動き】
FileAからFileBにシートをコピーしてFileAを終了・・・・・E1
FileBを保存して終了する処理の実行・・・・・・・・・・・E1
というようにE1→E2へプロセスが引き継がれる前にプログラムがExcelに動作させたため上記のエラーが出たものと推測されます。
従って、フォーラムにあるように
1,Excel application scope を出る前に delayを入れる
2,Try catch等で、失敗した場合のRetry 処理を入れる。
の対応策になろうかと思います。
しかし、それでも失敗することが多いと思いますので私が見つけた対応策を披露いたします。
効果的な対策案(仮)
先ほどのフォーラムの対策案は、E1→E2への引継ぎの時間を延ばすための方策だと理解しております。一方で、E1を延命させる方法はないのでしょうか?実はあります。それが以下の方法です。
1,WorkbookApplication変数を用いて「出力」および「既存のブックを使用」に入れる。
2,WorkbookApplication型変数の出力時に「インスタンスのキャッシュ期間」をかなり長くして変更する。
参考は以下の通り。
https://docs.uipath.com/ja/activities/other/latest/productivity/excel-application-scope
WorkbookApplication型変数を用いるとExcelアプリケーションスコープごとにExcelを閉じるという動作を防ぐことができます。それでも、COM オブジェクト側から切断される場合はインスタンスのキャッシュ期間を3000ミリ秒以上に変更すれば大量の処理の時でもエラーは発生しにくくなります。
以上、お試しあれ。