Automation Anywhere A2019でExcel操作をする


Automation Anywhere A2019で利用できるExcel系のアクションについては『[3種類のExcelパッケージの違い+Data Table](https://qiita.com/RPAbot/items/95e8e76199196f23664d)』で概要を解説しました。この記事では、Excelを外部から操作してExcelファイルを加工したり、データを読み込んだり書き出したり、他のツールと連携させたり、といったことを行える**Excel の高度な操作パッケージ**を中心に、実際にやりたいことをやるにはどうすればいいのかを見ていきたいと思います。

日本語メニュー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/bfdf4ddb-380d-f0b2-cc56-7d7faea8e76c.png)
英語メニュー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/44d87c99-1198-adaa-e692-4a668c04e0e7.png)
>※アクションパレットの中のパッケージの順番はアルファベット/日本語文字コード順にソートされていますが、パッケージの中のアクションの順番は英語の名前順 (ABC順)になっています。

**利用環境**

* Automation Anywhere A2019.10 (ビルド2545)
* Microsoft Excel 2019 ([Microsoft Office 2000 から Microsoft Office 2016 までをサポート](https://docs.automationanywhere.com/bundle/enterprise-v2019/page/enterprise-cloud/topics/aae-client/bot-creator/commands/cloud-excel-command.html?_LANG=jpjp)、Office 2019もいけるっぽい) 

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


# こんなことをやるには！？
### ファイルを読み込むには
Excelファイルを読み込むには、**「開く」** (Open) アクションを使います。

基本的な使い方としては、「ファイルパス」に開きたいファイルのパスを指定します。ここには変数も挿入することができるので、システム変数を使った、パソコンによらないパスの一般化が可能です。ファイルはControl Roomにアップロードすることも可能です。ファイルの種類は標準の.xlsxだけでなく、CSVなどExcelが開くことができる別の形式も指定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/236bf95f-93f5-9710-d62f-dcdaf8205136.png)
シートを開いてアクティブなシートを指定したり、開いたファイルの中の表の1行目がヘッダーであるとみなす指定 (「シートにヘッダーを含む」にチェック)をすることができます。

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

パスワードのかかったファイルを開いたり、読み取り専用モードで開いたりといったことを指定できます。

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

### ファイルを保存する/閉じるには
**「閉じる」** (Close) アクションで行います。ファイルを編集した場合は閉じるときに保存されますが、「ファイルを閉じるときに変更を保存」オプションをOFFにして編集内容を破棄することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/fccb4dca-c742-08be-adfd-aff2b43483bf.png)

ファイルは閉じないで保存だけしたいときは**「ブックを保存」** (Save workbook) アクションも使えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/d2f260e2-a3d4-f568-1338-add06d8d582f.png)


### Excel ファイルを新規作成する
**「ブックを作成」** (Create workbook) アクションで行います。ファイルパスには、新規作成したいファイル名を記載します。新規作成する際のシート名も必要に応じて指定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/d788fe20-42bd-2c83-d6fb-f208c82c3ef0.png)


### 別名で保存するには
「名前を付けて保存」に相当するアクションは引き続き標準では用意されていません。A2019ではControl RoomにExcelファイルをアップもできるようになるため、シナリオとしてあまり使わないパターンだと判断しているのかもしれません。

Excelでは`F12`キーで「名前を付けて保存」ダイアログボックスが開き、「名前を付けて保存」ダイアログボックスでキーボード操作で新しいファイル名に続けて`ENTER`キーを押下するように指定します。**「キーストロークのシミュレーション」**アクションでは、キーボード操作をするウィンドウを指定する必要があるので、実際に名前を付けて保存ダイアログボックスを開きながら、「キーストロークのシミュレーション」アクションの詳細を操作します。

出来上がるアクションは以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/2aad873c-d838-4e19-5680-9c7de62c89a7.png)

2行目のアクションの詳細: 
(※Excelメインウィンドウのタイトルはファイル名の前後に`*`を付けることで、ウィンドウタイトルの微妙な変化に対して汎用性を持たせられます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/8bec08df-53e3-6988-a3d8-a8d529a884de.png)
3行目のアクションの詳細:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/ad76b18e-f45f-dcce-d6b5-e6f12ba86488.png)


別の方法としては、もしExcelファイルをローカルPC上で扱っているなら**「ファイル:コピー」**アクションや**「ファイル:名前を変更」**アクションを使って、あらかじめ必要なファイル名のファイルを準備してから、Excelコマンドで編集するのがよいでしょう。その上で、保存は通常の「閉じる」アクションを使います。

### シートの切り替え、新規作成、名前変更を行うには
シートの切り替えを行う場合は、**「シートに切り替え」**(Switch to sheet) アクションを使います。シートはインデックス番号または名前で指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/2a419f88-0855-5683-3eba-bfe01fe0507b.png)

シートの新規作成は、**「ワークシートを作成」**(Switch to sheet) アクションを使います。シート作成はインデックス番号または名前で指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/0efcbcce-70b5-ee42-c9cb-bdc155d50ae9.png)

シートの名前変更は、**「ワークシートの名前を変更」**(Rename worksheet) アクションを使います。対象となるシートはインデックス番号または名前で指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/0a15399d-145c-2c87-0a88-1c06a05664c3.png)


### セルの値を読む、セルに値を書き込むには
セルの読み込みには以下のいずれかのアクションを使います。(v11ではひとつのコマンドの異なるオプションでしたが、A2019では別々のアクションになりました)

* **「1つのセルを取得」** (Get single cell) アクション
* **「複数のセルを取得」** (Get multiple cells) アクション
* **「列を読み取る」** (Read column) アクション
* **「行を読み取る」** (Read row)アクション

それぞれ、さらにオプションに分かれています。「複数セルを取得」アクションは「すべての行」「指定の行」「セルの範囲」の3つのオプションがあります。それぞれ空のセルでない範囲を自動選択して結果を文字列型変数、リスト型変数、またはデータテーブル型変数に格納します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/15617e06-d0a9-4f09-eda8-c695974ae805.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/9e855f61-4891-dd24-4157-5176504cbac2.png)
※ 『[Excel データを配列変数に読み込むには](#Excelデータを配列変数に読み込むには)』も参照してください

返ってくるセル単体の値は**いずれにしても文字列型であり、セルに格納されている真の値ではなく書式が適用された後の文字列が返ります** 。(たとえばセルに数字で"0.01"が格納されていて、セルに整数の書式が設定されている場合、"0"が返ってきます。)この辺は、UiPathとは仕様が異なります。
※ 『[【Automation Anywhere A2019】Excelの基本操作/高度な操作でセルを取得したときの値の違いに注意](https://qiita.com/RPAbot/items/71180788baee33db48c3)』の解説も参照ください。

> **A2019.16 (ビルド6439)以降ではオプションが追加されています**
>セルに表示されている書式の文字列をそのまま取り出す (元々の高度な操作の動き) のか、セルに保持されている内部の値を抜き出す (基本操作の動き)のかを選べるようになりました。
>
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/ec37bc40-929e-b9f5-ba67-0a2bee73a9a3.png)


セルに値を書き込むには**「セルを設定」** (Set cell)アクションを利用します。書き込むセルは一度に1つしか指定できません。(範囲指定はできません。)文字列の冒頭を`=`にすると「セルの数式を設定」 (Set cell formula)アクションと同じ動きをするようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/6fcbe50e-de4f-7d2c-544a-088d9a95d216.png)

### セルの値を空白に戻すには
**「セルを設定」** (Set cell)アクションを利用しますが、「セルの値」フィールドは必須フィールドであり空欄にできません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/82cc7ad6-cc77-2c3b-7da6-72f81d84ab36.png)
そのため、ここにはデフォルト値を設定しない文字型変数を作成したうえで設定することで、セルの値を空白に戻すことが可能となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/6627dd8e-b836-ff9f-c41f-4f7833108e5d.png)
(※ `$prompt-assignment$`はデフォルト値を設定しないで作成しておく。途中から「文字列:代入」アクションで空白を代入しようとしても、同様に代入値を空欄にできないので。)

もしくは**「Go to cell」**アクティビティで該当するセルを選択した後、`DEL`キー操作をウィンドウに送る手もあります。

### セルに式を入力するには
セルに数式を入力するには**「セルの数式を設定」** (Set cell formula)アクションを利用します。書き込むセルは一度に1つしか指定できません。(範囲指定はできません。)文字列の冒頭には`=`を入れる必要があります。つまり、「セルを設定」(Set cell)アクションと同じ動きをするようです。(あえて別のアクションを設けているのはわかりやすさだけ？)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/22f69e87-f794-fdd1-0314-2891b4a19d05.png)


### セルの値でなく式を読み込むには
セルの数式を読み取るには**「セルの数式を読み取る」** (Read cell formula)アクションを利用します。出力の格納先の文字列変数では、`=SUM(A1:B2)`のように先頭に`=`が入った形の文字列として数式情報が得られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/52102af8-ed82-525a-1059-1de66b544d32.png)

### 単一/複数セルまたは行、列を選択する
セルの選択を行う**「セル/行/列を選択」** (Select cells/rows/columns) アクションは、**「キーストロークのシミュレーション」**アクションと組み合わせて、標準アクションにないことをExcelのショートカットを使って実行したいときによく使います。

単一セル (例: A5)、セルの範囲 (例: A5:C:10)、単一列 (例: D)、単一行 (例: 5)、列の範囲 (例: A:D)、行の範囲 (例: 5:10)など、さまざまなオプションがあるので必要なものを選択し、フィールドに決められた書式で範囲指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/4805580e-9fa9-7d06-b534-590a8f54352c.png)



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

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


アクティブセルに下線の装飾を適用する例
(`[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)

セルの色を変更する例
赤: (`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)

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


フォントやセルの色を読み取る方は**「セルの色を取得」**(Get cell color) アクションがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/2022eb96-0af8-65ad-c7fd-7b10c67eb7ab.png)

### フォント名やフォントサイズを変更する
これも「フォントやセルの色の変更」と同様にショートカットキーで対応します。対象セルが[選択された状態](#単一複数セルまたは行列を選択する)で以下のショートカットを**「キーストロークのシミュレーション」**アクションで送信します。

例:

* フォント名をMeiryo UIに変える:`[ALT DOWN]hff[ALT UP]Meiryo UI[ENTER]`
* フォントサイズを10にする: `[ALT DOWN]hfs[ALT UP]12[ENTER]`


### Excelデータを配列変数に読み込むには

**「ワークシートをデータテーブルとして取得」** (Get Worksheet as datatable)アクションを使います。ワークシート内でデータが入っている範囲が検出され、結果はテーブル型変数に格納されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/e92f203a-c89b-76b0-a064-79642a78f970.png)

>メモ: **「テーブルの範囲を読み取り」** (Get table range)アクションは、指定したテーブルの**ワークシートの中における範囲のアドレスを文字列型変数に格納**します。その後、「複数のセルを取得」 (Get multiple cells) アクションを使うとテーブル型変数に結果を格納できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/97a0b476-982d-5a34-a0c0-5974572dadd1.png)

### Excel でデータの入っている一番最後の列/行の情報を取得するには
**「開く」**アクションの後に、**「セルに移動 (Go To Cell)」**アクションで「行の末尾 (End of the row)」、「列の末尾 (end of the column)」で移動し、**「セルアドレスを取得」**アクションを参照することで現在アクティブになっているセルのアドレスを取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/9d3ad109-a99d-bdb9-1f89-d67f7d71bf05.png)
(いったんアクティブセルをA1に戻してから実行するのが安全です)

### セルを削除するには
**「セルを削除」** (Delete Cells)アクションを使います。選択されているアクティブなセル、またはアドレスで指定したセルを削除します。Excelのセル削除オプションで出てくるように、セルを削除後にセルを左 or 上に移動、または削除するセルは行全体 or 列全体、なのかを指定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/dd3cc0b6-c7bd-df53-309a-9fc6e0c0e1f1.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/ee1c50e5-1179-a6be-2420-a2126cea31b9.png)

テーブルに対して並び替える場合は**「テーブルを並び替え」** (Sort table)アクションを使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/25a41524-6d55-3193-868d-88302b4c0638.png)

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

**検索:** 検索結果が含まれるセルのアドレスをリスト型変数に戻します。**検索はセルの表示形式の処理後にセルに表示されている値ではなく、数式バー内に表示される値に対して行われます。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/91b1ac58-47e2-23ef-efd6-bb2ee9e4a0fb.png)

**置換:**:検索結果を指定の語に直接置き換えてセルに入力します。**検索はセルの表示形式の処理後にセルに表示されている値ではなく、数式バー内に表示される値に対して行われます。**検索結果が複数ある場合はすべてが指定した値に一括置換されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/0d55227a-7f2b-67b7-c729-4bf550f07304.png)

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

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

UiPathなど他のRPAソフトウェアでは、置換を実施するのにループ処理を組まなければならず手間がかかるため、この部分はAutomation Anywhereが簡単なところです。

### Excelマクロを実行するには
**「マクロを実行」** (Run macro) アクション使います。マクロ名と引数を指定します。引数はカンマ区切りで指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/ef557595-1bd7-ace2-14e8-3d5fac9de1ac.png)

### セルを結合するには
あらかじめ結合したいセル範囲を選択しておいてください。その後、**「キーストロークのシミュレーション」**アクションでショートカットコマンドをExcelに送ります。

`[ALT DOWN]hmm[ALT UP]`

### セルの高さと幅を自動調整するには
**「キーストロークのシミュレーション」**アクションでショートカットコマンドをExcelに送ります。

* 行の高さ: まず行を選択し、その後`[ALT DOWN]hoa[ALT UP]`を送ります。
* 行の幅: まず列を選択し、その後`[ALT DOWN]hoi[ALT UP]`を送ります。


### シートにデータが入力されている範囲を検出するには
データの入っているアクティブ範囲をExcel上で選択するには、**「キーストロークのシミュレーション」**アクションでショートカットコマンド`Ctrl`+`A`を送ります。


アクティブセルからデータが入っている隣のセルが探索され、データが入ったすべてのセルを含む長方形の範囲が選択されます。


### R1C1形式とA1形式の列番号を変換するには
標準では機能がないので、**「VBScript」**アクションを使って、ロジックを組みます。

R1C1形式の列名 (数字)からA1形式の列名 (アルファベット)に変換するコードは『[Excel の列番号を英文字に変換する方法 - Microsoft Docs](https://docs.microsoft.com/ja-jp/office/troubleshoot/excel/convert-excel-column-numbers)』でVisual Basicの実装として公開されているものから、変数の「型」情報を消去したものを指定します。(型情報を入れると、なぜか関数の出力がエラー ("bot error")になる場合があるため)

```VisualBasic:「VBScript：開く」の「手動スクリプト」に貼り付けるコード
Function ConvertToLetter(iCol)
   Dim iAlpha
   Dim iRemainder
   iAlpha = Int(iCol / 27)
   iRemainder = iCol - (iAlpha * 26)
   If iAlpha > 0 Then
      ConvertToLetter = Chr(iAlpha + 64)
   End If
   If iRemainder > 0 Then
      ConvertToLetter = ConvertToLetter & Chr(iRemainder + 64)
   End If
End Function
```
ロジックのVBScriptは、**「VBScript: 開く」**アクションの中に貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/6c3164d8-a61f-cf94-9473-c6b0e9722d8f.png)

**「VBScript: 関数を実行」**アクションでは、実行する関数名「ConvertToLetter」と、関数への引数を数字型変数 (`iCol`)を指定します。(※A2019の昔のビルドはリスト型しか指定できませんでしたが、最新のビルド (.13など)では他の型も指定できます)`iCol`にはあらかじめR1C1形式の列名 (数字)を入れておきます。ここでは27を入れておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/ffba393e-8ab0-59eb-b8d3-26f1feca986b.png)

最後に**「メッセージボックス」**アクションを入れて実行すると、変換されたA1形式の値が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/8f665145-ee4b-b25a-25d7-976426d29057.png)


### フィルターを設定するには
**「キーストロークのシミュレーション」**アクションでショートカットコマンド`[ALT DOWN]hsf[ALT UP]`をExcelに送ります。

まずフィルター適用範囲を選択しておいてください。セルにはなんらかの値が入っている必要があります。

# 参考記事

* [3種類のExcelパッケージの違い+Data Table](https://qiita.com/RPAbot/items/95e8e76199196f23664d)
* [RPAでExcelを操作する際のヒント (Automation Anywhere編)](https://qiita.com/RPAbot/items/5e513aa259a595182dd0)
* [RPAでExcelを操作する際のヒント (Automation Anywhere拡張編)](https://qiita.com/RPAbot/items/b9c279acf1efffd4955c)