【第5回】HeartCore RoboでExcelを操作してみよう - 既存Excelファイルの操作方法

#はじめに
前回（https://qiita.com/Go_Miyake/items/01203cc40035cae5453e )までは、HeartCore RoboでExcelを扱うメリットと、Excelコマンドを利用して新規Excelファイルを作成するロボットを作成しました。

今回は既存のExcelファイルを操作するロボットについて記載します。

#HeartCore Roboで既存のExcelファイルを操作してみる
今回は、前回で作成されたExcelファイルを参照、既存のシート上セルの値を取得してから、新しいシートに転記します。

## 事前準備
前回HeartCore Roboで作成されたExcelシート内のセルを3行*5列として各セルの値を修正して保存します。保存後にExcelは閉じます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/f92a4ed0-f4ba-52c7-77a4-4588291db4fb.png)


##既存Excelファイルを参照する

1. 新規スクリプトアイコンをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/8df5c164-59b8-337a-bd28-31b5e95bf4c6.png)

2. 任意のスクリプト名を指定（デフォルトスクリプト名でも可）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/0e563c91-7d31-289f-6fd0-3340190203e5.png)

3. スクリプト空白部分を右クリック > コマンドを作成 > Click -File > Excel > Excel open
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/ab9b506e-d3bb-5f03-e78e-59ed49d79fbd.png)

4.　プロパティ画面のファイルを選択ボタン（...）をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/c6dce3dc-d4d0-43d4-e555-3fa394cf873f.png)

5.　上記「HeartCore Roboで新規Excelファイルを作成してみる」 ステップ3.にて指定した「作成するExcelファイル」ディレクトリ内のExcelファイルを選択 > 開くを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/6dcc2f6f-cad8-07a0-a658-ffd2031cb879.png)

6.　参照先Excelのパスが記載されたのを確認 > 「パスを呼び出しスクリプト」チェックを選択 > OKをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/fad6dc76-a3ce-c18e-4888-8c3fea5ef429.png)

*Excel Openプロパティ > 「Excelファイル出力」にチェック> 任意のディレクトリ+Excelファイル名(.xlsか.xlsx)指定を行うことで、「名前を付けて保存」と同等の操作が可能になります。*

7.　スクリプト画面でExcel openコマンドが作成されていることを確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/16d32443-b654-548c-1f8c-ecbdb4247304.png)

Excel openコマンドで既存のExcelファイルを指定すると、該当のExcelに対して様々な操作が可能になります。

## 参照先のExcelファイルに新規シートを追加する
8.　Excel openコマンドの直下の空白行を右クリック > コマンドを作成 > Click -File > Excel > Excel create を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/c28bb0c8-4852-2ba3-7441-9a86208e62bc.png)

9.　プロパティ画面 > 「シートの作成が呼び出されました」にチェック > テキストボックスに作成するシート名を入力(例：”さらに新しいシート”) > OKボタンをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/9b041102-68b6-c220-6f77-cb18d5040aa6.png)

10.　スクリプト画面でExcel createコマンドが作成されていることを確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/f9c767e2-2ab0-78e9-d2f9-1c21ce85d6ee.png)

Excel createコマンドではファイル名を指定せずに、シート名のみ指定することで、Excel openで指定したExcelファイルに新規のシートが追加することが可能です。

## 参照先のExcelファイル内既存シートの値を取得する
11.　Excel createコマンドの直下の空白行を右クリック > コマンドを作成 > Click -File > Excel > Excel select を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/a3b89f09-57ec-0926-e337-c707bb9bcff0.png)

12.　プロパティ画面 > 「シートの名前または番号」にチェック > …ボタンをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/262711ad-af70-ddd9-075d-85faaa540a4d.png)

13.　上記　Excel openコマンドで指定した既存Excelファイル内の値（シート名及びセルの内容）が参照出来る（=HeartCore Roboが値を取得出来る状態）状態であることを確認 > シートを選択をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/e407d72c-fee5-9234-8baf-fdcd471b2b0e.png)

14.　シート名が選択された事を確認 > OKをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/c5085588-e78f-6068-4b81-ea133a6b1746.png)

*プロパティ画面でシート名を直入力することも可能*

15.　スクリプト画面でExcel selectコマンドが作成されていることを確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/5214aa49-0224-9ad9-a75c-fb39e89f33b9.png)

この時点でのコメント付きコード：

```javascript
// エクセルファイルを開く
Excel "open" file="..\Excel\出力.xlsx"

// 新規シートの追加
Excel "create" sheet="さらに新しいシート"

// 既存シートの選択
Excel "select" sheet="新しいシート"

Report "results.xml"
```

## 指定したシート内の行数を取得する
Excel openで指定したシート内の行数が自動取得されて格納されているシステム変数を使用します。
*{_EXCEL_SHEET__ROWS}*

16.　空白行でシート内の行数を格納する数値型ユーザー変数（ここでは変数名"RowCount"）を宣言（キーボードで直接入力）
> Eval RowCount={_EXCEL_SHEET__ROWS}

![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/b3fc10ef-85bb-6272-1efc-eeb8268dc915.png)

*文字型変数Varで宣言しても値が数値の場合には四則演算が可能になるため、Varで宣言した場合でも同じ結果が得られます*

>Var RowCount={_EXCEL_SHEET__ROWS}

17.　変数宣言の直下行 > 右クリック > コードテンプレート > For文 > fi-1からNまで繰り返すを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/682f64a4-ea48-7c94-abe5-4446ab89c9e5.png)

18.　追加されたFor文コマンドのカウンタ部分を２箇所変更

> for (i=0; {i}<100; i={i}+1) {
↓
> for (i=1; {i}<{RowCount}+1; i={i}+1) {
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/8fca98b4-d9a5-70a8-147f-62f2711fc359.png)

*カウンタ変数{i}とExcel行数変数｛RowCount｝の条件が”<”（未満)のため+１を追加する事で最終行まで処理するように調整しています。*

19.　上記For文の中にもう1つのFor文を、処理を行うカラム分（５列）を処理をさせるようコードを入れ子として追加 > カウンタ部分を２箇所変更（上記ステップ１７.と１８.を繰り返し）
> for (j=1; {j}<6; j={j}+1) {
> }

>![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/b08f73ff-47d4-c20e-3f79-c96484ea58a6.png)

## セルを指定してセル内の値を取得する
Excel selectで指定したシートとの指定したセル内の値が格納されているシステム変数を使用します。
変数名：{_EXCEL_CELL__VALUE}

20.　空白部分を右クリック > コマンドを作成 > Click -File > Excel > Excel select を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/f97d30f7-6b2c-3fb9-e103-989e94116cb9.png)

21.　プロパティ(Excel create)シート名または番号にチェック > …ボタンをクリックしてシートを選択 > Cell at にチェック（列と行の値はそれぞれデフォルト値”1”のまま） > [OK]ボタンをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/e8f74d89-811e-08fe-2f28-3cfc4342312d.png)

*※ 上記の画面で”Cell参照（A1,C５..）”を選択した場合にはセル形式の選択が"A1”や"C５”での指定になります*
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/39677672-e89f-1488-5946-f4ca925f6b9f.png)

22.　スクリプト画面でExcel selectコマンドが作成されていることを確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/d73a7001-601d-f672-8b33-564d68350dfe.png)

23.　スクリプトの「column」と「row」部分をforコマンドループカウンタ変数（”{j}”と”{i}”）に書き換え

24.　セル値を格納する変数（ここでは変数名”CellValue”）を宣言してセル値が格納されているシステム変数{_EXCEL_CELL_VALUE}を代入
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/101ad045-e7cf-f70f-4938-cc2568d358c9.png)

## 取得したセルの値を別のシートに転記する
25.　For文内の空白部分を右クリック > コマンドを作成 > Click -File > Excel > Excel set を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/7644bc90-1075-0836-868b-dd3573826085.png)

26.　プロパティ(Excel set)画面のセルの値を設定にチェック > テキストボックスに変数（上記で宣言した{CellValue}）を入力 >　新規に追加したシート名を入力（ここでは上記で指定した”さらに新しいシート“） > Cell at にチェック（列と行の値はデフォルトのまま） > OKボタンをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/49456f66-0be4-178d-e28a-dcc31d6983ce.png)

27.　スクリプト画面でExcel setコマンドが作成されていることを確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/a9dbf4ca-31fe-0e06-bce6-c3166916a5ca.png)

28.　スクリプトの「column」と「row」部分をforコマンドループカウンタ変数（”{j}”と”{i}”）に書き換え
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/1827d68e-1d79-a419-1585-1d1acb9a3dea.png)

29.　「実行」アイコンをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/050c17f5-65e0-65c1-57e8-314092db7bb1.png)

30.　実行完了後にExcelフォルダ内のExcelファイルを開いて、新たにシートが追加されて元のセル内容がコピーされている事を確認

実行前
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/c7a7985e-2a91-6fa1-4abf-ead1cc11dfe7.png)
↓
実行後
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254242/146d53c2-635b-1dd9-f4da-d02f33f4a084.png)

（留意点）再度スクリプトを実行する場合には、シート名が重複することになるので、追加されたシートは削除の上Excelファイルを保存してから実行してください。

以下本記事のコメント付きのコード：

```javascript
// エクセルファイルを開く
Excel "open" file="..\Excel\出力.xlsx"

// シートの追加
Excel "create" sheet="さらに新しいシート"

// 既存シートの選択
Excel "select" sheet="新しいシート"

// 既存シート内の行数を取得
Eval RowCount={_EXCEL_SHEET_ROWS}

// 行数(RowCount)分 処理をおこなう
for (i=1; {i}<{RowCount}+1; i={i}+1) {
    
    // 列数(カラム)分 処理をおこなう
    for (j=1; {j}<6; j={j}+1) {
        
        //セルの内容を取得
        Excel "select" column="{j}" sheet="新しいシート" row="{i}"
        Var CellValue="{_EXCEL_CELL_VALUE}"
        
        // データを設定
        Excel "set" column="{j}" sheet="さらに新しいシート" row="{i}" value="{CellValue}"
    }
}

Report "results.xml"
```

#まとめ
既存のExcelファイルからセルの値を取得するには

>*{_EXCEL_SHEET__ROWS}*　

でシート内の行数分をループ実行、セルの行列を指定した上で

> *{_EXCEL_CELL__VALUE}*

でセルの値を取得します。

# 次回について

次回はHeartCore Robo上でOCRを実行する方法について記載します。