WinActor と VBA を用いた RPA 事例

## 概要
弊社の社内でのRPAの進め方と実際にRPA化した業務について、ご紹介したいと思います。
以下の内容で説明させて頂きます。

* 社内でのRPA進め方
   - RPA化のステップについて
   - RPAの推進方法
   - ユーザ部門に対するRPAの周知
   - RPA適用可能業務の洗い出しと選定
   - 既存業務の標準化
* RPA化事例
   - 営業報告資料作成業務のRPA化
* RPAテクニック紹介
   - タスクスケジューラでシナリオを実行する1
   - タスクスケジューラでシナリオを実行する2
* 終わりに

## 社内での RPA 進め方
### RPA化のステップについて
既存業務をRPA化するためには、大きく3つのステップがあると考えています。
![RPAステップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/48fdf8ca-831f-c698-edfd-267f185fb3e5.png)

A. 対象業務の選定、可視化、標準化
 - 主にユーザ主体で行うフェーズとなります。
 - RPA化適用業務を洗い出して、選定します。

B. RPAシナリオ作成、テスト
 - IT部門が主体で行うフェーズとなります。
 - RPAシナリオを作成し、テストを実施します。

C. RPA運用、修正
 - IT部門が主体で行うフェーズとなります。
 - 作成したシナリオを運用し、必要に応じて修正などの保守を行います。

### RPAの推進方法
RPAの推進方法は、2種類あると思います。

1. ユーザ部門にRPAのシナリオ作成・実行・メンテナンスを一任する
2. IT部門がRPAのシナリオ作成・実行・メンテナンスを一任する

弊社では、ユーザのスキルや管理のしやすさなどを考慮して、後者を選択しました。
展示会では、"RPAはユーザが簡単にシナリオを作成して業務自動化できる"と謳っていますが、本格的な業務自動化レベルのシナリオを作成するのは、かなりのスキルが要求されると思います。
**個人的には、Excelのマクロ自動化機能を使用してマクロを作成し、必要な部分を手作業でコード修正できるレベルのスキルが必要ではないかと思います。**
もっと簡単なツールがあるのかもしれませんが、WinActorはそんな感じです。

### ユーザ部門に対するRPAの周知

最初にユーザ部門に説明する際は、RPAがどんなものかを知ってもらうことが大切です。
言葉だけで説明しても、過度な期待や勝手なイメージは払拭できないと思います。
簡単なRPAシナリオを作成して、動いているところを見せつつ、説明する方がいいと思います。
私が例示したシナリオは、

* 勤怠管理システムにログインして、
* 電話回線経由で遠隔地の勤怠データを抽出する

という簡単なものです。
ほぼボタンを押すだけの作業ですが、RPAを知ってもらうには簡単な方がいいです。
最初はRPAの宣伝パワポを見せながら部門に説明していましたが、
過度な期待を抱かせてしまい、結局できたのはショボいものだったので、落胆させてしまうこともありました。

**RPAはルンバです。ゴミ屋敷の掃除はできません。掃除する場所も綺麗に片づけてあげなくてはいけません。**

![step1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/fa030582-d3bd-1cd8-1d4a-94fdce2f9ec6.gif)

### RPA適用可能業務の洗い出しと選定
#### 業務の洗い出し
RPAの概要を理解してもらった後は、RPA化できそうな業務をヒアリングします。
ここからは、実業務を担当している社員のヒアリングがメインとなります。
時間がある場合は、実務担当者を複数人呼んで、ワークショップのような感じでRPA化できそうな業務を洗い出してもらう方が効果的です。
このとき、**RPA化できそうな業務**というよりは、**嫌になる業務**とか**面倒くさい業務**などの切り口で洗い出した方が、色々な意見が出てきていいかと思います。

洗い出した業務から、RPA適用可能な業務を選定します。
私は以下の点を重視してRPA化する業務を選定しました。

- 削減工数が大きい
- ヒューマンエラー除去の貢献が大きい
- RPA化する労力が少ない

#### 業務の可視化
次にRPA化する業務を可視化します。
これは、RPAのシナリオを作成するために必要です。
詳細な業務手順書や業務フロー図などがあれば一番いいのですが、
RPA化対象になる業務は、大体がそういうものが整備されていません。
ユーザに手順書を作成してくれ、と言っても嫌がります。

そこでデスクトップ画面を録画するツールを使用して、ユーザに実際の操作をやってもらって、その動画を撮ることで業務可視化を行いました。
これなら、手順書を作るよりは、ユーザへの負担が少なく、かつ細かい作業内容も分かりやすくなります。
録画ツールは、フリーソフトもあるので、お好みで選択すればいいと思います。
弊社ではマニュアル作成ツールとして、["TeachMe Biz"](https://biz.teachme.jp/)を使用していましたので、そのツールに付属されている録画機能を使用しました。

## 既存業務の標準化
次に、既存業務をRPA化するにあたり、業務の標準化を行います。
これは必須ではありませんが、弊社の場合は、大体の業務が非効率なフローで運用されています。
なので、これを機会に効率的なフローに変更することを検討しました。

### 標準化の例（営業報告資料のフォーマット統一）
標準化は、色々なバリエーションがあり、一概には言えません。
ここでは、弊社で行った標準化の一例をご紹介します。

弊社では、毎月営業報告会議を行っています。
弊社は全国で7つの事業部があり、それぞれの事業部で独自の営業報告資料を作っていました。
そのままの状態では、RPAのシナリオを7つ作成しなければならず、非効率でした。
そこで、営業報告資料のフォーマットを全事業部で統一して、1つにまとめました。
標準化で大変なことは、現場の納得を得ることです。
ここは、ユーザ部門にRPAへの理解があり、かつ影響力の強い人がサポートに入ってくれないとなかなか進みません。
各事業部は今自分たちが使っているフォーマットが良しと思っているので、それを変えるのは結構大変です。また、事業部によっては、このデータは必須なので、資料から無くすことはできない、というものもあるので、本当に必須なのかをしっかりと検討しつつ、粘り強く交渉していく必要があります。

≪標準化前≫
![標準化1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/d102e45e-48ae-c36d-672e-bb8d69337399.png)

≪標準化後≫
![標準化2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/7d7db15a-0820-333c-b976-29518b842767.png)


## RPA 化事例
### 営業報告資料作成業務の RPA 化

弊社のRPA化事例として、**営業報告資料作成業務のRPA化**をご紹介します。
RPAといいつつ、VBAとの合わせ技になっています。

`最初はRPAオンリーでできるかと考えていましたが、検証した結果、現状のRPAはそこまでできないと判断して、エクセルやパワポなどOfficeアプリ部分はVBAを使用することにしました。ちなみに、WinActorでエクセルの集計操作をしようとすると、このようなフローチャートになります。流石にこれはイカンということで、VBAにしました。`
![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_300531_65cc0194-eed8-3465-3dd3-7810da358ffc.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/9b4f4b79-69a8-1457-f3c5-4162ba8852cd.jpeg)


前述しましたが、弊社では、毎月営業報告会議を行っています。
全国で7つの事業部があり、それぞれの事業部で独自の営業報告資料を作っていました。
RPA化にあたり、まずは営業報告資料のフォーマットを統一しました。

**従来は、営業報告資料は、以下の手順で作成していました。**
1. 会計システムから前月の売り上げ実績データをCSVで出力する
2. 会計システムから前年同月の売り上げ実績データをCSVで出力する
3. 会計システムから4月から前月までの累計の売り上げ実績データをCSVで出力する
4. 会計システムから前年4月から前年前月までの累計の売り上げ実績データをCSVで出力する
　※自事業部の出力項目を手作業で複数選択していく必要がありミスが発生しやすい
5. 出力したCSVを担当者が独自に集計して資料に貼り付ける表やグラフを作成する
　※属人化している部分で、作る表やグラフが担当者によって異なる
　※担当者によっては自分でマクロを組んだりして省力化していることもある
6. 表やグラフを貼り付けて、報告用のパワーポイントを作成する
　※属人化している部分で、表やグラフの見せ方（単位など）が担当者によって異なる

**RPA化後は、以下の手順に変わりました。**
1. 会計システムから必要なデータ（全事業部分のデータが入ったもの）を**RPA**で取得する
2. 取得したCSVを集計用エクセルに**RPA**で貼り付ける
3. **VBA**で各事業部が必要なデータを集計する
4. **VBA**で営業報告資料フォーマットPPTに集計した値を設定する
5. **VBA**で各事業部の共有フォルダに作成した報告資料(PPT)とデータのエビデンスとして集計用エクセルを保存する

≪RPA化後≫
![営業報告資料作成RPA化の進め方.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/d751019c-bf36-b6b8-059d-114f106368a8.png)

#### RPAとVBAの内容について

**RPA**は、会計システムから必要な売り上げデータを取得するために、ボタンをポチポチ押していくだけですので、説明は割愛します。
肝になるのは、**VBA**部分です。

**VBAは以下の役割を担っています**

- 売上データを集計する役割
- 集計したデータを元にPPTを作成する役割
- 作成したエクセルとPPTを指定フォルダに移動する役割

"売上データを集計する役割" と "作成したエクセルとPPTを指定フォルダに移動する役割" は重要ではないので、説明を割愛します。
重要なのは、**集計したデータを元にPPTを作成する役割**のところです。

**PPTをVBAで作成する**
PPTをVBAで作成するためには、**PowerPointVBA**を使用します。
ExcelVBAは有名で資料も豊富にありますが、**PowerPointVBA**は資料が少なく、事例もあまりありません。
以下のMicrosoft公式リファレンスが最も役立つと思います。
[Microsoft PowerPointVBAリファレンス]("https://docs.microsoft.com/ja-jp/office/vba/api/overview/powerpoint")

基本的にやっていることは単純で、集計用のエクセルの値を、営業報告資料のフォーマットPPTの指定の表やグラフに設定するだけです。
値を設定すれば、グラフの再計算機能によって自動的にグラフが作成されます。
VBAによる表やグラフへの値の設定方法は、[別記事]("https://qiita.com/kce119/items/bd694cbed3841eeb8a20")に書いていますので、そちらをご参照下さい。
![PPTフォーマットとの関係.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/2e2ac103-b982-7b18-81ab-761a03415344.png)

### RPAテクニック紹介
大したものではないですが、RPAのテクニックを2つ紹介したいと思います。
#### タスクスケジューラでWinActorのシナリオを実行する1
以下のbatファイルを作成して、Windowsのタスクスケジューラで"プログラムの開始"に登録します。
これで指定日時でシナリオを実行させることができます。

```
C:\programs\WinActor\WinActor.exe -f "C:\programs\WinActor\scenarios\TIMEPRO時刻同期.ums6" -r -e
```

#### タスクスケジューラでWinActorのシナリオを実行する2
弊社には**月一回、稼働6日目**に実行させたいシナリオがあります。
どうやって実現させるか悩みましたが、結局は以下の方法でやりました。

- 稼働日確認用のREST APIサーバを立てる
- PowerShellでREST APIサーバに問い合わせて応答内容で稼働日を判定。該当日であれば、**Write-EventLog**でイベントログを発行する。
- タスクスケジューラでイベントログの発行をトリガーにして、RPAのbatファイルを実行する

REST APIサーバの立て方の説明は割愛します。
REST APIサーバの指定URLにGETメソッドでアクセスすると、以下のようなJSONが返されます。
"kado_days"は月初めで稼働何日目かを示します。
"kado_flg"は稼働日かどうかのフラグです。

```
{
  "kado_days": 2, 
  "kado_flg": 1
}
```

PowerShellで以下の内容のps1ファイルを作成して、タスクスケジューラに登録します。
月初め1日目から10日目くらいまで実行する設定にしています。
該当の日に実行された場合は、イベントログが出力されます。
イベントログが出力されるとイベントログをトリガーに実行するタスクスケジューラが起動してRPAのシナリオを実行する仕組みです。

```
$JSON = Invoke-RestMethod -Uri "http://10.221.39.245:8080/kadoubi" -Method GET
if ($JSON.kado_days -eq 1) {
    #稼働1日目は月初処理で包含しているため週次は実施しない
}
Elseif ($JSON.kado_flg -eq 0){
    #休日は実施しない
}
Else {
    Write-EventLog -LogName Application -Source RPA -EventID 11 -EntryType Information -Message "【RPA】システム_SS1ログ出力シナリオ（週次）実行命令"
}
```

### 終わりに
弊社では去年の1月からWinActorを使ってRPAを進めてきました。
最初はRPAでどれだけ工数が削減できるか期待していましたが、実際はまだまだかなーという印象です。RPAはボタンを押すマシーンで、コアなところはVBAをゴリゴリ使って、ようやく業務が自動化できた、という状況です。
日経コンピュータが実施したRPAの活用状況に関する独自調査の記事には、WinActorを使用してかなりの工数削減が実現したと各社の事例が載っていましたが、WinActorだけでそこまで削減できるのかなと疑わしく思って見ていました。
RPA自体よりは、RPA化するために業務標準化が必要です、という体で非効率な業務にテコ入れする方が効果が大きいのかなあ、と感じています。