5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

UiPathサンプル - Excelデータからキーワードを含む行を削除するサンプル

Last updated at Posted at 2017-09-20

公式サイトの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(統合言語クエリ)のデータの要素数をカウントする機能を使います

#準備

  1. サンプル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. 変数も定義されています。

#実行と結果

  1. Runボタン(またはF5キー)で実行します。
  1. Cars.xlsxの"Cars2"シートにSellerTypeが"Dealer"のもののみ出力されました。

#ワークフロー作成ビデオ
1から自分でworkflowを作るとこのようになります。
Video

#解説

  1. "Read Excel file"アクティビティ
    • Read range アクティビティ
      "Read Excel file"はDisplayNameで、元々の名前は"Read range"アクティビティです。
    ダブルクリックすると以下のようになっています。
    ①処理対象のファイルCars.xlsxが選択されています。
    ②読み取るシート名は"Cars"です。
    ③*Range*は何も指定しません。何も指定しないとシート全領域を読み込みます。  

    画面右側のPropertiesは以下のようになっています。
    - "Private" - チェックを入れるとLogデータを出力しません。
    - "AddHeaders" - Excelシートの1行目がヘッダー行の場合はチェックを入れます。
    - "DataTable"- Excelデータの出力先のDataTable変数(ここではdtInput)を指定します。dtInputは変数として定義しています。
    <img src="https://qiita-image-store.s3.amazonaws.com/0/202992/59c60151-2eaf-8899-bf0e-16f7a9792512.png">  

  1. "For each word from List"アクティビティ

    • "For Each"アクティビティ
      "For Each word from List"はDisplayNameで、元々は"For Each"アクティビティです。
     ダブルクリックすると以下のようになっています。
     <img src="https://qiita-image-store.s3.amazonaws.com/0/202992/34837e72-bfa0-f312-2028-7baec0b1bb9f.png" width=70%>
    
     ①配列"List"に対してFor Eachでループさせます。
     "List"変数には文字型配列として"Private Seller"と"Other"をVisual Basic(VB)表記で定義します。
     <img src="https://qiita-image-store.s3.amazonaws.com/0/202992/9f514569-133b-1bb7-9aa1-db0220d8b457.png">
    
     >参考までにVBのコードで実際に記述すると以下のようになります。
     <img src="https://qiita-image-store.s3.amazonaws.com/0/202992/2a5c3eeb-0e8a-d61d-1919-7ea7ac80bcc9.png">
    
     "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"アクティビティが実行されます。
    <img src="https://qiita-image-store.s3.amazonaws.com/0/202992/20a8188a-feb1-59f9-1b61-91779afc0c85.png">

    ⑥ "Remove data row"アクティビティを実行します。
    <img src="https://qiita-image-store.s3.amazonaws.com/0/202992/1b9a78cf-9a3f-7ffe-c1a4-1103e4d257bd.png">

    プロパティは以下のようになっています。
    <img src="https://qiita-image-store.s3.amazonaws.com/0/202992/de60aedd-48b7-dc11-9f1d-22f5bdc92d24.png">

    "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デクリメントします。  

  1. "Write Excel file"アクティビティ

    • "Write range"アクティビティ
      "Write Excel file"はDisplayNameで、元々は"Write range"アクティビティです。

    ダブルクリックすると以下のようになっています。

    プロパティは以下のようになります。

    ①"WorkbookPath" - ファイル選択ダイアログで出力Excelファイルへのパスを指定します。
    ②"SheetName" - データを出力するExcelシートとして"Cars2"を指定します。
    ③"StartingCell" - データを出力するシート上の起点となるセルを指定します。
    ④"DataTable" - 出力データが入ったDataTable変数を指定します。

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?