UiPath小技集

# はじめに

2020年はRPA開発にがっつり携わった年でした。
この1年で蓄えたナレッジをまとめようと思います。


# ログイン情報を安全に設定・入力する方法

当然の事ではありますが、セキュリティの観点からベタ書きは危険です。
ではどうするか？
Windows資格情報を利用してログイン情報を設定し、
取得の処理と暗号化状態で入力する処理を実装するのが望ましいです。

**事前準備：**
・Windows資格情報にログイン情報を設定する
・StudioからUiPath.Credentials.Activitiesを導入

**実装：**
1. `Get Secure Credential`アクティビティを使ってWindows資格情報からログイン情報を取得
2. `Type Secure Text`アクティビティを使ってパスワードを入力

参考：[ワークフローで使用するパスワードの暗号化方法](https://www.uipath.com/ja/resources/knowledge-base/ワークフローで使用するパスワードの暗号化方法)

# Excelファイル開きっぱなしにする方法

通常、`Excelアプリケーションスコープ`を抜けるとファイルは閉じられますが、共有フォルダにあるファイルなどはロボットの実行中はずっと開きっぱなしにしたいということがあります。
`Excelアプリケーションスコープ`内にすべての処理を記述するというのも手ですが、処理が長くなる場合、可読性が悪くなります。
そこで使えるのが、`Excelアプリケーションスコープ`のプロパティに用意されているブックです。
ここに変数を設定するとスコープを抜けた後も開かれたままとなり、明示的に`ブックを閉じる`アクティビティを使わない限り閉じません。
別の`Excelアプリケーションスコープ`で同じファイルを操作したい場合は、プロパティの既存のブックに前の処理で出力したブックの変数を設定することで、同じファイルを操作することが出来ます。

**実装：**
1. `Excelアプリケーションスコープ`アクティビティ(スコープA)を配置。プロパティのブック欄に変数：bookAを設定　※画像１参照
2. `Excelアプリケーションスコープ`アクティビティ(スコープB)を配置。プロパティの既存のブック欄にスコープAのブック欄で出力した変数：bookAを設定　※画像２参照
3. `ブックを閉じる`アクティビティを配置。ブックに変数：bookAを設定

**画像１**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517685/188675d1-31ad-c603-55d4-38545d74725b.png)

**画像２**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517685/8f2d1c1a-08ff-1cea-6545-1a724ec36987.png)


# Excelで読み込んだ日時が正しく取得できない時の対応方法

下記の25時を表現する値などをExcelから読み取る時、思った通りに値が取得できないことがあります。
（下記の場合は小数点(シリアル値)として読み込まれます。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517685/173dccb5-e8bf-fffd-1a25-8a8d27a84870.png)
 
Excelの書式設定によって解決することもありますが、書式設定を施すことが難しい場合、`セルを読み込み`アクティビティや`範囲を読み込み`アクティビティにあるプロパティの表示形式を保持のチェックをONにすると表示された見た目のままの値が取得できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517685/1d3dadaf-7bf2-3055-e628-342d9592bf56.png)


# クリックや文字入力などのUI操作が安定しない時に見るべきポイント

UI要素を操作するクリックアクティビティや文字の入力アクティビティなどを使用する際、
動作が安定しないことがあります。
以下に挙げるポイントを調整してみるのがいいでしょう。

## セレクターの記述

アクティビティのオプションメニュー(横三本線のボタン)からセレクターを編集をクリックしセレクターの記述を確認します。
具体的には一意の要素を指し示す記述となっているか？動的な値が含まれていないか？などです。
必要に応じてUiExplorerを開き、属性や要素の追加、動的な値を*(アスタリスク)に変更などをします。

## プロパティの準備完了まで待機の設定

処理の待機の仕方を確認します。
ブラウザ操作の場合、`INTERACTIVE`では対象のエレメントの状態のみを待つのに対し、`COMPLETE`ではページ全体が読み込まれるのを待ってから実行されます。
`INTERACTIVE`で空振りする場合は`COMPLETE`にしてみるといいでしょう。

参考：https://www.uipath.com/ja/blog/developer/click-activity

## クリックのシミュレート・入力をシミュレート、ウィンドウメッセージを送信

`クリック`アクティビティの場合は、クリックのシミュレートとウィンドウメッセージ送信。
`文字を入力`アクティビティの場合は、入力のシミュレートとウィンドウメッセージ送信。
これらの設定を確認します。
デフォルトではどちらも空値となっており、処理速度は最も遅くありますが人が操作した場合と同じ動きとなり安定しています。
ただし、人と同じ動き＝実際にマウス操作・キー操作している状態と同じのため、実行中にPCを操作した場合に影響を受けてしまします。
シミュレートもしくはウィンドウメッセージ送信のどちらかをTrueにした場合、PC操作の影響を受けなくなり、処理速度も上がりますが操作対象のアプリケーションによって互換性の問題があり正しく挙動しないことがあるため検証が必要です。

# 覚えておくと便利なVB.NETの知識

UiPathはプログラミングソースを書かなくても実装できるツールですが、UiPath Studio ProではVB.NETと同様に型の概念があり、VB.NETメソッドに対応するアクティビティが網羅されているわけでもないのでVB.NETメソッドをある程度知っておいたほうが実装が容易くなります。
以下ではよく使用し覚えておいた方が便利なVB.NETの知識を紹介します。
（型の概念は下記では説明しておりません。ある程度プログラミング知識のある方向けの説明としております。）

## 文字列の結合方法

文字が入っている変数を2つ以上、繋げる場合は以下の通り記述することができます。

```vb
valueA & valueB
```
```vb
valueA + valueB
```

結合する変数が多い場合はString.Concatメソッドを使用すると可読性がよくなるでしょう。

```vb
String.Concat(valueA, valueB)
```

ファイルパスを生成するためにディレクトリ名とファイル名を結合する場合などではPath.Combineメソッドを使用するのがいいでしょう。
「\」を記述する必要がないため可読性がよくなります。

```vb
Path.Combine(valueA, valueB)
```

## 型を変換する方法

文字列(String型)にしたい場合は変数名の後に.ToStringで基本的に変換できます。

```vb
valueA.ToString
```

文字列(String型)→数値型(Int型)の場合は、CIntメソッドが使用しやすいです。

```vb
CInt(valueA)
```

文字列(String型)→日時型(DateTime型)の場合は、DateTime.Parseメソッドで変換できます。

```vb
DateTime.Parse(valueA)
```

※上記は私個人の使用頻度の高い変換方法を紹介しております。
※場合によって他の変換方法を取るべきケースもありますので、調べながら実装してみてください。

## DataTableから値を取得する方法

DataTableの1件目の1列目を取得する場合は以下のように記述します。

```vb
tableA.Rows(0).Item(0).ToString
```

Rowsはヘッダー行を除いた行を0番目から指定します。
Itemは列の位置を0番目から指定します。
またItemは列の名称でも指定することができ、CSVを読み込みアクティビティなどで先頭行をヘッダーとするがチェックONの時はCSVの1行目に記述されている文字列で指定することができます。


## 日付の操作

現在日時を取得する際は以下のように記述します。

```vb
DateTime.Now
```

文字列(String型)にする際は以下になります。
カッコ内にルールに従った記述を書くことでフォーマットを指定することも出来ます。

```vb
DateTime.Now.ToString
```

```vb
DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss")
```

現在日時より日にちを計算する際は以下の通りとなります。
`AddDays`メソッドの他、`AddMonths`メソッドや`AddHours`メソッドなどが用意されています。

```vb
DateTime.Now.AddDays(1.0) // 結果：明日の日時
DateTime.Now.AddMonths(1) // 結果：来月の日時
DateTime.Now.AddHours(1) // 結果：１時間後の日時
```

# まとめ ー2020年を振り返ってー

1月からUiPath開発に携わりはじめ、どっぷりとUiPathに浸かった1年でした。
UiPathイヤーの1年の締めくくりとしてUiPath小技集の投稿が出来て良かったです。
2021年もUiPathに携わっていく予定なので、引き続き投稿ができればと思っております。
実践的で、分かりやすい記事が書けるよう今後も頑張ります！