【EXCELアプリケーションスコープ】不要なEXCELプロセスが残ってお困りの方へ

# はじめに

- 本記事は、EXCELアプリケーションスコープを配置し、アクティビティによるEXCEL操作等を自動化する中で、***ロボット実行後に不要なEXCELプロセスが残ってしまうことでお困りの方向け*** の内容となっています。
- 記事の内容は、個人の見解または確認結果であり、UiPath の公式見解ではありません。
- UiPath.Excel.Activities は 2.5.4 バージョンで構成しています。（最新の 2.20.2 もEXCELアプリケーションスコープの上位版の説明として一部利用しています。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/5ce039c4-2c81-f68c-d248-009544f504f3.png)

# 不要なEXCELプロセスってどうやってつくるの？

まず、***大前提としてロボットが正常動作をしているケースでは、EXCELアプリケーションスコープで起動したEXCELプロセスはワークフロー終了時に同様に消えます（終了します）。***
意図的に例外を発生させたとしてもワークフローが正常に実行された場合、基本的にはEXCELプロセスも同様に終了します。
***じゃぁどうやれば発生させられるのか？***
***➤　Studio のデバッグ実行でわざと停止することで不要なEXCELプロセスを残せます！！（※EXCELアプリケーションスコープ利用時）***

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/d45f7d91-4a3e-d9f5-846c-f80b37255ba1.png)

::: note
キャプチャの例では、EXCELアプリケーションスコープ（可視：True）により PID：10116 のEXCELプロセスが立ち上がり、デバッグ停止でEXCELプロセスと開いたEXCELファイルがそのまま残っている状態です。
この時点で ***EXCELプロセスと開いたEXCELファイルの関係性は切れている*** ため、EXCELファイルを手動で閉じてもEXCELプロセスは終了せず残り続けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/b25222c8-b59a-3112-c6fe-7d044c8ba60a.png)
:::

## 不要なEXCELプロセスが存在する状態でロボット実行してもよいのか？

結論の前に、EXCELプロセスとロボット（UiPath）の関係性を追加で補足します。

### 起動するEXCELプロセス

|パターン| ロボット実行時の挙動 |
|:-----------:|:-------------------------------:|
| EXCELプロセスなし | 新規でEXCELプロセスが1つ起動する |
| EXCELプロセスが1つ起動している | ***起動中のEXCELプロセス*** が利用される |
| EXCELプロセス複数起動あり | 起動中の ***いずれかのEXCELプロセス*** が利用される |

::: note
確認は「プロセスを取得」アクティビティの出力（System.Diagnostics.Process）から「繰り返し（コレクションの各要素）」で
PIDとファイル名、プロセス名（item.Id.ToString+" "+item.MainWindowTitle+" "+item.ProcessName）
を取得するかたちでおこなってます。

（複数起動ありの確認例）

![新規のEXCELプロセスを複数立ち上げた状態.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/417258b5-7b5b-46e3-25e3-97513163402b.jpeg)
![新規のEXCELプロセスを複数立ち上げた状態2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/eb1956b4-e019-2ea1-22c9-e916f4f229f9.jpeg)
![新規のEXCELプロセスを複数立ち上げた状態5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/3f90fb6f-cc78-0940-3c21-521f4642509f.jpeg)
![新規のEXCELプロセスを複数立ち上げた状態4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/5099d146-8f33-4a81-e370-41aa29f5b4cd.jpeg)
![新規のEXCELプロセスを複数立ち上げた状態6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/92d59a3a-ecfe-bdf7-5bf7-3f960f344d00.jpeg)
↑↑ちょっとわかりづらくてすみませんが、***「test2.xlsx」を手動で起動してつくった PID：16560 ですが、確認時に拾ったアクティブウィンドウのファイル名は「test.xlsx」となっています。***

なお、EXCELプロセスの複数起動は「/x」オプションを付与して EXCEL.EXE を実行すればOKです。
:::

### EXCELプロセスが複数起動した状態は好ましくない

次の様な問い合わせは UiPath また EXCEL に限らず発生します。
[***EXCEL.EXE が複数起動したままになってしまいVBAアプリが誤動作する***](https://answers.microsoft.com/ja-jp/msoffice/forum/all/excelexe/9c1d5832-7a9b-4918-8b82-ea1c260aa25f)

共通のライブラリを同時に操作する（ファイルのIOの排他制御が一番イメージしやすい）などは、一般的に予期しないエラーが生じやすいパターンです。
このため、EXCELアプリケーションスコープの上位版の ***「EXCELファイルを使用」は『EXCELプロセススコープ』とセットで利用することが推奨されており、『EXCELプロセススコープ』のプロパティには既存プロセスに対するアクション指定のオプションもあります。*** [（オプションの参考記事🔗）](https://blog-tips.sekenkodqx.jp/2021/11/28/uipath-activity-excel-process-scope-x/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/30acfff0-541c-8374-3e39-8fe87626b727.png)

::: note
EXCELアプリケーションスコープの出力プロパティで WorkbookApplication というオブジェクトを生成して中身をのぞくと、「System._ComObject」という名前のCOMオブジェクトを確認することができます。

![workbookのオブジェクトの中身.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/e070b7d4-0de7-c66b-2a41-48075f3dd598.jpeg)

複数のEXCELプロセスが存在する際に、このCOMオブジェクトの操作に失敗する例（以下）などもある様です。
https://forum.uipath.com/t/excel-hresult-0x80010114/512990
:::

# どうしたら不要なEXCELプロセスが残らないようにできるの？

## 解決策1（推奨）：モダンデザインの「EXCELプロセススコープ」アクティビティを利用する

「EXCELプロセススコープ」＆「EXCELファイルを使用」を利用した場合、プロパティの「Excelファイルを開いたままにする」のチェックをONにした場合を除き、***ワークフロー実行で対象のプロセススコープを抜けた段階でタスクマネジャーからEXCELプロセスは消えます。***
なお、チェックをONにした際に、何等かの手当がされているのか、ワークフロー実行後に手動でEXCELファイルを閉じるとEXCELプロセスも一緒に消えます。（***リレーションが保ててます！改善されてますね！***）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/31555e0a-cdd5-d305-e800-c2df6cf6ee99.png)

## 解決策2：「ワークブックを閉じる」アクティビティでEXCELプロセスを終了する

手元の挙動をみる限りでは、***ワークフロー終了時のクローズ処理か何かでEXCELプロセスを切りにいってます。***
可視のオプションを True にした状態で EXCELアプリケーションスコープ の後ろに待機などを入れてみてみてください。
本来スコープを抜けたタイミングでEXCELファイルが閉じる想定でしたが、実際に閉じたのはワークフロー終了時です。
このため、***不要なEXCELプロセスの発生リスクを最小限にするには、スコープの直後などに「ワークブックを閉じる」アクティビティを挿入し、明示的にEXCELプロセスを終了するのが有効と考えられます。***

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/30001d3b-b6e2-55b5-d9e5-001725906d82.png)

## 解決策3（非推奨）：「プロセスを強制終了」アクティビティでEXCELプロセスを終了する

***既存のEXCELプロセスを終了させてよい場合に限り***、ワークフローの冒頭に「プロセスを強制終了」アクティビティを挿入するのがよいでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/990bf306-4e56-41e7-2b1d-3daab9f72c5f.png)

# おわりに

ロボット（UiPath）がEXCELの親プロセスではないため、制御元のロボットが最後まで実行されなかった場合に、
宙ぶらりんのEXCELプロセスが発生する可能性はあります。
とはいえ、例外制御も施されているワークフロー実行で同事象が頻繁に発生するということは考えにくいので、
再現性が高い場合などは、他のアプリケーションをトリガーにEXCELプロセスが起動していることも念頭に調査いただけますと幸いです。
最後までお読みいただきありがとうございます！('ω')ノ