コラム コラム:Excelのセルの値取得において、値ではなく式をデータセットとして取得するには

本記事では、Excelのセルの値取得において、値ではなく式を取得する方法について記載します。

業務においては、Excelの数式を利用していることが少なくない一方で、AutoMateのアクションでは式の結果しか取得(=データセット化)出来ません。

よく利用されるアクションにおいては、以下のような制限があります。
A. 「Excel - セルの取得」アクション: 式の結果のみ取得可能。「=SUM(A1:A5)」のような式の実体は取得できない。
B. 「OpenDocumentスプレッドシート - セルの取得」アクション: 式の実体も取得できるが、1セルをしていた場合以外は取得できない。

上記のBを利用すると数式自体は取得できるものの、何度もループしなくてはならない等の手間があります。

そこで、画面操作が必須な方法ではありますが、Excelの式の値を一気に取得し、データセットとして利用する方法を紹介します。

手順は以下となります。
----------------------------以下、手順----------------------------
※実際に処理を作成する際には、適宜Waitを入れて調整してください。

■1. 対象のExcelブックを開く(Excel - ブックを開く/作成する)
この際、アプリケーションを必ず表示しなくてはなりません。つまり、「アプリケーションを非表示にする」オプションを有効にしてはなりません。
(図1: 操作対象例。セルには式が埋め込まれている)

■2. 目的のシートをアクティブシートにする(Excel - ワークシートをアクティブにする)
この操作により、値を取得する対象のシートをアクティブシートにします。
なお、シートが1つしか存在しない場合はこの操作は不要です。

■3. 対象のウィンドウをアクティブウィンドウにする(ウィンドウ - フォーカス)
このあと、ショートカットキーを使用する為、キー入力をExcelが受け付けるように当該画面をフォーカスします。

■4. ショートカットキー「Shift + Ctrl + `」でExcelの式を表示させる(入力 - キーストロークの送信)
ショートカットキー「Shift + Ctrl + `」を実行し、数式を表示状態にします。
なお、AutoMateで当該ショートカットキーを送る際は、「{SHIFT}{CTRL}`」のように指定します。(図2参照)
(図2: キーストローク指定方法)

(図3: キーストローク実行後のExcel表示状態)

■5. 4の状態下で、Excelのセルをコピー(入力 - キーストロークの送信)
対象のセルを「CTRL + c」でコピーします。
最後に提示するサンプルでは、
X. 「CTRL + HOME」でA1セルに移動
Y. 「CTRL + a」で全セル選択
Z. 「CTRL + c」で選択したセルをコピー
の順で処理を実施しています。

■6. 5の結果クリップボードに入ったテキストを別テキスト(一時ファイル)に書き出し(ファイルシステム - ファイルへの書込み)
クリップボードの内容は、関数「%Clipboard()%」を利用すると、そのままテキストとして利用可能です。
なお、ここでクリップボードの内容を変数に格納してしまうと使用メモリが大きくなりやすいので、変数への格納は推奨しません

■7. 6の結果を書きだしたcsvファイル(またはテキストファイル)を読み込み、「タブ区切り」でデータセット化する(ファイルシステム - CSVからデータセット)
6の結果にはタブ区切りのテキストが書き込まれているので、区切り文字を「Tab」にして読み込む設定とします。
(Excelのセルを複数セルにわたってコピペすると、実体はタブ区切りになっています)
(図4. タブ区切り設定。なお、この例では「データの1行目を列見出しとして扱う」にチェックを入れていますが、選択範囲の1行目に数式や特殊記号があるとエラーになるので、それらの場合はチェックを外してください。)

■8. 実行結果一例
以下のように、数式をデータセット化可能です。

----------------------------以上、手順----------------------------

以下、サンプルタスクです。選択対象セル、ウィンドウタイトル、Waitの間隔は環境に応じて変更ください。
また、サンプル用のExcelは以下の弊社ダウンロードサイトよりダウンロードしてください。
https://www-1.sct.co.jp/download/automate/Sample_Task/ORDER_SAMPLE.xlsx
サンプル用Excelをデスクトップに配置することで稼働確認が可能です。

<!--処理対象のExcelを開く。画面操作を伴うため非表示はNG。-->
<AMEXCEL SESSION="ExcelSession1" WORKBOOK="%GetDesktopDirectory()%\ORDER_SAMPLE.xlsx" />
<AMWAIT SCALAR="3" />
<!--処理対象Excelにフォーカス-->
<AMWINDOW WINDOWTITLE="*ORDER_SAMPLE*" />
<AMWINDOW WINDOWTITLE="*ORDER_SAMPLE*" />
<AMWAIT SCALAR="2" />
<!--ショートカットキーで数式を表示-->
<AMINPUT KEYSTROKES="{CTRL}{SHIFT}`" />
<AMWAIT SCALAR="1" />
<!--A1セルにカーソルを移動-->
<AMINPUT KEYSTROKES="{CTRL}{HOME}" />
<AMWAIT SCALAR="1" />
<!--全選択-->
<AMINPUT KEYSTROKES="{CTRL}a" />
<AMWAIT SCALAR="1" />
<!--コピー-->
<AMINPUT KEYSTROKES="{CTRL}c" />
<AMWAIT SCALAR="1" />
<!--一時ファイルに書きだし-->
<AMFILESYSTEM ACTIVITY="write_file" FILE="%GetDesktopDirectory()%\TMP_DATA.txt" APPEND="no">%Clipboard()%</AMFILESYSTEM>
<!--↑の一時ファイルを読み込み-->
<AMFILESYSTEM ACTIVITY="csv_to_dataset" SOURCE="%GetDesktopDirectory()%\TMP_DATA.txt" RESULTDATASET="ds_ExcelData" DELIMITER="tabulation" />
<!--Excelを閉じる-->
<AMEXCEL ACTIVITY="close_workbook" SESSION="ExcelSession1" SAVETYPE="do_not_save" />

Excelの式をデータセットとして取得する必要がある際は、参考にしてください。