UiPath のノート
はじめの一歩
UiPath で使える関数を調べる。
結局のところ、何がどう使えるのかわからんので調べることにした。
ちなみに UiPath で利用する関数は VB.Net をベースとする。
具体例とともに書く
関数名、引数、戻り値を書く
その際、データ型も書く
アクティビティについても書く
アクティビティはどういうときに使うかと
利用時の注意事項を書く
よく使うアクティビティの仕様
クリック
クリックシュミレートにチェックを入れるとスクロールが必要な UI やリンクでもクリック可能である。
クリックの精度を上げたい場合はクリック対象に対して
要素が検出できるまで待つ(ElementExist アクティビティ)を活用する。
ホバー
対象にホバーする。
ファイル選択(Select File)
UiPath Robot からファイルダイアログピッカーを出力する。
何も選択せず、キャンセルをした場合は Exception でエラーが発生する為
Try-Catch でエラーを捕捉してエラー処理をする必要がある。
また、選択するファイルについてはフィルタをかけることが可能
以下、Excel ファイルのみを選択させたいときのフィルタ例
Microsoft Excel (*.xls,*.xlsx,*.xlsm)|*.xlsx;*.xlsm;*.xls
フォルダ選択(Select Folder)
UiPath Robot からフォルダダイアログピッカーを出力する。
何も選択せず、キャンセルをした場合は Exception でエラーが発生する為
Try-Catch でエラーを捕捉してエラー処理をする必要がある。
フォルダの選択に成功した場合はフォルダ名で終わるフォルダパスを返す。
※末尾に円マークはつかない。
ブラウザを開く(Open Browser)
指定の URL でブラウザを開く。
続く Do アクティビティには URL を開いた後のアクティビティを追加する。
ex ) URL を開いたらログイン ID パスワードを入力してログインをクリックする。
開いたブラウザのオブジェクトは UiPath.Core.Browser 型の変数に出力が可能であり
以降のアクティビティで利用可能である。
ブラウザにアタッチ(Attach Browser)
既に開いているブラウザを利用するときに利用
既にブラウザを開いている場合は
UiPath.Core.Browser 型の変数を用いることで任意のブラウザを操作することが可能
ただし、UiPath.Core.Browser 型の変数で操作対象のブラウザを格納していること
ex ) ブラウザを開くの出力で UiPath.Core.Browser 型の変数 Browser を出力する。
Browser を「ブラウザにアタッチ」アクティビティに入力してウィンドウを捕捉する。
Do
OpenBrowser や Attach Browser などアプリケーションに
スコープを当てた際にアクティビティ内に必ず生成されるシーケンスアクティビティ。
ウィンドウの最大化最大化、最小化などをいれることでウィンドウ制御が可能になる。
また、クリックやテキストの設定などの UI 操作系アクティビティを入れると
操作のフォーカス対象がアプリケーションに移動する。(入れ子にすることで操作対象を減らすことが可能)
フロー制御(条件分岐)
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
文字列分割の関数
Split(文字列,区切り文字)
Split("1,2,3",",")(0) ' 1
Split("1,2,3",",")(1) ' 2
Split("1,2,3",",")(2) ' 3
left
指定された分だけ左から文字列を取り出す関数
test = "abcde"
left(test,1) ' a
instr
文字列から特定の文字を探す関数
見つかった場合は見つかった位置を返し見つからない場合は 0 を返す。
test = "abcde"
instr(test,"a") ' 1
Replace
文字列置換のメソッド
関数ではなくメソッド
' あらかじめ文字列変数sValを宣言しておく
' sVal = "あいうえお"
' 変数代入のアクティビティを利用
sVal = sVal.Replace("あ","か")
' sVal:かいうえお
contains
文字列検索のメソッド
関数ではなくメソッド
' あらかじめ文字列変数sValを宣言しておく
' sVal = "あいうえお"
sVal.contains("あ") ' True
sVal.contains("か") ' False
データ型・変数
GenericValue 型
GenericValue 型は UiPath 独自の変数であり、テキスト、数値、日付、または配列といった種類のデータを格納することができる変数型ある。
利用の際には To ~メソッドで変換を必要とする。
変換しなかった場合や空のセル等から取得した場合はエラーとなり、ロボットが停止する。
GenericValue 型
文字列を扱うようにすると String.IsNullOrEmpty で NULL および Empty 判定が可能となる。
NULL
String.IsNullOrEmpty メソッドで判定可能
Empty
String.IsNullOrEmpty メソッドで判定可能
DataTable
ザックリ言うと、表形式のデータを保存できるデータ型
VBA でいうところのIHTMLTableObjectに使い方が似ている。
番号 | 名前 |
---|---|
1 | ジョン |
2 | リーナス |
3 | ジョブズ |
上記のような DataTable 型変数 tbl を作成した時の動きを考えると
tbl.Rows(1)("名前") ' リーナス
tbl.Rows(1).item(1) ' リーナス
DataTable にヘッダ(列の説明)がない場合は参照する番号がズレる
tbl.Rows(1).item(2)' リーナス
また、テーブルオブジェクトは意図して生成するか
画面上、Excel などから取得してオブジェクトを生成しなければならない。
オブジェクトを生成しなければならない理由としては
スキーマ、列の定義が必要だからだと思われる。
データの追加、削除をデータテーブルに対して行う場合はアクティビティを通して実行する必要がある。
ファイル・ディレクトリ操作
ディレクトリ配下のファイルを全て取得
Microsoft Scripting Runtime でいうところの
「FileSystemObject」で利用できる「GetFolder(args).GetFiles」に相当する。
ディレクトリ配下の txt を全て取得する場合は
Array of [String]で変数を宣言して代入アクティビティで代入すれば良い。
fileList = System.IO.Directory.GetFiles(strFolder,”*.txt”)
上記の String 型の配列、fileList からデータを取り出す際は
For each アクティビティを利用することで順に取り出すことが可能である。
OS 上の特殊なディレクトリを取得
Windows にはあらかじめ用意された特殊なディレクトリが存在する。
UiPath で利用する場合は「Get Environment Folder」 を活用する。
デスクトップのルートディレクトリを指定する場合は Desktop を指定する。
ファイル名から拡張子を除いた部分だけ取得
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 年間の営業日だけを取り出したい
worksheetFunction.Workday(開始日,日数,祭日リスト)
開始日を明日の日付に設定して
結果をテキストにすると X 行数=X 営業日目になる。
よく使う Worksheet Function
- MAX
- ROW
- INDEX
- IFERROR
- IF
- COUNTIF
- COUNTIFS
Is ~
- IsError
value が起きているセルなどを検出できます。
-
IsEmpty
-
IsNothing
※Is Nothing
の方が少し動作が速いが無視できるレベル
IsNothing 関数
は値型の変数に対しても使えるのに対し
Is Nothing
は値型の変数に対して使用するとビルドエラーになります
参考資料・URL
公式
Qiita
RPA Navi
UiPath 入門編 4 繰り返し処理について - Automation Lab
UiPath ループ処理まとめ
Discussion