0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

UIPathにおけるExcelアプリケーションスコープの罠

Posted at

 皆様は、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ミリ秒以上に変更すれば大量の処理の時でもエラーは発生しにくくなります。

 以上、お試しあれ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?