【UiPath】Excel製業務ツール操作の汎用例とPADでの比較

# 概要

Excelで作られた業務ツールをUiPathで実行する際に、
汎用的に使用できる雛形を作成した。

また、PowerAutomateDesktopでも再現できるか試してみた。

* UiPath Community License
* PowerAutomateDesktop Preview(無料アカウント)

# サンプルツール

Excel製の業務ツールはおおよそこの形になっていると思われる。
シートに各種情報を入力し、実行ボタンのようなものを押下すると処理が行われ、
正常完了時、エラー発生時はメッセージボックスを表示して完了する。

※ユーザーが操作する前提のため、エンドポイントはメッセージダイアログになっている場合が多い。

* データの作成が完了しました。 (正常完了)
* 対象データパスが未入力です。 (実行時のエラー)
* データの作成に失敗しました、処理を中止します。 (実行中のエラー)
* などなど

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219708/9da075aa-8741-ec6a-2a98-028a20ab8901.png)



## 自動化のポイント1 全体の流れを止めない

RPAツールは常時起動していて、何らかのトリガーで発火する仕組みであれば効果が高い。
上記のツールであれば、毎日決まった時間になったら、対象データが出現したら、などがある。
トリガー監視用のロボットは常に動いていて、必要になったらツールを実行する。

時と場合によるかもしれないが、こういったケースをRPA化する場合は
無理にエラー時のリカバリはせず、通知だけを残して次に進むほうが効率が良い。
対象データパスの値が不正な場合に「対象データがありません。」のメッセージが想定されるが、
そこで、あの手この手で正しいデータを取りに行くなどの処理は頑張らず、
botやメールで「何時何分にこういうエラーが出てました」を送り、あとから人間が対応すれば良い。
エラーは滅多に出ない前提で、エラー率が高い業務は自動化にはそもそも向いていない。

## 自動化のポイント2 メインマクロの実行～終了をナビゲートする

UiPathから実行処理を行う場合は「マクロを実行」アクティビティを使用する。
実行されたマクロが終了して初めてUiPathは次の処理に移行する。
マクロが終了しない例として以下がある。

* メッセージダイアログの表示
* ユーザーフォームの表示と操作要求
* ファイル選択のようなダイアログの表示と操作要求

メッセージダイアログは表示される時もあれば表示されないときもある。
もしかしたら複数回表示される場合があるかもしれない。
ある条件下でのみユーザーフォームが表示され、何かをしなければならないケースがあるかもしれない。

これらをすべて条件分岐で表現するのはよろしくない。

# 実装

1. Excelアプリケーションスコープで業務ツールを起動させる
2. 必要な情報をシートに入力する

ここまでは通常の方法で良い。
肝になってくるのは実行ボタンで実行させる起点マクロと並列で監視用リトライスコープを回す点。

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219708/5cb82eda-1c61-7d7f-7ad7-6914c36a2939.png)


### 左側 : 実行プロセスを起動
実行ボタンにアサインされているメインマクロを実行している。
メインマクロ実行時は変数 `[vbaEnable]` をTrueにし、マクロ終了時にはFalseにしている。

### 右側 : ダイアログを監視
メッセージボックス監視用のリトライスコープになっている。
3秒間隔で実行され最大3分間繰り返す (設定値は任意)
Excelのメッセージダイアログが出現しているか判定し、出現していた場合は
変数 `[resultMsg]` にメッセージを格納しダイアログを閉じる。

`[vbaEnable]` がTrueの間はループを継続する条件にしているが、
デフォルトのUiPathでは IsTrue アクティビティを使用できないため、
`IF [vbaEnable] Then スロー` でプライベートのエラーをスローすることでループを継続させている。

これにより左側の起点マクロ実行アクティビティは最終的には終了し、
`[vbaEnable]` がFalseになることで並列のブロックが完了して先に進むという寸法。
先に挙げたユーザーフォームの表示などが別途あれば、同じように並列のループを増やして対応する。

並列のブロックを抜けると `[resultMsg]` にはエンドポイントのメッセージが格納されているため、
最後に正常完了時のメッセージと比較し、一致していたら正常完了を通知、
一致しなければエラーの通知を行うと良い。

# 実装 (PADの場合)

同様の処理をPowerAutomateで作成してみよう、
…と思ったが、開始早々詰んでしまった。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219708/e30c8106-9da6-f3d6-5e49-7e28261a5154.png)

Excelの起動終了間を並列処理にする必要があるが、
現行のPADには並列処理を行うためのアクションが存在しない。
Excelマクロの実行アクションを使用した場合に、メッセージダイアログなどが表示されるとどうしようもない。

### 代替案

マクロの実行は使用できないため直接ボタンを押す方向で行ってみる。
この場合はマクロがいつ終了したかを検知できないため、ループをとりあえず60秒とした。
この手法だと多数の業務ツールを扱う場合にその中で処理時間が最大のものに合わせる必要があり、
スマートではない。

![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219708/c6ec3679-583d-f7df-4c2c-43a54dbbc688.png)

### 所感

現時点でのPADはRPAに使用するのはちょっと厳しいかな、と思った。
並列処理ができないのが致命的だと感じたのと、


~~もう一つはUI要素の詳細を変更できない点。~~

![無題4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219708/a89b69ff-6189-2a06-939b-55d001a98c7c.png)

~~ここの編集が不可なのはとてもつらい…~~

【変更できました】(@maekawawawa さんより)
1. 画面右側のアイコンよりUI要素を選択し、UI要素ペインを表示
2. 対象のセレクターをダブルクリック
3. その他のアクションからセレクターの編集を選択し、セレクタービルダーを表示
4. 左下のカスタムをビジュアルエディターに変更
5. この状態で表示されているセレクターの文字列を直接編集可能

![無題8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219708/503e2503-5057-6710-7933-e7cb21543ef1.png)


~~UiPathのようにセレクターに変数を使用したりできない。~~
~~例えば対象がExcelだった場合に、読み取り専用か否かで要素を見失うということが起こってしまう。~~

【変数使用できました】(@maekawawawa さんより)

参考にさせていただいた記事
【Windows 10版でどこまでできるか】Power Automate Desktop のライセンスやできることや気になることまとめ【随時更新】(https://qiita.com/maekawawawa/items/b9c7b866f5ee31d2acd3#ui-%E8%A6%81%E7%B4%A0%E3%81%AE%E7%B7%A8%E9%9B%86)

(編集できるってことはそういうことでしたね…)

また、RPAツールは遠隔から人の手を介さず実行してなんぼ、のようなところがある。
自動化はしたが、それを人間がポチッと起動するだけであればそれ普通のプログラムでよくない？になってしまう。
そういう点でも無料版で比較するとOrchestratorが使用できるUiPathのほうが現時点では強いかな。

【追記】
できないと思ってた部分の多くが実はできると解り、懸念点がなくなった。
無料版PADでも色々できそうな気になってきた。