2020.03.17
普段の業務でよく使用するエクセルでの単純作業やルーティーン作業は、もしかすると自動化できるかもしれません。
そんなときにどんなことが自動化に向いているか、あるいはどういった方法で自動化が実現できるかご紹介させていただきます。
ここでは前提条件として、端末にMicrosoft Excel アプリケーションがインストールされていることとします。
まずはUiPathで出来るExcel操作の一部を簡単にご紹介いたします。
・シートの読み込み/出力
・列の読み込み
・行の読み込み
・セルの読み込み/出力
・セルの色を取得
・テーブルを作成
・ピポットテーブルを作成/更新
・テーブルを並び替え
・テーブルをフィルター
・マクロを実行
・範囲をコピーしシートに貼り付け
・シートのコピー
今回はよくつかわれるデータの読み込みや書き込みの自動化についてご紹介させていただきます。
UiPathでExcelの自動化を行う方法は2通りありますが、ここでは「UiPath.Excel.Acrivities」を使用した方法をご紹介いたします。
Excelワークブックを開きエクセルへの処理が終了したら対象のワークブックを終了します。Excelの自動化アクティビティはすべてこのアクティビティ内に配置するようにします。
Excelアプリケーションスコープを配置
1.アクティビティタブを開き、検索ウィンドウに「Excel」と入力し検索し、「Excelアプリケーションスコープ」をダブルクリックし配置します。
2.処理対象のエクセルファイルのファイルパスを入力ウィンドウ内に記載します。
この時、ファイルパスは半角の“”(ダブルクォーテーション)で囲ってください。
Dドライブ直下にある「TEST.xlsx」ファイルを処理対象のエクセルファイルとします。
処理対象のエクセルファイル:シート名「処理データ」
まずはセルのデータを取得してみましょう。
1.「セルを読み込み」アクティビティを実行シーケンス内に配置します。
2.データを取得したいセルが存在する「シート名」と「セル」を指定します。
3.取得したデータを格納する変数を作成し指定します。
プロパティの「結果」入力ボックス内で「Ctrl」+「K」を押下し変数名を入力すると作成できます。
「TEST.xlsx」のA1にはIDが入力されていますので、取得結果は「ID」となります。
例で使用している「TEST.xlsx」のような各列に同一のデータが記入されているシート情報を取得する際に便利です。取得したデータは「DataTable型」となり、各行のデータを基準とした処理によく使用されます。
1.「範囲を読み込み」アクティビティを実行シーケンス内に配置します。
2.データを取得したいシート名を指定します。
3.データを取得する範囲を指定します。指定しなければシート内全てとなります。
4.プロパティを開き「ヘッダーの追加」にチェックを入れると先頭行がヘッダーとして読み込まれます。チェックを外すと先頭行もデータとして読み込みます。
5.取得結果を格納する変数を指定します。(作成方法は先ほどと同様)
同一ブック内のシートより取得したデータを別シートに出力してみます。
1.「範囲に書き込み」を実行シーケンス内に配置します。
2.出力先のシート名を指定します。
3.出力開始セルを指定します。
4.先ほど取得した「GetDataTable」をデータテーブルに指定します。
5.プロパティを開き「ヘッダーの追加」にチェックを入れるとヘッダーとデータ行が出力され、チェックを外すとデータ行のみ出力されます
データ取得元のエクセルファイルとは別のエクエルファイルに出力したい場合の処理についてご紹介させていただきます。
ここで使用する「範囲に書き込み」アクティビティはバックグラウンドで実行されるアクティビティで、実際にExcelワークブックを起動することはありません。違いについては後ろの方に記載していますので興味があればご確認ください。
1.検索ウィンドウで「write」と入力し、ワークブック配下の「範囲に書き込み」を配置します。
2.出力するエクセルファイルのパスを指定します。
※指定したファイルが存在しない場合は指定したパスで新しく作成されます。
3.出力するシート名を指定します。
4.出力開始するセルを指定します。
6.プロパティを開き「ヘッダーの追加」にチェックを入れるとヘッダーとデータ行が出力され、チェックを外すとデータ行のみ出力されます
処理結果は下記になります。
別のエクセルファイルへ出力で使用した「範囲に書き込み」アクティビティはOffice Excelアプリケーションがインストールされていない場合にも使用可能なアクティビティで、Excel配下にある「範囲に書き込み」アクティビティとは少し異なります。ただ、アクティビティの処理結果は同じで、データテーブルをシートに出力ですのでOffice Excelアプリケーションがインストールされている環境でしたらどちらのアクティビティを使っても問題はありません。
指定されたシートの末尾にデータテーブルを追記する方法です。
ここでは「TEST.xlsx」の取得結果シートの末尾に処理データシートの内容を追記します。
1.「範囲を追加」アクティビティを実行シーケンス内に配置します。
2.追記するシート名を指定します。
3.追記対象のデータテーブルを指定します。
色のついたセル範囲は追記したデータとなります。
これらのExcelデータの入出力アクティビティを使用し、業務システムへのデータ入力や検索結果のデータを
エクセルファイルに貼り付ける等の作業を自動化することが可能です。
また、エクセルファイルから業務システムだけではなく、エクセルファイルからエクセルへの処理も単純なものでしたら
マクロを一から作成するよりも簡単に自動化を実現することが出来るかと思います。
以上、UiPathでExcel操作を行う際の説明をしました。
Uipathの導入、運用についてお困りの際は
是非、弊社に問い合わせをしていただけたらと思います。
2020.03.05
今回は、UiPathでConfigファイルを使う際の説明を行っていきたいと思います。
UiPathでファイルパスを指定したり、何かを入力したりする際など、変数へ直にそれを打ち込んではいないでしょうか。
例えば「C:\hoge\fuga.csv」というファイルを指定する際に、代入アクティビティや変数パネル内で変数「piyo」に「”C:\hoge\fuga.csv”」と指定しているのを指します。
当然、このファイルパスが正しければ変数piyoを使用した際呼び出されるのはfuga.csvというファイルになります。
ただ、もしこのfuga.csvというファイルがhogeフォルダからhogehogeフォルダに移動となった場合はどうなるでしょう?
XAMLファイルを開き、該当箇所の変数(ここではpiyo)に規定されている「”C:\hoge\fuga.csv”」を「”C:\hogehoge\fuga.csv”」に直さなくてはエラーとなってしまいます。
Studioをすぐに編集できる環境であるならばこれでも問題はないでしょう。
ですが、Studioを編集できる人とロボットの使用者が異なっていた場合はそう簡単ではありません。
また、XAMLファイルを利用者が簡単に編集できていいのか、という保守性の問題も浮上します。
そこで作成されるのが、Configファイルです。
ConfigファイルはExcelで作成します。
もしロボットを運用するPC上にExcelが入っていなくても、ファイルがあればExcel上での作業は必要ないので動作の心配はありません。
読み込めれば問題ないです。
編集の際は、使用者のローカルPC上などで作業してファイルだけを入れてあげればよいでしょう。
Configファイルで必要なのは、「Key」と「Value」という列です。
ただ、それだけではどれが何を指すのか分からなくなってしまうでしょうから、その隣に説明用の列を作ってあげると親切です。
また、シート名も初期のSheet1などのままではなく、Settingなどわかりやすい名前を付けます。
「Key」と「Value」は二つで一つです。単語帳のように、ひとつのKey(単語)にひとつのValue(意味)があります。
Keyを呼び出してあげるとValueの値が入るように設定をします。
以下の画像はConfigファイルの中身のサンプルです。
Key、Valueの行は色を付けてわかりやすくしておくと良いでしょう。
Keyは変数と同じようにわかりやすいネーミングを付けます。
Valueのほうは、ここでは「String型(文字列)」「Int型(数字)」「Boolean値(True or False)」「Timespan値(時間)」を入れました。
これらの呼び出し方は後述いたします。
Configファイルを使うために、KeyとValueをセットにしてUiPathで読み込んであげなくてはなりません。
この際使うのが「Dictionary型」です。
「単語帳」のイメージがあるので近しいものを感じられるのではないでしょうか。
では、UiPathの画像を使用しながらConfigファイルの読込を説明いたします。
Configファイルの読込は、多くのロボットを開発する環境だと共通フローとしてInvokeできるようにすることが多いのですが、
今回はInvokeを考慮しないサンプルです。
Configファイル読込は「シーケンス」で作成します。
フローチャートを使うほど大型でも複雑でもないので、これで十分です。
代入アクティビティを使用し、新しい辞書型の入れ物を作成します。
わかりやすく「Config」という変数名を設定しました。
この段階ではまだGeneric型なので、これを辞書型にします。
(ダークモードのUiPathを使用しています。異なるのは色だけなので操作や中身は変わりません。)
ここを開いても辞書型は最初から出ていません。
一番下の「型の参照…」をクリックします。
種類選択画面が開くので、「型の名前(N):」の横にある入力ボックスに「dictionary」と入力します。
いくつか候補が出てくるのですが、選択するのは「mscorlib[4.0.0.0]」→「System.Collections.Generic」→「Dictionary<TKey, TValue>」です。
これを選択すると、先ほどの型の名前入力ボックスの下にKeyとValueに対して使用する型を選ぶプルダウンのボックスが出現します。
Excel上のConfigファイルは、Key値がStringなのでStringを、Value値には今回の場合様々な型が入っているのでObjectを設定します。
基本的にはString, Objectと覚えておいて問題はないでしょう。
設定するとConfig変数は下図のようになります。
これで左辺の設定は終了しました。
次に、右辺に移ります。ここには
「New Dictionary(of String, Object)」
と入力します。
これは「Config」という変数の中に新しい「文字列KeyとオブジェクトValueを持つ辞書の枠組み」を作成していることになります。
ちなみに左辺でValue値をObjectに設定しているため右辺もObjectを設定していますが、Stringで設定しているのならば右辺もStringにします。
枠組みができたので、Excelファイルから中身をこの辞書に入れていきます。
Excelファイルが一行ずつ書かれていることからわかるように、For Each Row(繰り返し(各行))アクティビティを使用します。
まずはConfigファイルを「ReadRange(範囲を読み込み)」アクティビティを使用してデータテーブルに出力します。
ファイルパスとシート名を設定し、プロパティパネルにある出力欄でデータテーブルを指定します。
(※システム→ファイル→ワークブックに含まれる「範囲を読み込み」アクティビティを使用しています)
ここではConfigファイルのパスを変数で指定しています。
プロジェクトのフォルダ(Main.xamlのあるフォルダ)にConfigというフォルダを作り、そこにConfigファイルが格納されている想定です。
また、この場合は相対パスで読み取ってくれます。
シート名も変更している場合は忘れずに設定します。
また、範囲に関してはシート全体を読み取ってもらうので設定不要です。
プロパティパネルのデータテーブル入力箇所で変数を作成すると自動的にDataTable型にしてくれます。
まずは繰り返しの設定です。
コレクションの欄には先ほど出力したデータテーブルを設定します。
これで、Configファイルを読み込んでくれる設定ができました。
読込をするのはKey列とValue列が空ではない行だけにしたいと思います。
そこで、条件分岐を中に入れてから設定値をセットしていきます。
少々わかりにくいので個別に解説します。
まず、条件分岐のコンディションに入れるのは
「Not string.IsNullOrEmpty(row(“Key”).ToString) and Not String.IsNullOrEmpty(row(“Value”).ToString)」
長くて難しく感じられますが、「and」の部分で区切りがあります。
前はKeyが空欄ではないかの判定、後はValueが空欄ではないかの判定です。
先頭についている「Not」はそのあとに続くものの否定となります。
「String.IsNullOrEmpty」はこの後にかっこ書きで指定する引数の文字列がNullか空である場合を指します。
「(row(“Key”).ToString)」は「Key列を文字列型にしたもの」を指します。
and以降はKeyがValueになっただけであることがわかると思います。
つまり、「文字列(”Key列”)がNullか空ではない、そして文字列(”Value列”)がNullか空ではない」ことがTrueのときにThenの処理をします、という意味になります。
Thenの処理ではKeyからValueを呼び出せるようにセットする処理を行います。
画像では切れてしまっているのですが、左辺には
「Config(row(“Key”).ToString.Trim)」
という式が入っています。
これは「変数Config(列(“Key”)を文字列に直して前後のスペースを消したもの)」を表しています。
Configファイルの中身を例にとって表すと、
「Config(“StringTest”).ToString.Trim」=「“文字列の表示をします。”」
が一行目を実行したときの結果になります。
こうしてあげることで、KeyとValueが結びつき、簡単に呼び出すことが可能になります。
この各行の処理をKey列とValue列の両方が空になるまで繰り返せばConfigファイルの読み込み設定は終了です。
まずは基本である、文字列の呼び出し方です。
メッセージボックスアクティビティを見ればわかるように、Config(“Key名”)で設定したValueの値である「文字列の表示をします。」が表示されていることがわかります。
しかし、最初にDictionary型で設定した通りこのValue値はObject型をとっています。
なので、条件分岐やInvokeで引数の既定値として使用する場合は「ToString」を使用して文字列にしてあげなくてはなりません。
また、ファイルパスも同様に.ToStringをつけることで使用が可能です。
最初にValue値を設定した際様々な型を設定しました。
そして、今呼び出したValueがObject型だ、というのもご理解いただけていると思います。
ではどうやってこの型を当てはめてあげるのか、に移っていきます。
・数字を使用したい場合(Int型)
わかりやすいように、
「Int型に設定したIntTestという変数にConfigファイルのKey:IntTestのValue(68が入っています)を代入する」
というケースを想定して説明します。
これはただConfig(“IntTest”)と入れた場合です。
エラーが出てしまっていて、曰く「ObjectからIntegerへの暗黙の型変換はできません」とのことです。
IntTestという変数がInt型なのに、ConfigのValueはObject型なので自動的にそれをInt型に変換することはできない、というわけです。
なので、明示的にこのConfig(“IntTest”)がInt型だといってあげれば解決します。
その際使用するのが「CInt」です。
代入の右辺には式エディタに表示されている式が入っています。
CIntでConfig(“IntTest”)をInt型に変換してあげることで、エラーが消えたことがわかります。
このままメッセージボックスにIntTestの変数を入れて実行すると、「68」が表示されます。
・TrueかFalseを判定したい場合(Boolean値)
先程文字列の条件分岐を行った際は文字列が含まれてるかどうか、という判定を行いました。
しかし、ConfigからTrueかFalseを判定したい、例えば本番環境とテスト環境で動作を分けたい場合、
本番環境はTrue、テスト環境はFalseとして分岐させたい場合もあるでしょう。
そこで使用するのが「CBool」です。
これを使用することで、ここの条件分岐のConditionは「Configの“BooleanTest”の値がTrue」という設定になります。
そしてConfigファイルでの設定はTrueになっているので、Thenに進んでメッセージボックスには「Trueです」という表示がされます。
・時間を設定したい(Timespan型)
リトライの間隔や待機(Delayアクティビティの使用には賛否がありますが、使用しなくてはならない場合もあるかとおもいます)などで使われているのがTimespan型です。
Excel上ではHH:mm:ssを文字列として書き込みます。
リトライや待機の間隔をそろえたい際、Configファイルに書き込んで一度に設定できるようにしたいときに使用するのが
Timespan.Parse
です。
これは文字列をTimespan型として表示する際に使うので、Configファイルからの呼び出しでは下図のような設定となります。
Configから呼び出すときに文字列型にしないとエラーが起きますのでご注意ください。
これで待機を実行すると、下のようになります。
5秒間の待機が発生したことがわかります。
Configファイルの値を変更すれば、10秒、1分といったように一括で管理することが可能です。
ユーザ側の編集も簡単かつ、同じ変数を使用していれば一括で管理できますのでConfigファイルの使用方法は覚えておくべきでしょう。
また、変数やじかに表示させるだけではなく、それぞれの表記方法を使用することでInvoke WorkFlowで呼び出したフローの引数へ既定値として設定させることも可能です(当たり前ではありますが、両方が同じ型であることに注意してください)。
以上、UiPathでConfigファイルを使う際の説明をしました。
Uipathの導入、運用についてお困りの際は
是非、弊社に問い合わせをしていただけたらと思います。