2018.08.30
前編はこちら
前編では、Excelの自動化の基本や簡単なデータテーブルの扱い方について見ていきました。
今回はExcelに実際の関数を書き込んでみたり、
Excelファイルをバックグラウンドで操作したり、していきたいと思います。
UiPath Academy「レッスン9」を参考にして、二つの合計値を求める問題を例に見ていきたいと思います。
今回はどのように考えて、ワークフローを構築していくかについても詳しく見ていきます。
まずは上記のような簡単なExcelファイルを用意します。
各行のCの列にAとBの合計値を書いていく問題を考えてみます。
この問題を三つの方法で解いていきたいと思います。
この方法が一番直感的に、すぐ思いつく方法でないでしょうか。
私たち人間が、一つ一つのセルを見て数字を見て(読み込んで)足していくのはとても大変な作業です。
これを機械ではとても簡単に高速で行ってくれます。
簡単なワークフローを文字に起こすと順序としてはこうなります。
各行に対して、
Aのセルの数字は何か見る
↓
Bのセルの数字は何か見る
↓
CのセルにAの数字をBの数字にを足したものを書き込む
このようなワークフローを人間も行うでしょう。
では、順序が分かったところで実際にUiPathを使って自動化していきましょう。
手順0)
まず、大枠は必ず「Excel application scope」アクティビティを使いましょう。
これによって今後のExcelの状況がリアルタイムで確認可能です。
そして、使用するExcelファイルのパス名を入力してください。
(相対パスを書く場合は現在のワークスペースからの相対パスを書いてください)
手順1)
まずは、Excelファイルをデータテーブルに置き換えます。
前編でもご紹介したように、データテーブルの方が簡素で操作しやすいので、
一度Excelのファイルをすべて読み込んでそれをデータテーブルに写します。
この際に使うアクティビティは「Read Range」アクティビティです。
すべてを転写するので、開始位置は空白で大丈夫です。
この時に注意しなければいけないのは、AddHedderのチェックボックスです。
ここにチェックを入れてしまうと、初めの一行目がヘッダーとして認識されてしまうので注意してください。
手順2)
上で書いたワークフローの通りにいくと、Aのパスを見る動作に移りたいところですが、
その前に、各行でという枠組みを忘れないようにしましょう。
各行でということで同じ作業を何回も繰り返すので、forループをつくりたいところです。
ということで、今回は「For each row」アクティビティを使用します。
「For each row」は上のように使い、このような場合はrowという変数はDataRow型となっています。
DataRow型とはデータテーブルの任意の行のデータのみをもつデータ型です。
簡単にいうとこのような感じです。
注意しなければいけないのは、「For each」アクティビティとの違いです。
「For each」アクティビティは取り出す変数の型を必ず決めないといけないのに対して、
「For each row」アクティビティは取り出す変数の型がDataRow型と決まっています。
データテーブルを扱うにおいては後者の方が使いやすいでしょう。
手順3)
では、変換したデータテーブルから値を読み取りたいところですが、
その前に注意しないといけないことがあります。
データテーブルの行のインデックスは0から始まる
データテーブルの行は、Excelファイルの一行目から始まるのとは違い、
ひとつずれた0行目から始まります。
これを解消するために新しいインデックスを追う変数をつくりましょう。
これには、「Assign」アクティビティを用いて、新しい変数rowIndexを
rowIndex = inputsTable.Rows.IndexOf(row)+1
としましょう。(inputsTableは手順1で生成したデータテーブルの変数名です)
これで”行のインデックスに1足したもの”を新しいインデックスにすることができて、
rowIndexは1,2,3,4,…のように進んでいくことができます。
手順4)
やっと、データテーブルから値を読み込むことができます。
「Get Row Item」を使用します。
A列目のものから取り出してみましょう。
プロパティのColumnIndexに0と入力して、Outputに変数名を入れましょう。
0と入力したのは、0列目ということです。(列も1から始まらないので注意してください)
同様にB列目についてもおこなってください。(ColumnIndexを1と変えるだけです)
手順5)
最後に、読み込んだAとBの値を足したものをExcelファイルに書き込みます。
「Write Cell」アクティビティを使用します。
書き込む場所は、
“C”+rowIndex.ToString
のようにします。
ここで手順3でつくった変数が役に立ちます。
これで、C1,C2,C3,…のようにセルに書き込むことができます。
書き込むのはもちろん、A+Bの値です。
これで終了です。
この方法は一番やりやすいですが、いくつか注意点があったので間違えないようにしてください。
この方法では、Excelアプリを使わずにバックグラウンドで計算をして
その結果をExcelファイルに書き込みます。
基本的には先ほどと同じなのですが、いくつか変わる点などありますので
その相違点を確認しながら見ていきましょう。
まずは、大まかなワークフローを書き出してみます。以下のようになります。
Excelファイルをデータテーブルに変える
↓
データテーブル上で足し算をすべて行う(足し算方法略)
↓
データテーブルをすべてExcelファイルに書き出す
*足し算の内容などは先ほどと同様なので省略しました。
先ほどは足し算をしたらすぐにExcelファイルに書き込んでいましたが、
今回はすべての計算を終えてからExcelファイルに書き込んでいます。
やり方が変わったといっても本質的には同じです。順番が変わっただけです。
実際にやり方を見ていきましょう。
Excelファイルを「Read Range」アクティビティで読み込むまでは同じです。
その後、「Excel application scope」を今回は使用しません。
「Add data column」アクティビティを使用します。
このアクティビティには、追加する列の名前と型を入力することで
データテーブルに新しい列を追加することができます。
次に先ほど、手順5で行ったことを「Assign」アクティビティを使用して行います。
row(2) = Integer.Parse(valueA) + Integer.Parse(valueB)
のように記述します。
Integer.Parse(値)というのは値をInt型に変換するものです。
今回は直接データテーブルに書き込むので「Assign」アクティビティを使用します。
最後に、「Write Range」を使用してExcelファイルに書き込めば終了です。
スタート位置を指定しなければ初めからとなります。
この方法は、今までのものよりも単純にワークフローを組むことができます。
Excelファイルの行の大きさ(何行あるか)を求める
↓
すべての行に対して関数を書き込む
たったこれだけです。
今までの計算のところがただ関数に変わっただけなので本質はこれも変わりません。
行の大きさ(何行あるか)は、「inputsTable.Rows.Count」で求めることができます。
よって、C1~C(行の大きさ)まで関数を書き込めば終わりです。
もちろん、書き込む際には「Write Cell」を用いて、
“=SUM(A1,B1)”
のように書きます。
今回は、三種類の方法で合計値をExcelファイルに書き込んでみました。
一つ目は、基本的な方法で足し算ができ次第ファイルに書き込んでいく形式でした。
二つ目は、すべての計算を終えてから一気にファイルに書き込んでいく形式でした。
三つ目は、関数をそのままファイルに書き込んでいく形式でした。
どの方法が確実にいいと言う訳ではありませんが、それぞれの特徴をよく見て
場面ごとに使い分けられればいいのではないでしょうか。