【UiPath】Excelデータ書き込み　複数行

# はじめに
UiPath Studioを用いてExcelにデータ入力を行うケースが数多くあります。
1行毎に指定したセルに書き込みを行えば解決はできますが、1行に対して複数箇所に書き込みを行う場合、アクティビティを大量に配置しなければなりません。
今回はこのようなお悩みを解決できる手段として自身のナレッジを残します。

## この記事の対象者
- UiPath初学者
- UiPath Studioを用いて1行に対して複数カ所書き込みを行いたい方

# 目次
1. 開発環境紹介
1. 処理要件確認
1. 実装
1. 解説

# 開発環境紹介
- OS：Windows11
- 開発ツール：UiPath Studio
- バージョン：2023.10.0
- ライセンス：Community License
- モダン デザイン エクスペリエンス：いいえ
- Microsoft Excel：2310

:::note warn
- 開発環境に関しては、バージョン等が異なっていても問題ございません。
- バージョンによっては画面が一部異なる可能性はございます。
:::

### UiPath 依存関係
| パッケージ名 | バージョン |
|:--|:--|
| UiPath.Excel.Activities | 2.22.2 |
| UiPath.Mail.Activities | 1.21.1 |
| UiPath.System.Activities | 23.10.2 |
| UiPath.Testing.Activities | 23.10.0 |
| UiPath.UIAutomation.Activities | 23.10.3 |

# 処理要件確認
・1行毎に契約番号を用いてデータ検索を行い、取得データをExcelに入力する。
今回は複数行書き込み方法を紹介するため、入力するデータは下記の固定値とする。
※補足として実務想定の内容も参考程度に記載します。本記事では入力情報のデータのみ使用します。

### サンプルデータ(連絡先取得台帳.xlsx)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524399/a15467dc-51c1-3a83-9fa7-e271b8c22054.png)

### Excel入力情報
| カラム名 | 入力有無 | 入力情報 | 補足(実務想定) |
|:--|:--|:--|:--|
| No | なし |  | データが何件あるか分かりやすくするために表記 |
| 契約番号 | なし |  | 検索Keyとして利用 |
| 電話番号 | あり | 03-****-**03 | 検索結果から取得するデータ |
| メールアドレス | あり | ***@gmail.com | 検索結果から取得するデータ |
| ロボ実行者 | あり | OKiNA | ロボ実行方法によって異なるが、実行者情報を取得して入力・CONFIGから取得して入力するケースなどがある。 |
| 処理結果 | あり | OK | 処理結果に応じて入力する想定。OK：「電話番号」、「メールアドレス」が全て取得できた場合。NG：「電話番号」、「メールアドレス」でいずれかの値が取得失敗した場合。 |
| エラー内容 | なし |  | 処理失敗時にエラー内容を入力する想定。(例.契約番号で検索結果がヒットしない、「電話番号」または「メールアドレス」の一部の情報が不足している。) |
| 処理日 | あり | 2023/01/27 | いつ処理を行ったかを入力する想定。ロボ実行日(システム日付)をyyyy/MM/dd形式で入力する想定。 |
| 再鑑者 | なし | | ロボ処理結果の内容に問題がないかWチェックを行う想定。 |

処理要件に関して、シンプルな内容です。
実務でも検索結果を取得してExcelに転記するケースは多々あるため、処理を細分化して考えてみましょう。

■ケース1
セルに書き込む情報を1個1個書くパターン

■ロジック1
1.書き込みを行いたいセル情報を変数に格納する。
2.書き込みを行いたいデータを変数に格納する。
3.「電話番号」(C2)に取得した値を書き込む。
4.「メールアドレス」(D2)に取得した値を書き込む。
5.「ロボ実行者」(E2)に実行者の情報を書き込む。
6.「処理結果」(F2)に処理状況をもとに値を書き込む。
7.「処理日」(H2)にシステム日付をもとに値を書き込む。
※上記の手順は一例になります。
[【UiPath】Excelデータ書き込み ハンズオン(初心者向け)](https://qiita.com/OKiNA_RPA/items/d72a7a40b993569496f2)

■ケース2
書き込みを行いたいセル情報と値の情報を纏めて繰り返し書くパターン

■ロジック2
1.書き込みを行いたいセル情報を変数に格納する。(配列格納)
2.書き込みを行いたいデータを変数に格納する。(配列格納)
3.配列に格納したデータをもとに書き込む。


# 実装
### ロジック1_完成イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524399/8683cbe6-7516-489c-95b6-afa5cdd19b5b.png)
### ロジック1_引数情報
| 名前 | 方向 | 引数の型 | 規定値 | 補足 | 注釈 |
|:--|:--|:--|:--|:--|:--|
| in_SheetName | 入力 | String |  |  | シート名 |
| in_Wb | 入力 | WorkbookApplication |  | UiPath.Excel.WorkbookApplication | ワークブック |
| in_WriteData | 入力 | WorkbookApplication |　 |  | 書き込みデータ |
| in_WriteRange | 入力 | String |  |  | 書き込みセル情報 |

### ロジック2_完成イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524399/c571182e-c99d-896d-259d-36ce0d74d853.png)
### ロジック2_引数情報
| 名前 | 方向 | 引数の型 | 規定値 | 補足 | 注釈 |
|:--|:--|:--|:--|:--|:--|
| in_SheetName | 入力 | String |  |  | シート名 |
| in_Wb | 入力 | WorkbookApplication |  | UiPath.Excel.WorkbookApplication | ワークブック |
| in_WriteData | 入力 | WorkbookApplication |　 |  | 書き込みデータ |
| in_WriteRange | 入力 | String |  |  | 書き込みセル情報 |

### ロジック2_設定関連
- 繰り返し (コレクションの各要素)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524399/195745f1-a29a-3e41-1622-975ffe993bc2.png)
~~~md:項目のリスト
```vb
in_ArrCell.Where(Function(r)Not String.IsNullOrWhiteSpace(r))
~~~

- 条件分岐 (if)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524399/de985282-55a7-2fa1-656a-e0b3e66a725b.png)
~~~md:条件
```vb
String.IsNullOrWhiteSpace(in_ArrValue(arrCount))
~~~


# 解説
**処理結果(ロジック1,ロジック2共通)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524399/a245ea45-70ac-b9f0-a4c8-cb6c1fa99776.png)

**ロジック1に関して**
[【UiPath】Excelデータ書き込み ハンズオン(初心者向け)](https://qiita.com/OKiNA_RPA/items/d72a7a40b993569496f2)をもとに処理ロジックを汎用的に使用できる共通部品を作成。処理要件通りの5項目分配置すれば実装は可能です。
【メリット】
* 書き込み箇所の項目名を記載することにより一目で入力範囲を確認することが可能。

【デメリット】
* 書き込み範囲が広い場合、同じ共通部品を同数配置する必要がある。
* 書き込み後にワークブック保存が都度行われるため、処理パフォーマンスが低い。

書き込み処理自体は指定したセルに対して、指定した値を入力します。
1行辺りの書き込み件数が1件の場合は共通部品1個の配置で良いです。
1行辺り複数行書き込みを行う場合、処理パフォーマンスを考慮した作りにする必要があります。
【要件変更に伴う発生する課題】
* 書き込み件数が増えた場合の想定
　今回のデータ書き込み要件は5項目です。
　データ書き込み要件が増える場合、同じ共通部品を増えた分だけ配置する必要がある。
  
* 可読性の低下
　同じ共通部品を大量配置するため、保守面を考慮すると管理しにくい形になります。
* 1行辺りの処理時間増加
　1行辺りの書き込み件数が増える場合、処理時間が増加します。

**ロジック2に関して**
【メリット】
* 一度に複数カ所書き込みが行えるため、処理時間が早い
* 複数カ所にデータ書き込みを行う際、共通部品1個で完結する

【デメリット】
* 配列書き込みでデータを渡すため、配列の基礎知識は重要

処理内容として、引数で渡した配列情報をもとに繰り返し書き込み後に保存する構築になっております。
1件だけ書き込みを行う場合でも、配列に1件分のデータを渡せばロジック1と同内容の処理が行えるので、個人的には<font color="red">**ロジック2**</font>処理を推奨します。

# おわりに
今回はUiPath Studioを用いてExcelに複数カ所の書き込みをご紹介しました。
実務として両方作成経験がありますが、よく利用しているのは<font color="red">**ロジック2**</font>になります。最初に作ったのはロジック1ですが、担当案件数を重ねることにより汎用的に使えるもの、便利なものを考える機会が増えました。1度作ったものも改善点は将来的に見つかるケースもあるため、今後も積極的に学習を進めようと思います。
今回の記事で課題解決のお役に立てたら嬉しいです。閲覧ありがとうございました。



# 参考サイト
[【UiPath】配列の操作(List,Dictionary,Array)](https://penrako.com/uipatharraymanipulation/)