公式サイトのKnowledge Baseサンプルを詳しく解説します。
今回は"Remove Excel Rows That Contain Keywords"です。
https://www.uipath.com/kb-articles/excel-automation.remove-rows-that-contain-keywords
シナリオ
Excelシートを読み込み、あらかじめ定義したキーワードが含まれる行を削除します。Excelシート"Cars"には車名、走行距離、価格、セーラータイプ(SellerType)が含まれています。この中から、"SellerType"が"Private Seller"または"Other"のものを削除して、"Cars2"シートに貼り付けます。
このサンプルで使用する機能
- UiPath アクティビティ
- Read range - Excelファイルを読み込みます
- Write range - Excelファイルを書き込みます
- Remove data row - DataTableから指定されたRowを削除します
- Windows Workflow
- For Each コントロール
- Assign コントロール
- While コントロール
- .Net 関連
- System.data.DataTable - Excelデータを格納するデータモデルです
- System.linq - LINQ(統合言語クエリ)のデータの要素数をカウントする機能を使います
準備
- サンプルZIPファイルをダウンロードします。
https://drive.google.com/open?id=0BxVAKI3l9Pc5ODM5WHFRdlNsVmM
zipファイルには以下のファイルが含まれています。これらのファイルを任意の場所に展開します。
- "Cars.xlsx" - 処理対象のExcelファイル
- "Main.xaml" - ワークフローのXAML実装
- "project.json" - UiPathプロジェクトファイル
- "test.csv" - 使用しません
2. UiPathを起動します。Main.xamlを選択し、UiPathで開きます。
3. Flowchartが表示されます。
4. 変数も定義されています。
実行と結果
ワークフロー作成ビデオ
解説
-
"Read Excel file"アクティビティ
-
"For each word from List"アクティビティ
-
"For Each"アクティビティ
"For Each word from List"はDisplayNameで、元々は"For Each"アクティビティです。
①配列"List"に対してFor Eachでループさせます。
"List"変数には文字型配列として"Private Seller"と"Other"をVisual Basic(VB)表記で定義します。
"word"は任意の変数名を指定します。変数といっても"Variables"として定義する必要ははありません。これは、変数のスコープは自動的にFor Each内にとどまり、また、変数の型もList変数の型(ここではString型)に依存するためです。
②AssignでString変数"query"にVB表記
String.Format("SellerType='{0}'", word)
の実行結果を代入します。String.Formatは、'{引数の番号}'部分に引数で渡された文字列を組み込む関数です。最初のFor Eachループの実行ではqueryには
SellerType='Private Seller'
という文字列が代入されます。参考までに引数が2つある場合は以下のようになります。
String.Format("SellerType='{0}' or SellerType='{1}'", "Private Seller", "Other")
この戻り値は、
SellerType='Private Seller' or SellerType='Other'
となります。③AssignでDataRow変数"RowsToDelete"にVB表記
dtInput.Select(query)
の実行結果を代入します。Selectは.NetのSystem.data.DataTableのメソッドで、引数で与えられた条件に合致するデータをDataRow型配列で返します。この例ではExcelの"Cars"シートに"Private Seller"が3行、"Other"が2行あるので最初のFor Eachループで3個の要素をもったDataRow配列が、2回目のループで2個の要素をもったDataRow配列がRowsToDelete変数に格納されます。
④Assignでint変数"i"にVB表記
RowsToDelete.Count-1
の実行結果を代入します。1回目のFor Eachループでは3-1で2が、2回目のループでは2-1で1が初期値として変数iに入ります。
この結果、次の⑤Whileループにおいて1回目のFor Eachループではi=2, 1, 0の3回、2回目のFor Each ループではi=1, 0の2回"Remove data row"アクティビティが実行されます。
なお、CountはLINQ(統合クエリ演算子)の演算子です。配列の長さを表す通常のLength演算子を使って
RowsToDelete.Length-1
としても同じ結果が得られます。⑤Whileループで変数iがゼロになるまで"Remove data row"アクティビティが実行されます。
⑥ "Remove data row"アクティビティを実行します。
"DataTable" - データ削除対象のDataTableであるdtInputを指定します。
"Row" - 削除対象のDataRowを指定します。1回目のFor EachループではRowsToDelete配列は3つの要素をもっており、いずれもSellerTypeは"Private Seller"です。RowsToDelete(0)、RowsToDelete(1)、RowsToDelete(2)が順に"Row"として渡されます。2回目の2つの配列要素のSellerTypeは"Other"です。
⑦ Assignで変数iを1デクリメントします。
-
-
"Write Excel file"アクティビティ
プロパティは以下のようになります。
①"WorkbookPath" - ファイル選択ダイアログで出力Excelファイルへのパスを指定します。
②"SheetName" - データを出力するExcelシートとして"Cars2"を指定します。
③"StartingCell" - データを出力するシート上の起点となるセルを指定します。
④"DataTable" - 出力データが入ったDataTable変数を指定します。