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

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

この記事では、Automation Anywhereではどういった仕組みを標準機能でサポートしているかと同時に、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/b9c279acf1efffd4955c)**
>
>A2019
>
>* **[Automation Anywhere A2019でExcel操作をする](https://qiita.com/RPAbot/items/fe30755c674eae801656)**


# Automation AnywhereのExcel関係コマンド
利用できるコマンドとして、以下の10種類が標準で用意されています。これらを使うと、Excelを操作したい部分のかなりの部分をカバーできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/1ba769ae-19c5-69ae-d8da-3f6ec17d429e.png)

|コマンド|説明|
|:--|:--|
|Open Spreadsheet|Excel ファイルを開く。|
|Close Spreadsheet|変更を保存して閉じる。|
|Activate Sheet|アクティブにするシートを指定する。|
|Get Cells|単一セルの値を取得して変数に入れる。後続の処理のために複数セルの値を取得する。|
|Set Cells|セルに値を入力する。|
|Go to Cell|アクティブなセルを移動する。|
|Run Excel Macro|Excel マクロを実行する。|
|Delete Cells|セルを削除する。|
|Save Spreadsheet|変更を保存する。|
|Find/Replace|指定した値を検索/置換する。|

このほかは、キーボード操作やマウス操作をExcelのウィンドウに送る、特に[Excelで用意されているショートカットキー](https://support.office.com/ja-jp/article/1798d9d5-842a-42b8-9c99-9b7213f0040f?ui=ja-JP&rs=ja-JP&ad=JP)を駆使して操作します。もしくは、操作するExcelファイル内にあらかじめVBAでプログラムを書いておき、それを呼び出すという方法で複雑な操作の補完ができます。または、最後に紹介するBot Storeの拡張機能をインストールすることで、さまざまな追加コマンドを追加することができ、やりたいことがほぼすべてできるようになります。

後は、[ODBCインターフェイス](https://ja.wikipedia.org/wiki/Open_Database_Connectivity)を知っている人は、[Excelへの接続文字列](https://www.connectionstrings.com/microsoft-jet-ole-db-4-0/)を使いAutomation Anywhere のデータベース操作コマンドを使って操作することも可能です。

RPAツールによっては、Excelがパソコンにインストールされていなくてもファイル内容を簡易的に書き換える仕組みが用意されています (バックエンドの仮想マシン上で多数のExcelを処理する場合にいくつExcelのライセンスが必要になってくるかに影響、またExcel for Office 365の場合はユーザーライセンスのためバックエンドの利用がライセンス上難しかったり、RDSへのインストールサポートがないなどグレーな部分がある) が、Automation Anywhereの現バージョン (v11.3.2) ではサポートされていません。
> ただし、次期バージョンでは実装されるという噂があります。

# こんなことをやるには！？

### ファイルを読み込むには

Excelファイルを読み込むには、「Open Spreadsheet」コマンドを使います。

基本的な使い方としては、「スプレッドシートのパス」に開きたいファイルのパスを指定します。ここには`F2`キーで変数も挿入することができるので、システム変数を使った、パソコンによらないパスの一般化が可能です。ファイルの種類は標準の.xlsxだけでなく、CSVなどExcelが開くことができる別の形式も指定できます。

![aa-open-spreadsheet.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/dbccca18-ad19-5682-d5a7-0cc08c9df6de.png)
シートを開いてアクティブなシートを指定したり、開いたファイルの中の表の1行目がヘッダーであるとみなす指定 (「ヘッダーを含む」にチェック)をすることができます。これは「Get Cells」コマンドで複数/全セルを取得してLoop > Each Row in an Excel dataset コマンドの中で`$Excel Cell$`、`$Excel Column$`変数を使う場合に影響します。

ファイルを開くと、**セッション**が作られ、後に続くコマンドでいつ開いたExcelファイルについて操作するのかを指定します。複数のExcelファイルを開くときは、セッション名を変更して区別できるようにしてください。同じファイルを別のセッションで開くこともできますが、書き込みを伴う場合はバッティングするので避けてください。

![aa-open-spreadsheet-advanced.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/8e424a75-a633-d5c8-ebab-495ed3b9af11.png)
「詳細ビュー (Advanced View)」では、パスワードのかかったファイルを開いたり、読み取り専用モードで開いたりといったことを指定できます。

Automation Anywhere では、開かれたExcelは、明示的に閉じない限りは、すべての処理が完了した後も開いたままとなります。

### ファイルを閉じるには
「Close Spreadsheet」コマンドで行います。ファイルを編集した場合は閉じるときに保存されますが、「保存しない」オプションをチェックして編集内容を破棄することもできます。
![aa-close-spreadsheet.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/77e893fd-648c-c878-200e-98814cb63eeb.png)

### Excel ファイルを新規作成する
キーボードショートカットの`Ctrl`+`N`で新規ワークブックが作成されるので、これを使うことができます。ただし、その後ファイル名を付けて保存する操作に手間がかかるので、お勧めとしては、空のExcelファイルをあらかじめ作成しておき、新規作成して使いたいファイル名にコピーして使うと工数が省けます。

### 別名で保存するには

`F12`キーで「名前を付けて保存」ダイアログボックスが開き、「名前を付けて保存」ダイアログボックスでキーボード操作で新しいファイル名に続けて`ENTER`キーを押下するように指定します。「Insert Keystrokes」コマンドでは、キーボード操作をするウィンドウを指定する必要があるので、実際に名前を付けて保存ダイアログボックスを開きながら、「Insert Keystrokes」コマンドダイアログボックスを操作します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/a8d5f781-9a8f-c86c-b791-a2efd2b27cc3.png)

出来上がるコマンドは以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/a7d74996-629f-bf73-41f6-9b63a1f9121a.png)


別の方法としては、「Files/Folders > Copy Files」コマンドや「Rename Files」コマンドを使って、あらかじめ必要なファイル名のファイルを準備してから、Excelコマンドで編集するのがよいでしょう。その上で、保存は通常の「Close Spreadsheet」コマンドを使います。
![aa-save-spreadsheet.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/a8bfa9a1-bb7f-99e2-2379-988b3ed23c92.png)

### シートの切り替え、新規作成、名前変更を行うには

シートの切り替えを行う場合は、「Activate Sheet」コマンドを使います。(シートのそれぞれにセッション名をつけて区別することもできますが、動作がバッティングすることもあるようで、お薦めしません。)
![aa-activate-sheet.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/c62cc4f6-2492-51c1-395d-b24e265c1c51.png)
アクティブにしたいシートを番号またはシート名で指定します。シート番号は1から始まります。
非表示シートには切り替えられません。

シートの新規作成は`Shift`+`F11`のキーボードショートカット操作を行います。

シートの名前変更は、キーボードショートカット操作`Alt`＋`H`＋`O`＋`R`の後、新しい名前`ENTER`を「Insert Keystrokes」コマンドで入力します。

### セルの値を読む、セルに値を書き込むには
セルの読み込みには「Get Cells」コマンドを使います。「1つのセルを取得」「複数のセルを取得」「全セルを取得」の3つのオプションがあります。

**1つのセルを取得**
アクティブなセル、もしくはアドレスで「A5」のようにセルを指定します。セルの内容は変数に格納されます。
![aa-get-cells.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/6b299f99-8da3-7fe3-4c65-8afad773b464.png)

**複数のセルを取得**
アドレスでセルの範囲指定を行います。取得した内容はLoop > Each Row in an Excel dataset コマンドの中で`$Excel Cell$`、`$Excel Column$`変数から参照します。
![aa-get-cells-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/a2fffe2b-67cb-c9db-ec94-c4114915c708.png)

**全セルを取得**
シート内でデータが入っている範囲をすべて取得します。取得した内容はLoop > Each Row in an Excel dataset コマンドの中で`$Excel Cell$`、`$Excel Column$`変数から参照します。
![aa-get-cells-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/a1f3bf50-031c-6362-9279-1a47dc65235e.png)

>ヒント: 範囲指定をすると、アクティブセルは左上の(列・行ともに一番若い) セルになり、Loop > Each Row in an Excel dataset コマンドを使ってもアクティブセルは移動しません。

**Loop > Each Row in an Excel datasetのサンプル**
「LOOP」コマンドでは、以下のダイアログボックスで、中でループを回すコンテンツの種類を指定します。ここでは「Each Row in an Excel dataset」を指定します。
![aa-loop.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/5384cd3a-f5eb-6661-3d7e-355650bf5d32.png)

以下のようなアクションリストを構築して、`$Excel Cell$`、`$Excel Column$`で値を参照します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/5e1cf354-edf0-04c7-7567-6671f1135d32.png)

`$Excel Column(1)$`は、1つ目の列の、ループ内における現在の行の値を示しています。

>ヒント: `$Excel Cell$`、`$Excel Column$`には、Get Cellsを実行した時点でのスナップショットが格納されます。その後、Set Cell等でExcelファイルの中身を編集した場合、編集後の値を参照するにはもう一度Get Cellsコマンドを実行する必要があります。


セルへの書き込みには「Set Cell」コマンドを使います。
![aa-set-cells.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/35063675-05c6-c642-80a7-6d79de8fbd3c.png)

### セルの値を空白に戻すには
セルに空白文字を入力しても何も入力されていない状態にはなりません。この場合は、変数マネージャーで初期値を設定しない (=Null)変数を作成し、その変数の値を「Set Cell」コマンドでセルに書き込みます。もしくは`DEL`キー操作をウィンドウに送る手もあります。


### セルに式を入力するには
値と同様に、「＝」(イコール)で始まる文字列を「Set Cell」コマンドで書き込めばOKです。

### セルの値でなく式を読み込むには
キー操作`F2`をExcelウィンドウに送り、編集モードにしてから`Ctrl`+`A` (セル内の文字全体を選択)、`Ctrl`+`C` (クリップボードにコピー)を経て、クリップボード (`$Clipboard$`システム変数)から数式をコピーします。最後に`ENTER`キーを送り、編集モードを終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/c1efcfd9-3f3f-ca0f-6dcd-3adba32b1c0d.png)
 (取得される文字列には、先頭のイコールは出力されません)



### フォントやセルの色を変えるには
フォントやセルの色を変える、などの操作は、選択範囲に対してリボン上に表示されているコマンドはショートカットキーの押下で対応します。ただし、コントロール上で現在選択されている色は、対象とするセルの現在の色や装飾に依存するため、装飾が既定の状態 (フォント色=自動、セル色=白、太字/斜体/下線=なし、等)でない場合は意図しない結果になる可能性もあります。また、カラーパレットやショートカットはExcelのバージョンによっても異なるため、異なるバージョンが混在する場合も注意が必要です。
例:

* 太字:`Alt`+`H`+`1`
* 斜体:`Alt`+`H`+`I` +`1`
* 下線:`Alt`+`H`+`3`+`U`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/e2336213-da24-4272-1aec-74107b72cfe7.png)
アクティブセルに下線の装飾を適用する例
(`[ALT DOWN]`と`[ALT UP]`で囲われる文字は小文字である必要あり)

フォントの色を変更する例
赤: (`Alt`+`H`+`F`+`1`)+`↓`x7+`←`x4+`ENTER` 
(リボン上のフォントの色コントロールのドロップダウンメニューで下に7回、左に4回移動して赤を選択後、`ENTER`で確定)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/44b207de-7ec9-8ce2-4012-aaa2e89e8140.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/3f5cdaac-1f98-9d93-c985-bb90a6d61b66.png)


セルの色を変更する例
赤: (`Alt`+`H`+`H`)+`↓`x6+`→`x1+`ENTER` 
(リボン上のフォントの色コントロールのドロップダウンメニューで下に6回、右に1回移動して赤を選択後、`ENTER`で確定)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/84f84386-068b-4233-f31a-77bb78024428.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/8436b104-3725-db77-ee7a-445fab8894cb.png)


別の方法としては、Excelマクロ側で記載を行い、それを呼び出す手もあります。

### Excel データを配列変数に読み込むには
Array変数の初期化の段階でテーブルデータが含まれるExcelファイルを指定します。列数は`$ArrayColumns($<Array 型変数名>$)$`、行数は`$ArrayRows($<Array 型変数名>$)$`を参照することで取得できます。

ワークベンチの「変数マネージャー」でArray型の変数を作成し、「Read from excel/csv file」で Excelファイルを指定して、「すべてのセル (All Cells)」で読み込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/63a36bd5-3a0a-e175-25bc-43c3e2aba308.png)

一旦、Excelファイルを指定しておくと、「Variable Operation」コマンドで再初期化をする形で別のExcelファイルも指定できますので、アクションリストの中で動的に配列変数に読み込むことが可能となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/7ca8239a-e802-20c7-a74e-ee8421ec08aa.png)



### Excel でデータの入っている一番最後の列/行の情報を取得するには

2つの方法があります。

* **方法1:** 「Open Spreadsheet」コマンドの後に、「Go To Cell」コマンドで「行の末尾 (End of the row)」、「列の末尾 (end of the column)」で移動し、システム変数 `$Excel Cell Column$`、`$Excel Cell Row$`を参照することで現在アクティブになっているセルのアドレスを取得できます。

![aa-goto-cells.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/497557c8-8944-dca1-00e9-a868104def18.png)

たとえば、列方向の最大の列の場所を得るには以下のようにします。(いったんアクティブセルをA1に戻してから実行するのが安全です)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/c7d6d8ce-d16e-93e4-3024-5df4d7d36a11.png)
ただし、`$Excel Cell Column$`の返す値はアルファベットの値 (3なら"C")になります。


* **方法2:** ワークベンチの「変数マネージャー」でArray型の変数を作成し、「Read from excel/csv file」で Excelファイルを指定します。列数は `$ArrayColumns($<Array 型変数名>$)$`、行数は`$ArrayRows($<Array 型変数名>$)$`を参照することで取得できます。(ここではExcelのシート指定はできない。)

![variable-manager.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/3d76665b-12c6-2605-12b3-4d7c559d2d76.png)

### セルを削除するには
「Delete Cells」コマンドを使います。選択されているアクティブなセル、またはアドレスで指定したセルを削除します。Excelのセル削除オプションで出てくるように、セルを削除後にセルを左 or 上に移動、または削除するセルは行全体 or 列全体、なのかを指定できます。

![aa-delete-cells.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/f7065374-8fa2-955c-a80a-a328d1f032d3.png)

### 並び替えを行うには
表の中で並び替えたい列のどこかに「Go to Cell」コマンドで移動します。その後、ショートカットコマンドをExcelに送ります。(昇順は`Alt`+`A`+`S`+`A`、降順は`Alt`+`A`+`S`+`D`)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/8dfb0404-56d6-f07b-a3c1-2013733cfae5.png)

(`[ALT DOWN]`と`[ALT UP]`で囲われる文字は小文字である必要あり)

### 文字列/パターンの検索と置換
Automation Anywhere では、検索と置換ダイアログボックスを外側から操作しなくてもコマンドで対応できます。

* **検索(Find):** 検索結果が含まれるセルのアドレスをList型変数 (ダイアログボックス内で「セルのアドレスを割り当てる変数」で指定) に戻します。
* **置換(Replace):** 検索結果を指定の語に直接置き換えてセルに入力します。

![aa-find-replace.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/12428fb5-269d-12ab-0fea-681dd488e8f9.png)
Excelの検索/置換ダイアログボックスにある、「検索方向」「大文字と小文字を区別する」「セル内容が完全に同一であるものを検索する」のオプションを指定できます。ただし、正規表現は使えず、Excelの機能として持っているもののみ動作します。? といったワイルドカード文字は[Excel のヘルプ](https://support.office.com/ja-jp/article/0e304ca5-ecef-4808-b90f-fdb42f892e90?ui=ja-JP&rs=ja-JP&ad=JP)の書式に従います。


> ヒント: ワークシートデータでは、[検索する文字列] ボックスにチルダ文字を前に付けて、ワークシートデータ内でアスタリスク、疑問符、およびチルダ文字 (~) を検索できます。たとえば、"?" を含むデータを検索するには、検索条件として「 ~? 」と入力します。


### Excelマクロを実行するには
「Run Excel Macro」コマンドを使います。マクロ名と引数を指定します。引数はカンマ区切りで指定します。
![aa-run-excel-macro.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/5368f2a1-b72e-e065-5895-ab2bc3eea4d1.png)

# Bot Store にあるExcel拡張コマンド
Bot StoreにはAutomation Anywhere純正のBotが2つあります。

* [Perform Multiple Microsoft Excel Operations](https://botstore.automationanywhere.com/bot/perform-multiple-microsoft-excel-operations/)
* [Perform Various Spreadsheet Operations](https://botstore.automationanywhere.com/bot/excel-operations/)

最初の「Perform Multiple Microsoft Excel Operations」のほうがいろいろなコマンドが含まれているのでお勧めです。セルの結合、フォントや書式の変更、シートの名前や色の変更・シートの追加、名前を付けて保存、セルの幅の設定、列の挿入、ファイルの新規作成、データの並べ替え、セルの値を空白にする、など、これまで標準ではコマンドになっていなくUI or キーボード操作で行う必要があるとコメントした操作はほぼ可能です。

![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)

「Perform Various Spreadsheet Operations」には以下のコマンドが含まれています。
<img width="960" alt="1-6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/7acf1836-d5b9-7532-8ab0-cdd2741dd609.png">


# (おまけ) 運用環境と費用についての考察
今回は 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マクロよりも操作が簡単である。プログラミングがわからなくても操作が可能
* 取り出したデータを他のシステムとも簡単に連携できる

# 参考情報

* [Excel for Windows のショートカットキー - Excel ヘルプ](https://support.office.com/ja-jp/article/1798d9d5-842a-42b8-9c99-9b7213f0040f?ui=ja-JP&rs=ja-JP&ad=JP) - バージョンごとに若干異なる場合があるので注意が必要です。
* [ワークシートの文字列と数値を検索または置換する - Excel ヘルプ](https://support.office.com/ja-jp/article/0e304ca5-ecef-4808-b90f-fdb42f892e90?ui=ja-JP&rs=ja-JP&ad=JP)