WinActorでテンプレートを作る

# はじめに
この記事は「RPA Advent Calendar 2021 - Qiita」の **５日目** の記事です。

https://qiita.com/advent-calendar/2021/rpa

[**◀ ４日目** の記事は、ザーマエさんです。](https://qiita.com/zamaezaaa/items/c516adbe2d8975b8aef9 "ZapierからAutomation 360 Control RoomのAPIを叩いてロボットを実行する")
[**▶ ６日目** の記事は、RPAbot @ RPAトレンド情報発信中さんです。](https://qiita.com/RPAbot/items/cf75fe5dd64e6463b2ce "2021年RPA業界この1年を振り返る")

# RPAで毎回テンプレートを作ってと言われたら
私は仕事柄、代行してWinActorのシナリオを作成することが多いです。
お客様のご事情に合わせてシナリオ作成をしておりますので、
「**WinActorのルールを活用してちょっと一工夫**」
したシナリオについて共有させていただければと思います。

まず質問です。

:::note info
　RPAでCSVファイルから取得したデータをExcelファイルに転記する場合、
　皆様はテンプレートをどうやって作成しているでしょうか？
:::
回答としてはだいたい以下の内容が挙げられると思います。

* 前もって作成してあるExcelファイルをコピーして新規作成
* 特定の場所にあるExcelファイルにどんどん追記する

私もよく、前もって書式設定されているExcelファイルをコピーして、テンプレートを作っています。
そのほうが、使用するノード数が少なくて済み、RPAの処理時間が減らせるためです。

今回のお客様は、間違ってテンプレートのExcelファイルを削除するかもしれないから、
どうしても**RPA側で毎回テンプレートのExcelファイルを新規作成してほしい**とのことでした。

となると、使用するノード・ライブラリ数が増えてしまい、
作り方によっては保守性が下がるシナリオになってしまいそうだったので、
WinActorのルールの範囲内でなるべくスマートに作る方法を考えてみました。

# 今回主に実現したいこと
1. ファイル「テンプレート.xlsx」を新規作成
2. ファイル「テンプレート.xlsx」に項目名を設定
3. ファイル「売上登録.csv」の指定した読取行のデータを取得
4. 取得した「売上登録.csv」のデータを「テンプレート.xlsx」の指定した転記行に設定
5. ファイル「テンプレート.xlsx」を上書き保存
6. 読取行と転記行を「＋１」ずつカウントアップ
7. 上記処理の3～6までをデータ件数分の回数実行
8. 最後に「テンプレート.xlsx」を閉じる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646663/3fef8587-8fd4-cc7a-89e8-522f90d3bf52.png)

# 各種ファイル構成
まずはPCのデスクトップに「シナリオ」という名前のフォルダを作成。
そこへ**WinActorのシナリオファイル**と**CSVファイル**の２つを保存しました。

:::note warn
WinActorのファイルは、<strong>新規作成したら一度保存</strong>をしておいてください。
（未保存だと、ライブラリ使用のパス取得での動作確認ができません。）
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646663/2dacc7ab-11f5-39d8-31d7-db1b1ee10df9.png)
※ CSVファイルは、メモ帳で適当なデータを手入力で作成してcsv形式で保存したものです。
※ フォルダ「OLD」は作成不要です。（一時保存する用に私が作成したものなので…）

# フローチャート表示エリア
フローチャートの組み方は以下の通り。（WinActor ver7.3.0 使用）
ノード・ライブラリの詳細設定は後述の[【参考】各種詳細設定 ](https://qiita.com/inaho3517/private/794e2a21917daff21f4f#%E5%8F%82%E8%80%83%E5%90%84%E7%A8%AE%E8%A9%B3%E7%B4%B0%E8%A8%AD%E5%AE%9A)をご参照ください。
![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646663/68a26131-1fba-1aff-f084-642a795b6805.png)


# 変数一覧タブ画面
変数の初期値はこちらの変数一覧に入れております。
修正が必要になった場合、確認する場所を極力減らせるのと、一覧で確認できるので便利です。
変数の初期値変更の頻度が高い場合は、Excelで「外部変数」のファイルを作成して、つど取得するようにしています。
ちなみに、**グループ「項目：xls/ﾃﾝﾌﾟﾚｰﾄ」の変数名は、CSVファイルの項目名と一致させるようにしておいてください。**ライブラリ［ csv → 変数値 ］は変数一覧の変数名とCSVファイルの項目名が一致していないと、読取がエラーになってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646663/a739d776-f2d9-876f-3274-9febaea63f21.png)

# フローチャートの解説

## 前処理
メイン処理を実行する前の、**準備作業を実行**します。

### 取得：パス
ライブラリの［13_ファイル関連］＞［05_ファイル名］を活用して特定のフルパスを自動取得したり、
ライブラリの［07_文字列操作］＞［03_連結］のライブラリで文字列の連結を行うことで、
「売上登録.csv」と「テンプレート.xlsx」のフルパスを取得します。

今回はシナリオフォルダの直下に各種ファイルを置いているので、自動取得してファイル名を連結しています。

### 新規作成：xls/テンプレート
ライブラリの［18_Excel関連］＞［01_ファイル操作］にある［Excel操作(新規作成)］で追加する。
その後、新規作成ファイルの１行目に項目名を設定するための処理を行います。

**指定した行に転記するための処理**をサブルーチンで作成しているので、こちらを活用します。
（サブルーチンの詳細は[ **転記：xls/テンプレート** ](https://qiita.com/inaho3517/private/794e2a21917daff21f4f#%E8%BB%A2%E8%A8%98xls%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88)をご確認ください。）
転記行は［ 汎用/カウント ］で設定しており、初期値に「１」が代入されているので、そのまま実行します。
また、項目名も変数一覧に初期値として設定しているので、各セルに設定されていきます。

## メイン処理
新規作成した「テンプレート.xlsx」に、「売上登録.csv」で取得したデータを転記していきます。
繰返処理・例外処理・サブルーチンを組み合わせて使用していますので、
少し複雑になっていきますが、ひとつずつ解説していきます。

### 繰返処理
**無限にループ処理をする**よう設定します。

:::note info
　プロパティの［ 条件式設定 ］ボタンを押下して、
　条件のプルダウンメニューにて以下の値の設定を実施します。
　<strong>［ 値 ⇒ 　 ］［ 等しい ］［ 値 ⇒ 　 ］</strong>
:::

この設定をしておかないと、無限に実行はされません。

### 例外処理
ライブラリ［ csv → 変数値 ］にてカウントアップしてデータ読み取っていきますが、
データのない行を読み取った場合にエラーが発生します。
**エラーが発生した場合、［ 正常系 ］から［ 異常系 ］の処理に移動して繰返処理から抜ける**
ようシナリオを組んでいます。

#### 正常系
「売上登録.csv」でデータを取得して、「テンプレート.xlsx」に転記していく処理です。
処理実行中に何かしらのエラーが発生した場合、［ 異常系 ］の処理に移動します。

##### 取得：csv/売上伝票
ライブラリ［ csv → 変数値 ］を使用しています。
**使用する前には、CSVファイルの項目名と同じ名前の変数を一覧に追加しておく必要があります。**

また、こちらの行数指定は**独特**で、ヘッダー（１行目）は含まない形で読み取りを開始するため
**指定した行と１行ズレた形で読み取っていく**ので注意が必要です。

:::note warn
　読取行を「１」と指定した場合は、CSVデータの「<strong>２</strong>」行目を読み取り
　読取行を「２」と指定した場合は、CSVデータの「<strong>３</strong>」行目を読み取り
　読取行を「３」と指定した場合は、CSVデータの「<strong>４</strong>」行目を読み取り
:::

##### 汎用/カウント＋１
ライブラリ［ カウントアップ ］を使用して、変数［ 汎用/カウント ］に「１」を加算していきます。
この場所に配置している理由は、「テンプレート.xlsx」の転記行の指定をするためです。

##### 転記：xls/テンプレート
ノード［ サブルーチン呼び出し ］を使用しています。
**指定した行に転記するための処理**に移動しますので、詳細は[ **転記：xls/テンプレート** ](https://qiita.com/inaho3517/private/794e2a21917daff21f4f#%E8%BB%A2%E8%A8%98xls%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88)をご確認ください。

ちなみにExcelに転記する処理は、ライブラリ［ Excel操作(値の設定２) ］を主に使用しています。
こちらライブラリのの行数指定は以下の通りです。（上記CSV読み取りの行数指定と比較してご覧ください。）

:::note warn
　転記行を「１」と指定した場合は、Excelの「１」行目に値を設定
　転記行を「２」と指定した場合は、Excelの「２」行目に値を設定
　転記行を「３」と指定した場合は、Excelの「３」行目に値を設定
:::

Excelの１行目に項目名がすでに転記されており、CSV読み取りの行の指定方法とズレがあるため、
**CSV読み取り処理後にカウントアップ**しております。

##### 保存：xls/テンプレート
ライブラリ［ Excel操作(上書き保存) ］を使用して、**転記した内容をつど保存**しています。
その際、Excelは開きっぱなしにしてあります。（閉じると開く処理に時間がかかるため）

#### 異常系
無限ループ処理から抜け出すよう、ノード［ 繰り返し終了 ］を配置しておきます。

### サブルーチングループ
今回の場合は、**Excelに転記する処理**が何回も発生するので、サブルーチンにまとめておきます。

#### 転記：xls/テンプレート
Excelに転記する処理は、ライブラリ［ Excel操作(値の設定２) ］を主に使用しています。
こちらのライブラリは、指定する「列」と「行」が分かれているので、カウントアップして処理する場合に便利です。
プロパティ内の、
指定する［ 列 ］には、［ 値 ⇒ A ］など、直書きして設定しています。
指定する［ 行 ］には、変数［ 汎用/カウント ］を設定しています。

CSVからExcelへの転記については、データによって書式設定や判定処理が必要です。

例えば今回の「プロジェクトNo」の「12-01」というデータをそのままExcelに転記して開くと、
「12月1日」と勝手に日付判定されてしまう場合があります。
このデータを元に別のシステムに入力する場合、「12月1日」でデータ取得してしまうので、
A列の**セルの書式設定を事前に**「文字列」に**設定しておく**必要があります。

また「消費税区分」の判定内容によって「消費税」の計算を変更する必要がある場合、
RPAで計算することも可能ですが、複雑な計算や判定処理が必要になってくると
ノード数が増えてしまい処理速度も落ちてしまいます。
計算処理についてはExcelが得意なので、**得意分野は他のシステムにお任せする**のも一つの手です。
今回の処理の場合は［ 切捨 ］［ 四捨五入 ］［ 切上 ］のExcel関数を利用した数式を用意しておき、
式の中にある「●」を文字列置換して変数［ 汎用/カウント ］に置き換えて、数式の設定を実施します。

## 後処理
メイン作業が終わった後の、**片付けの処理を実行**します。

今回の場合は、Excelが開きっぱなしの状態になっているので、保存せず全て終了します。
必要であれば、RPAの処理が完了した旨をメール通知するなど、いろいろ工夫することも可能です。

# まだまだスリム化は可能！
実は今回ご紹介した方法から、**さらにノード数を節約できます。**
（あまり節約しすぎると、あとで保守する人がフローを追うのに困ってしまうのでほどほどに！）

そのためには、**ノードやライブラリの別の設定方法**を学んだり、
WinActorバージョンアップでリリースされた**新しいノードやライブラリに挑戦する**ことで
別の解決方法が見えてくると思います。

また、今回紹介はしていませんが[ **WinActor Brain Cloud Library** ](https://winactor.biz/product/brain/cloud_library.html)を利用する方法や、
NTTATが提供している[ **ナレッジ一覧** ](https://winactor.biz/knowledge/)からサンプルシナリオをダウンロードしてくる方法もあります。
※ 外部サイトへの接続が必要になってきますので、会社によっては禁止されている場合もあります。

一度組んだシナリオも、ときどき見直してみると、さらにベストな方法が見つかることもあります。
何かのタイミングで**一度作成したシナリオをメンテナンスすることをお勧めいたします。**

# 【参考】各種詳細設定
シナリオ作成の練習の参考までに。（すべての詳細設定を網羅しているわけではないです。）
表のテキストをコピペできないようにしているのは、手入力でアウトプットいただきたいので画像にしております。
あしからず、ご了承ください。

## 使用ノード
今回は38ノードで実現しております。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646663/207f7c35-b553-0666-1fe3-7eb060800f0a.png)

## 条件式
よく使用するノードの、繰返処理・分岐・多分岐を1つずつ使用しております。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646663/f229f203-2974-ba38-381c-a2ac280c802c.png)


## プロパティの変数設定
プロパティに直書きしている設定値は記載されていないので、ご了承ください。
（例） A列の指定：［ 値 ⇒ A ］など
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646663/fe9f93e4-03a7-8563-53d8-222f6129aa1c.png)