UiPath 「ファイルを選択」アクティビティで遊んでみる

## 皆もすなるQiitaといふものを、儂もしてみむとてするなり。

と言う訳で、こん＊＊は！はなっち！です。

ロボットを開発していると、入力ファイルに関して、「フォルダ位置は不定で...」「ファイル名って適当なんです...」って場合がある。
そんな時には、「ファイルを選択」アクティビティを使って「ファイル選択ダイアログ」を表示させ、処理対象とするファイルを選択させる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/ab4e13ec-ac3e-d378-32ee-e62f542a79a0.png)
そんな実装をしていくと、ロボ実行時、必ずファイルを選択してくれるかというと、そうでもない。「間違えて起動してしまった」とか、「起動する時間だけど、先行業務からのファイルが届いていない」とか。。。
起動して、「ファイルを選択」アクティビティの「開く」ボタンではなく「キャンセル」ボタンをクリックして、処理を中止するわけだが、このアクティビティは、以下の例外を投げてくれる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/8b234ca6-ca8f-3229-91ec-787048d73fa2.png)
ソース: ファイルを選択
メッセージ: Selection was canceled.
例外の型: System.OperationCanceledException

と言う事は、「トライ キャッチ」アクティビティで、「System.OperationCanceledException」を捕捉し、それなりの処理を組んであげればよろしい。

ここで気を付けなければならないのが、「キャンセルボタンがクリックされた時の『選択されたファイル』に設定された変数」だ。
この「『選択されたファイル』に設定された変数」は、キャンセル時には初期化されていないので、迂闊に参照しようとすると、以下の例外となってしまう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/815e2144-5a6e-43a8-f2fb-0ac0451d0ab5.png)
ソース: メッセージ ボックス
メッセージ: オブジェクト参照がオブジェクト インスタンスに設定されていません。
例外の型: System.NullReferenceException

こんな事を回避するために、「ファイルを選択」アクティビティの前に、「代入」アクティビティを使って、初期化してあげればよい。

と、一度経験しておくと、次からは意識しなくとも、

１）「代入」アクティビティで、『選択されたファイル』に設定された変数を初期化
２）「トライ キャッチ」アクティビティをドラッグ＆ドロップ
３）[Catchs]に、[System.OperationCanceledException]を設定
４）必要なファイル拡張子を指定した「ファイルを選択」アクティビティを、[Try]にドラッグ＆ドロップ

という組み方が出来る。


さて、「ファイルを選択」アクティビティは、ファイル選択ダイアログの「タイトル」が『Select File』固定になってしまっている。
VBAなどで、選択すべきファイルの説明を「タイトル」に設定していた事、設定出来た事を考えると、ちょっとビックリな仕様だ。

ロボの処理の中で、「今、何のファイルを選択しなければいけないのか？」を失念してしまうと、一度キャンセルしてもう一度操作手順を確認して再実行などとまだるっこしい事をやらねばならず、それはそれで効率化を目指すロボットとしては本末転倒な事になってしまう。

それを苦慮していた人は、是非「かんたんファイル選択アクティビティ」を参考に！

https://marketplace.uipath.com/ja/listings/s2ppbkzlm6gnqdsvaz7fnq


この中にある「ファイルを一つ選択」アクティビティは、「タイトル」、「起動ディレクトリ」も指定する事が出来る。
また、『選択されたファイル』に設定された変数はアクティビティ側で初期化されているから、「キャンセル」ボタンをクリックした時に、すぐ参照しても大丈夫だ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/88ceba6b-08bb-0ad8-9f57-d5bf59f9f291.png)
また、兄弟アクティビティに「ファイルを複数選択」アクティビティがあり、これはファイルを複数選択できるアクティビティで、選択したファイルは、文字列型の配列で返却される。
これも「タイトル」、「起動ディレクトリ」も指定する事が出来る。
『選択されたファイル群』に設定された変数はアクティビティ側で初期化されているから、「キャンセル」ボタンをクリックした時に、配列数が0かどうかを判断すれば大丈夫。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/c43795c6-d231-9460-8ed1-6b4626518486.png)
是非、利用のご検討を！


さて、ここからが本題。

お客様先の都合で、「かんたんファイル選択アクティビティ」がインストール出来ない。こんな場合は、やはりオーソドックスな方法で実装するしかない。
それでPUBLISHして、Assistantから起動できるようにして、お客様の検証結果を待つ。

ところが、お客様からの申告が「一時間経ってもロボが終了しない」というモノだった。おかしい、選択したファイルを素直に読み込んで、若干の業務ロジックを施して、ファイルを分割するだけなのに…一時間はかからない筈！
ログファイルを見て、気が付いた。「ファイルを選択」アクティビティが表示されて、ファイルを選択してない！何故！？

もしかしてと伺ったら、「色んなウィンドウを開いた状態で、Assistantから起動した」と言う。なるほど。それらのウィンドウの陰に隠れて、「ファイルを選択」アクティビティから表示された「ファイル選択ダイアログ」でファイルを選択していない。

さて、この「ファイル選択ダイアログ」を最前面に出すために、どうしたものか。。。

「入力ダイアログ」アクティビティでよく使うのが、「ホットキーを押下」アクティビティで、[Windows]キー＋[d]キーを送ってあげて、ウィンドウを最小化してあげる。
こうすると、すっきりする訳だが、開いているウィンドウを最小化してしまうのは忍びない。

ではどうしたらいいか…

実はとっても簡単であった。それは「メッセージ ボックス」アクティビティを使用する。「メッセージ ボックス」アクティビティのパラメタに「最前面」と言うものがあり、これをTrueにしてあげる。こうすると、まずメッセージボックスが表示され、OKをクリック！
このアクティビティが実行された事でUiPathProcessがアクティブになっているので、その次に「ファイルを選択」アクティビティが動くときには、最上面に「ファイル選択ダイアログ」が表示される！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/baf3d954-06cc-b297-b117-95a39f084629.png)

無論、「メッセージ ボックス」アクティビティが表示され、OKをクリックした直後に他のウィンドウをアクティブにしては元も子もないけど…

「メッセージ ボックス」アクティビティを使って、何をしなければならないのかを表示させ、OKボタンをクリックさせる。この一手間で、一時間の待機してしまう事もなくなる訳だ。

お試しあれ！


##おわりに
いかがでした？

▼ロボを作った人は、このロボの次の手が分かるので、心構えが出来ている。
▼ロボの仕様を一緒に検討した人も、このロボの次の手が分かるので、心構えが出来ている。
▼ロボを実行する人は、説明を受けていても実際に経験していないから、心構えが出来ていない。
▼なんとか便利に使っていただき、効率化を目指すには、ただ機能を作るのではなく、ヒューマンインタフェースも大事！

今回も読んでいただきありがとうございました！
是非UiPathでのロボ開発の一助になればと思っています。

ありがとうございました！