UiPathのノート

# はじめの一歩

UiPath で使える関数を調べる。
結局のところ、何がどう使えるのかわからんので
調べることにした。
ちなみに UiPath で利用する関数はVB.Net をベースとする。

具体例とともに書く

関数名、引数、戻り値を書く
その際、データ型も書く

アクティビティについても書く
アクティビティはどういうときに使うかと
利用時の注意事項を書く

[UiPath 公式](https://docs.uipath.com/studio/lang-ja)

## 標準入出力

### マウス操作

主に使うマウス操作のアクティビティには
クリック
ダブルクリック
ホバー
がある。

マウス操作がうまく効かない場合は

- 対象にホバーする
- クリックシュミレートにチェックを入れる
- 要素が検出できるまで待つ(ElementExist アクティビティ)の活用

## ブラウザの操作

ブラウザを操作する場合は
ブラウザ専用のアクティビティを活用することで
オートメーションに対応できる。

### ブラウザを開く

指定の URL でブラウザを開く。
続く Do アクティビティには URL を開いた後のアクティビティを追加する。
ex ) URL を開いたらログイン ID パスワードを入力してログインをクリックする。

### ブラウザにアタッチ

既に開いているブラウザを利用するときに利用

既にブラウザを開いている場合は
UiPath.Core.Browser 型の変数を用いることで任意のブラウザを操作することが可能
ただし、UiPath.Core.Browser 型の変数で操作対象のブラウザを格納するしていること

ex ) ブラウザを開くの出力で UiPath.Core.Browser 型の変数 Browser を出力する。
Browser をブラウザにアタッチに入力してウィンドウを補足する。

### Do アクティビティにいれるモノ

ウィンドウの最大化、最小化とかそんなやつ

## フロー制御(条件分岐)

UiPath において条件分岐は
条件分岐アクティビティとフロー条件分岐アクティビティの 2 つが存在する。

### 条件分岐アクティビティ

シーケンスアクティビティの中で利用される通常の条件分岐
特徴としては条件式と合わせて if-else を書くという
プログラマーが一番イメージしやすいアクティビティ
シーケンス条件分岐と呼ぶとしっくりきそう。

### フロー条件分岐アクティビティ

フローチャートアクティビティの中で利用される条件分岐
特徴としては中に書くが条件式だけというところ
そのあとの処理は左右に枝分かれた状態で定義する。

条件が多い時に利用すると前述のシーケンス条件分岐よりも
多少アクティビティの連結が長くなるが
アクティビティの見通しを良くするということに貢献しそうではある。

## フロー制御(繰り返し)

繰り返しを行うアクティビティには While と For Each が存在する。

### While アクティビティ

条件式が true のときに繰り返す。
繰り返しに用いられる判定は前置判定と後置判定が存在する。
ゆえに、While アクティビティには 2 種類の繰り返しが存在する。

VBA で例えると
前置判定 While ～ Loop
後置判定は Do~While
となる。

### For Each アクティビティ

引数として渡された配列を先頭から順に取り出す。
配列でループを行う際は For Each を使うとやりやすい。

### While アクティビティ と For Each アクティビティの使い分け

要素の有無を検出して True/False を返す ElementExist アクティビティを繰り返しで活用する場合は While が良い。
データテーブルやファイルのテキストから作成した配列を順に取り出すときは For Each が良い。

### フローチャートループ

UiPath は描いた通りに動作する為
接続先と接続元のアクティビティを交互に矢印でつなぐとループを作成できる。
ただし、無限ループになる可能性がある為、サーバ接続に等には利用しないこと。

## 関数・メソッド一覧

### Split

[UiPath 道場 - カンマ区切り文字列を分割する](http://www.uipath-dojo.com/purpose/string_split.html)

文字列分割の関数

Split(文字列,区切り文字)

```VB

Split("1,2,3",",")(0) ' 1
Split("1,2,3",",")(1) ' 2
Split("1,2,3",",")(2) ' 3

```

### left

指定された分だけ左から文字列を取り出す関数

```VB

test = "abcde"
left(test,1) ' a

```

### instr

文字列から特定の文字を探す関数
見つかった場合は見つかった位置を返し見つからない場合は 0 を返す。

```VB

test = "abcde"
instr(test,"a") ' 1

```

### Replace

文字列置換の**メソッド**
**関数ではなくメソッド**

```VB

' あらかじめ文字列変数sValを宣言しておく
' sVal = "あいうえお"

' 変数代入のアクティビティを利用
sVal = sVal.Replace("あ","か")

' sVal:かいうえお

```

### contains

文字列検索の**メソッド**
**関数ではなくメソッド**

```VB

' あらかじめ文字列変数sValを宣言しておく
' sVal = "あいうえお"

sVal.contains("あ") ' True
sVal.contains("か") ' False


```

## 特殊なデータ型

### DataTable

> ザックリ言うと、表形式のデータを保存できるデータ型
> VBA でいうところの**IHTMLTableObject**に使い方が似ている。

| 番号 | 名前     |
| :--- | :------- |
| 1    | ジョン   |
| 2    | リーナス |
| 3    | ジョブズ |

上記のような DataTable 型変数 tbl を作成した時の動きを考えると

```VB

tbl.Rows(1)("名前") ' リーナス

tbl.Rows(1).item(1) ' リーナス

```

DataTable にヘッダ(列の説明)がない場合は参照する番号がズレる

```VB

tbl.Rows(1).item(2)' リーナス

```

また、テーブルオブジェクトは意図して生成するか
画面上、Excel などから取得してオブジェクトを生成しなければならない。

オブジェクトを生成しなければならない理由としては
スキーマ、列の定義が必要だからだと思われる。

データの追加、削除をデータテーブルに対して行う場合はアクティビティを通して実行する必要がある。

## ファイル・ディレクトリ操作

### ディレクトリ配下のファイルを全て取得

Microsoft Scripting Runtime でいうところの
「FileSystemObject」で利用できる「GetFolder(args).GetFiles」に相当する。

ディレクトリ配下の txt を全て取得する場合は
Array of [String]で変数を宣言して代入アクティビティで代入すれば良い。

```CS
fileList = System.IO.Directory.GetFiles(strFolder,”*.txt”)
```

上記の String 型の配列、fileList からデータを取り出す際は
For each アクティビティを利用することで順に取り出すことが可能である。

### OS 上の特殊なディレクトリを取得

Windows にはあらかじめ用意された特殊なディレクトリが存在する。
UiPath で利用する場合は「Get Environment Folder」 を活用する。

デスクトップのルートディレクトリを指定する場合は Desktop を指定する。

### ファイル名から拡張子を除いた部分だけ取得

```VB

filename = "test.csv"
tmp = left(filename,instr(filename,".")-1)

```

## シナリオの実行時間を計測する方法

### Now 関数を使う

一番シンプルな方法では
DateTime 型変数の開始時間と同じく DateTime 型変数の終了時間を定義して
開始終了の Now を代入して引き算で求める方法がある。

## シナリオをより速く作るには

### アクティビティパターンを知ること

UI に対応するアクティビティを知る。
例えば、実際に経験したことで
OracleForm は SetText アクティビティではなく
TypeInto アクティビティを使わないと
文字列を入力できない。

### アクティビティの仕様を知ること

例えば、SetVisibleText を使う場合は
画面上に表示された文字列を取得するので
事前に画面の最大化などをして画面表示の担保する必要がある。

### メタデータのことは後から考えること

利用するデータのデータ設計は必要だが
それを最初に持ってくると効率化悪いので
とりあえず、作ってみる。
このときに重要なことは
メタデータをアクティビティに直接書かず
変数で定義してからアクティビティに入れる。
そして、変数の既定値にテスト用のメタデータを設定する。

### 同じサブシナリオを作らないこと

よくある動作はどこでも使えるので
ライブラリ化することで再利用できる？？

アクティビティに引数を渡すように作る。
例えば
ブラウザの名前をつけて保存の場合は
ファイルのフルパスを与える作りでライブラリ化することで
使いまわせるのでは

## Microsoft Excel Visual Basic for Application の 小ネタ

### セルの操作

レンジ指定のセル貼り付けよりもセルオブジェクト操作による貼り付けのほうが早い。
値を代入するだけであればもちろん、直接代入するほうが早い。

レンジ指定のセル貼り付け < セルオブジェクト操作による貼り付け < 直接代入

ゆえに PasteSpecial メソッドを複数回に渡って実行するのであれば
直接、値を代入してあげたほうが早い。

### イベント

Excel は常にイベント発生を監視している為
その分、セルやワークシートを操作したときに遅延が生じる。
イベントの類を抑えたい場合は
Application オブジェクトの「EnableEvents」プロパティを false に設定する。

### Range と Cells

どちらでも基本、セルを操作することは可能だがスピードを求める場合は
Cells のほうが若干ながら早い。
早い理由として Cells は縦横のアドレスを指定しているのに対して
Range は利用する度に座標変換が入る為、遅延が生じる。

### コピーして挿入

Insert メソッド利用前に Copy メソッドを実行すると
コピーして挿入することが可能

### 1 年間の営業日だけを取り出したい

```VB
worksheetFunction.Workday(開始日,日数,祭日リスト)
```

開始日を明日の日付に設定して
結果をテキストにすると X 行数=X 営業日目になる。

### よく使う Worksheet Function

- MAX
- ROW
- INDEX
- IFERROR
- IF
- COUNTIF
- COUNTIFS

### Is ～

- IsError

valueエラー が起きているセルなどを検出できます。

- IsEmpty

- IsNothing

※Is Nothing の方が少し動作が速いが無視できるレベル
IsNothing 関数は値型の変数に対しても使えるのに対し
Is Nothing は値型の変数に対して使用するとビルドエラーになります

## 参考資料・URL

### 公式

[UiPath プロセス爆速化の為の TIPS](https://www.uipath.com/ja/blog/developer/accelerate-processing)

### Qiita

[UiPath 　処理時間を計測する方法](https://qiita.com/masaru9624/items/951b1c8b4e89b6f8ee4b)

### RPA Navi

[UiPath 入門編 4 　繰り返し処理について - Automation Lab](https://sweetpox.com/about-iterative-processing)
[UiPath ループ処理まとめ](http://rpa-navi.com/archives/431)

### 誰でもできる業務改善講座

[UiPath ブラウザーにアタッチ アクティビティ](https://blog-tips.sekenkodqx.jp/2020/10/06/uipath-activity-browser-scope/)