RPAでExcelを操作する際のヒント (Automation Anywhere拡張編)

RPAツールでは、Excelのプログラムインターフェイスを使って外部からExcelを操作したり、キーボード操作/マウス操作をExcelのウィンドウに送ることで、Excelを外部から操作できます。それにより、Excelファイルを加工したり、データを読み込んだり書き出したり、他のツールと連携させたり、といったことが可能になります。

前回の記事「[RPAでExcelを操作する際のヒント (Automation Anywhere編)](https://qiita.com/RPAbot/items/5e513aa259a595182dd0)」では、Automation Anywhere の標準コマンドを使って何ができるかを見てみましたが、今回はBot StoreにあるExcel拡張機能をインストールした状態で何ができるかを見てみましょう。

拡張機能を使うメリットは、キーボードショートカットやUI操作よりも**確実性**があがること[^1]、コマンドの使い方を覚えればいいので、キーボードショートカットやUI操作の方法を調べるよりも**面倒くさくない**、といったことが挙げられます。

[^1]: UIやショートカットはExcelバージョンで違うことがある。

**環境**

* Automation Anywhere Enterprise 11.3.2
* Automation Anywhere Community Edition
* Microsoft Excel 2019 ([Microsoft Office 2000 から Microsoft Office 2016 までをサポート](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/aae-client/bot-creator/commands/excel-command.html?_LANG=jpjp)、Office 2019もいけるっぽい) 

>**関連記事**
>v11
>
>* **[RPAでExcelを操作する際のヒント (Automation Anywhere編)](https://qiita.com/RPAbot/items/5e513aa259a595182dd0)**
>
>A2019
>
>* **[Automation Anywhere A2019でExcel操作をする](https://qiita.com/RPAbot/items/fe30755c674eae801656)**

# 1. Perform Multiple Microsoft Excel Operationsをインストールする
最初に、Bot Storeにある[Perform Multiple Microsoft Excel Operations](https://botstore.automationanywhere.com/bot/perform-multiple-microsoft-excel-operations/)をインストールしましょう。

ボットをダウンロードするには、Bot Store のアカウントが必要です。これは無料の Community Edition を使っていても無料でアカウントを取得できます。
![bot-store-perform-multiple-microsoft-excel-operations.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/34876f83-e2c2-4125-63f2-2008165e97c5.jpeg)


「Get Bot」でインストーラーをダウンロードした後は、右上の人アイコンから「My Downloads」でライセンスキーを取得して、インストーラーの所定の場所にコピペします。
![aa-my-downloads.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/a9eba098-ba9d-6e29-e022-6944cd6d5b8f.png)

![aa-copy-to-clipboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/1b1fee61-22ef-6c27-70d7-8ffa6125f4b2.png)

![aa-perform-multiple-excel-operations-eula.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/df6468e4-d166-d058-fdb0-b4c542ebb730.png)

そのあとAutomation Anywhere Client を起動すると、「Excelerate.mbot」というMeta Bot が追加されています。

Meta Botには以下の47種類のコマンドがあります。

![Perform-Multiple-Microsoft-Excel-Operations-Automation-Anywhere_Logic.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/b9533552-b235-8821-474c-7edf302fe9b3.jpeg)

|コマンド|説明|コマンド|説明|
|:--|:--|:--|:--
|**Close Excel**|Excelを閉じます。|**Home Font Borders**|セルの罫線を設定します。|
|**Data Sort Range by 1 Column**|1列で表を並べ替えます。|**Home Font Fore Color Theme**|文字列の色を変更します。|
|**Data Sort Range by 2 Columns**|2列で表を並べ替えます。|**Home Font Name and Size**|文字列のフォントとサイズを切り替えます。|
|**Data Sort Range by 3 Columns**|3列で表を並べ替えます。|**Home Font Style Bold**|文字列を太字にします。|
|**File Close**|ファイルを閉じます。|**Home Font Style Italic**|文字列を斜体にします。|
|**File Create New**|ファイルを新規作成して開きます。|**Home Font Style Underline**|文字列に下線を引きます。|
|**File Open**|ファイルを開きます。|**Home Number Format**|セルの表示形式を設定します。|
|**File Open Read Only**|ファイルを読み取り専用で開きます。|**Sheet Add Named Range**|名前付き範囲を設定します。|
|**File Open Save As**|名前を付けて保存します。|**Sheet Hide or Show**|シートの表示/非表示を切り替えます。|
|**File Open Save As CSV**|名前を付けてCSV形式で保存します。|**Sheet Hide Show Columns**|列の表示/非表示を切り替えます。|
|**File Save**|ファイルを保存します。|**Sheet Hide Show Rows**|行の表示/非表示を切り替えます。|
|**File Save and Close**|ファイルを保存して閉じます。|**Sheet Move or Copy**|シートの移動またはコピーを行います。|
|**Home Alignment Cells Merge**|セルを結合します。|**Sheet Rename**|シートの名前を変更します。|
|**Home Alignment Text**|文字列を左揃え/中央揃え/右揃えにします。|**Sheet Select Named Range**|名前付き範囲を選択します。|
|**Home Cell Delete Columns**|列を削除します。|**Sheet Select Sheet**|シートを選択します。|
|**Home Cells Delete Rows**|行を削除します。|**Sheet Set Cells**|セルに値を設定します。|
|**Home Cells Insert Columns**|列を挿入します。|**Sheet Set Column Width**|列の幅を設定します。|
|**Home Cells Insert Rows**|行を挿入します。|**Sheet Set Row Height**|行の高さを設定します。|
|**Home Clipboard Copy From To**|クリップボードを介してコピー&ペーストします。|**Sheet Tab Color**|シートのタブの色を設定します。|
|**Home Clipboard Copy From To Sheet**|シートをまたいでクリップボードを介してコピー&ペーストします。|**Workbook Add Sheet**|シートを新規追加します。|
|**Home Editing Add Function**|関数を追加します。|**Workbook Add Sheets Named**|名前を付けて複数シートを追加します。|
|**Home Editing Clear Contents**|セルをクリアします。|**Workbook Delete Sheet**|シートを削除します。|
|**Home Editing Search and Replace**|検索と置換を実行します。|**Workbook Run Macro**|マクロを実行します。|
|**Home Font Back Color Theme**|セルの塗りつぶしの色を設定します。|||

> 詳しいリファレンスは、一緒にインストールされる **Perform Multiple Microsoft Excel Operations-Automation Anywhere-ReadMe.pdf** を見てください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/da7869a2-45aa-5a61-216f-235e0639c4db.png)


サンプルも豊富にインストールされます (52個) ので、使い方もわかりやすく学習できそうです。(My Tasks\Bot Store\Perform Mulitple Microsoft Excel Operations\My Tasks)
![aa-excelerate-samples.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/e7f9f481-a316-766a-96dc-76ccef5878c1.png)

例: Bonus 01 - Create Color Chart.atmxの実行例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/7af3f740-a324-cad3-2952-bf46f27b2e19.png)


それぞれのコマンドの引数 (Inputパラメータ & Outputパラメータ)は、Excelerate Meta Botのダイアログボックスの中で確認できます。
![aa-excelerate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/0a929ea2-08ac-373c-052d-763f26321b73.png)

それでは、このMeta Botではどういった仕組みをサポートしているかと同時に、Excel操作でよくやりたいことをベースに逆引きで記載してみました。実際のロジックの使い方はサンプルプログラムを見ると理解が早いので、それぞれどのサンプルプログラムを見ればいいのかと実行結果を中心に記載します。

## こんなことをやるには！？
### ファイルを読み込むには
File Open (通常)、またはFile Open Ready Only (読み取り専用で開く)ロジックを使います。ただし、これらのロジックはInputパラメータがファイル名 (`vFileName`) のみなので、[標準のOpen Spreadsheetコマンド](https://qiita.com/RPAbot/items/5e513aa259a595182dd0#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80%E3%81%AB%E3%81%AF)の方がもっとオプションがあります (パスワードのかかったファイルが開けるなど)。

ただし[後のセクションでも述べる通り](#注意点-標準コマンドとの互換性セッションはどこに)、同じファイルを別々のセッションで開くなど複雑なことをしない限りは、標準の方法で開いたExcelファイルを拡張機能コマンドからも同じファイル名つながりで操作することができそうなので、ファイルの読み込みには標準のOpen Spreadsheetコマンドを引き続き利用するのが良さそうです。

### ファイルを閉じるには
File Open/File Open Ready Onlyロジックで開いた場合は、File Closeロジックでとじましょう。Inputパラメータはファイル名 (`vFileName`)です。

### Excel ファイルを新規作成する
File Create Newロジックが使えます。新規作成された空のファイルはExcelで開かれます。Inputパラメータはファイル名 (`vFileName`)です。標準コマンドには該当する方法がないので重宝します。

### 別名で保存するには
File Open Save Asロジックが使えます。Inputパラメータは2つのファイル名 (`vFileName1`(元のファイル名)、`vFileName2`(新しいファイル名))です。ただし、動作を見ているといくつか癖があり、おそらく裏では`vFileName1`のファイルを`vFileName2`に保存して`vFileName2`をExcelで開いているのではないかと思われます。`vFileName1`に未保存のデータは`vFileName2`には引き継がれず、`vFileName1`のファイルは存在し続けます。File Open Save Asロジックを実行する前に、いったん変更内容を`vFileName1`に上書き保存したほうがよいです。

特定のシートのデータをCSVに保存するFile Open Save As CSVロジックもあります。

### シートの切り替え、新規作成を行うには
以下のロジックが使えます。

* Workbook Add Sheet
* Workbook Add Sheets Named
* Workbook Delete Sheet
* Sheet Hide or Show
* Sheet Move or Copy
* Sheet Rename
* Sheet Tab Color

### セルの値を空白に戻すには
Home Editing Clear Contentsロジックが使えます。指定した範囲の値のクリアだけではなく、コメント、書式、ハイパーリンクを消去する指定もできるのが便利です。

### フォントやセルの色、書式などを変えるには
以下のロジックが使えます。

* Home Alignment Text
* Home Font Back Color Theme
* Home Font Borders
* Home Font Fore Color Theme
* Home Font Name and Size
* Home Font Style Bold
* Home Font Style Italic
* Home Font Style Underline
* Home Number Format

色々なことができるので、サンプルとリファレンスマニュアルのPDFを参照してください。

### セルを結合するには
Home Alignment Cells Mergeロジックが使えます。

### セルの高さと幅を変更するには
以下のロジックが使えます。

* Sheet Set Column Width
* Sheet Set Row Height
* Sheet Hide Show Columns
* Sheet Hide Show Rows

### 並び替えを行うには
以下のロジックが使えます。それぞれソートする列を1, 2, 3列選択して順番に並び替えます。`$vCellRange$`に対象となるセル範囲をA1形式で指定して (例: A1:K10)、`$vSortKeyX$`にソートする列の指定した範囲内での番号、`$vSortOrder$`に並び替え順 ("Ascending" or "Descending")を指定します。

* Data Sort Range by 1 Column 
* Data Sort Range by 2 Columns 
* Data Sort Range by 3 Columns 

それぞれ、Test Mbot Logic - DataSortFilterOneColumn().atmx、Test Mbot Logic - DataSortFilterTwoColumns().atmx、Test Mbot Logic - DataSortFilterThreeColumns().atmxというサンプルがあります。

**Test Mbot Logic - DataSortFilterOneColumn().atmxの例**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/c5034a5f-bea6-519c-6acb-1e57e0b28e0d.png)


## 注意点: 標準コマンドとの互換性、セッションはどこに？
Automation Anywhere に標準で実装されているExcelコマンドは、必ず「セッション名」を指定する場所がありました。複数のExcelファイルやセッションを扱う場合には、このセッション名で区別をしていましたが、Perform Multiple Microsoft Excel Operations Meta Botにはセッション名を指定するInput/Outputパラメータがありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/bc4ad8c7-edf2-d236-1fff-57c16ca53f6d.png)

替わりに、共通であるのが`vFileName`というファイル名になります。実際に試してみると、Perform Multiple Microsoft Excel Operations Meta Botのコマンドは標準のExcelコマンドとセッション名で共通のセッションは指定できないものの、ファイル名を通して同じファイル、同じセッションを操作することは可能そうです。

また、コマンドの内容を見てわかる通り、Perform Multiple Microsoft Excel Operations Meta Botのコマンドは、Excelファイルに値を書き込んだり編集/装飾をするもののみであり、値を読み込むコマンドはありません。**Excelファイルの高度な編集にはMeta Bot**を使い、**Excelファイルの読み込みとデータ活用には標準Excelコマンド**を使うといった使い分けとなります。

# 2. Perform Various Spreadsheet Operationsをインストールする
Automation Anywhere がBot Storeに出しているもうひとつの純正の Meta Bot、[Perform Various Spreadsheet Operations](https://botstore.automationanywhere.com/bot/excel-operations/)もインストールしましょう。一部もう一方と似たようなコマンドも含まれており、なぜAutomation Anywhere から別々のMeta Botで提供されているのか謎ですが、こちらにしか含まれていない便利なコマンドがあるので、それを中心に解説します。

インストール方法は前述と同じなので省略します。インストール後にAutomation Anywhere Client を起動すると、「Metabot-ExcelDLL.mbot」というMeta Bot が追加されています。

Meta Botには以下の22種類のコマンドがあります。
<img width="960" alt="1-6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/03d9f689-5b1a-e22b-dfe5-999f26db1194.png">

|コマンド|説明|コマンド|説明|
|:--|:--|:--|:--
|**ActivateSheet**|指定したシートに切り替えます。|**Filter Data**|データを与えられたパラメータでフィルターします。|
|**Change Font Style**|フォントスタイルを変更します。|**FindTextinExcel**|テキストを検索します。|
|**CloseExcelFile**|Excelファイルを閉じます。|**GetTotalRecords**|アクティブなシートの行の総数を得ます。|
|**ColNo2ColRef**|列番号をA1形式の列名に変換します。|**InsertNewRecord**|行を挿入します。|
|**ColRef2ColNo**|A1形式の列名を列番号に変換します。|**OpenorActivateExcelFile**|ExcelファイルをExcelで開くかアクティブにします。|
|**Copy - CTRL+A**|`CTRL`+`A`を押したのと同等、シートのアクティブ範囲をすべて選択します。|**OpenorActivateTextFileinExcel**|テキストファイルをExcelで開くかアクティブにします。|
|**Copy Data**|データをクリップボードにコピーします。|**PasteData**|データをクリップボードから貼り付けます。|
|**Create New Sheet**|新しいシートを作成します。|**Rename Sheet**|シート名を変更します。|
|**Delete Columns**|列を削除します。|**SaveASPDFFile**|ExcelファイルをPDFで保存します。|
|**Delete Sheet**|シートを削除します。|**SaveExistingFile**|既存のExcelファイルを保存します。|
|**DeleteRows**|行を削除します。|**Select Data**|データを選択します。|

>詳しいリファレンスは、一緒にインストールされる **Perform Various Spreadsheet Operations_Readme.pdf** を見てください。

## こんなことをやるには！？
### シートにデータが入力されている範囲を検出するには
Copy - CTRL+Aロジックを使うと、`CTRL`+`A`を押したのと同等に、データの入っているアクティブ範囲をExcel上で選択できます。ただし、なんらかの変数に範囲の文字列が返ってくるわけではありません。引数はファイル名 (`vInputFile`) とシート名 (`vSheetName`、シート番号では不可)を指定します。

GetTotalRecordsロジックを使うと、データの入っている範囲のうち行の数を取得できます。ヘッダーがある場合はその行もカウントに入ります。引数はファイル名 (`vInputFile`) とシート名 (`vSheetName`、シート番号では不可)を指定、`vTotalRecords`に指定した変数に行数が返ります。

### R1C1形式とA1形式の列番号を変換するには
**Excel列名変換問題を解決！**
標準で実装されている`$Excel Cell Column$`システム変数には、Excelシート上のアクティブセルの列がA1形式で格納されています。これは1列目なら"A"、26列目なら"Z"というように、1から9、AからZまでが数字となる26進数のようにふるまいます([対応表](https://takamin.github.io/techtips/xlsColNumMap))。一方、Excelテーブルを参照するループ内でデータを参照するシステム変数`$Excel Column(n)$`のnに指定するのは数字なので、ここにExcel列名変換問題が発生します。これを実装したロジックがColNo2ColRef/ColRef2ColNoロジックであり、すごく重宝します。


使い方ですが、ColRef2ColNo (A1形式から列番号に変換)であれば、ファイル名 (`vInputFile`) と列名 (`vColumnName`) をInputパラメータとして、`vCol`をOutputパラメータとしての列番号にして以下のようにアクションリストを組みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/0b3e8d78-4987-c4ec-9ddf-97897d4fb26a.png)
"AA"という列名は27番目である、という結果が返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/74de46e3-c5e7-f310-cb28-15ef90505cb6.png)

### フィルターを設定するには
Filter Dataロジックで実現できます。`vRange`にはフィルターをつける列の範囲をA1形式で (例: A:C)指定、`vFilterByCol`にはフィルターを適用する列をA1形式で指定 (例: A)、`vFilterValue`にはフィルターを適用したい値を代入 (この値が列にない場合はフィルターが適用されない)します。

以下のようなアクションリストを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/ec7e8f11-0ad0-7699-d83a-bd778a074d05.png)

元のデータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/3613314b-d6d5-7c0a-d0ce-479cf9c2db6a.png)

実行後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/5da80787-06d5-be87-75aa-dece1d3ecd17.png)


## 注意点: 標準コマンドとの互換性、セッションはどこに？
Automation Anywhere に標準で実装されているExcelコマンドは、必ず「セッション名」を指定する場所がありました。複数のExcelファイルやセッションを扱う場合には、このセッション名で区別をしていましたが、Perform Various Spreadsheet Operations Meta Botにはセッション名を指定するInput/Outputパラメータがありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/bc4ad8c7-edf2-d236-1fff-57c16ca53f6d.png)

替わりに、共通であるのが`vInputName`というファイル名になります。実際に試してみると、Perform Various Spreadsheet Operations Meta Botのコマンドは標準のExcelコマンドとセッション名で共通のセッションは指定できないものの、ファイル名を通して同じファイル、同じセッションを操作することは可能そうです。

また、コマンドの内容を見てわかる通り、Perform Various Spreadsheet Operations Meta Botのコマンドは、Excelファイルに値を書き込んだり編集/装飾をするもののみであり、値を読み込むコマンドはありません。**Excelファイルの高度な編集にはMeta Bot**を使い、**Excelファイルの読み込みとデータ活用には標準Excelコマンド**を使うといった使い分けとなります。


# (おまけ) 運用環境と費用についての考察
今回は RPA ソフトウェアである Automation Anywhere を使ってExcel操作を行ってみましたが、Excel操作を行うだけに特化すれば RPA を使わなくてもExcelマクロを使えば済んでしまいます。RPA は、どの主要ベンダーも、最低年間 100 万円弱くらいの費用がかかりますので、Excel操作だけでRPAを使うのはペイしないでしょう。RPA を実際に運用環境としてExcel操作に使うには、以下のような条件のいずれかを満たしている必要があるかと思います。

* 無料の Community Editionが使える小規模企業に該当 (年商500万米ドル未満、かつユーザー数/PC 250人/台未満)
* 既にRPAツールが別目的で導入されているため、Excel操作用の追加ライセンス費用があまりかからない
* Excel操作を他のシステムと連携させたり、大規模にExcel操作を行う必要がある

RPAツールをExcel操作に使うメリットは以下のようなものがありますので、上記の条件に該当するのであれば、活用してみたいところです。

* Excelマクロよりも操作が簡単である。プログラミングがわからなくても操作が可能
* 取り出したデータを他のシステムとも簡単に連携できる