【初心者向け】UiPathによるRPA実装26 複数のExcelファイルの処理方法

ここまで作成したプログラムは、Excepファイルが複数ある場合でも、1ファイルずつ自動化プログラムを人の手で起動しなければ経費申請アプリケーションに登録できない仕様でした。これでは、結局人手が多くかかることになり、せっかくの自動化の効果が半減してしまいます。

そこで今回は前回の記事で予告した通り、機能拡張の一環として、複数の経費申請Excelファイルを一度のプログラム実行でまとめて対応する方法を紹介したいと思います。

<スポンサーリンク>

事前準備

さて、機能拡張を行う前に、2点ほど事前準備を行っておきましょう。

Excelファイルのダウンロード

まずは経費申請Excelファイルをダウンロードしておきましょう。ファイルはいつものようにzipで圧縮してGitHubにアップしています。以下のリンクより、ファイルをダウンロードして下さい。リンク先の”UiPath第26回用.zip”をクリックし、「Download」ボタンを押すとファイルがダウンロードできます。

GitHub ( 第26回用Excelファイルダウンロードリンク )

ダウンロードできましたらファイルを解凍すると、申請書ファイルが3つ入ったフォルダが生成されます。これらを経費申請アプリフォルダ内の「申請書」フォルダにコピーして下さい。なお、3つのうち1つのファイルは、これまで使用してきたファイルと同一ですので、既に申請書フォルダに1つファイルがある方は上書きしてしまって結構です。

変更範囲の確認

続いて、今回の機能拡張でどこを修正すべきか、その範囲を特定しておきましょう。

まず、Mainワークフローを開き、全体像を見てみて下さい。複数のファイルがあったとしても、経費申請アプリを起動してログインするまでの処理は共通ですね。逆に、アプリケーションをクローズする以降の処理も共通です。

ということで、今回修正すべき範囲は、申請書Excelのデータをコピーする箇所とそれをアプリケーションに登録するところになります。

複数Excel処理の追加

処理手順の具体化

まずは処理を追加するに先立ち、どういった処理を追加すれば複数ファイルの内容を読み込んでアプリケーションに登録できるのか、その手順を確認しておきましょう。

まずは「申請書」フォルダ内を見てみて、ファイル名の一覧を取得する必要があります。それができたら、この一覧から1つずつファイル名を取り出し、該当するファイルに対して既に作成してある「Excelファイルのデータコピー」と「Appへの登録処理」を繰り返せば良さそうですね。

この2つの処理について、順を追って説明します。

ファイル名一覧の取得

特定のフォルダに入っているファイル名の一覧を取得するためには、ファイル名の一覧を入れるVariableを作成した上で、「Directory.GetFiles」という関数により一覧情報を取得し、Variableに入れる必要があります

実際にやってみましょう。

まずはVariableへ値を入れるために「Assign」というActivityを追加します。ActivitiesペインからAssignを検索し、任意の場所にドラッグ&ドロップして下さい。

Assign Activityには2つの欄があります。左側の欄にはVariable名を、右側の欄にはそのVariableに入れる値を指定します。

まずは左側のボックスに入れるためのVariableを作成しましょう。

Variablesペインを開き、「Create Variable」をクリックします。

Name列には、適当なVariable名を入力します。ここではfileListという名称にしておきます。

次にVariable type列ですが、ここでは「配列」というものを利用します。「配列」とは同じ種類の型の値を複数持つVariable typeです。例えば、「String型の配列」といった場合には、String型の値が複数格納されたVariableを意味します。今回、1つのファイル名を1つのString型として扱い、それを複数保存するわけですから、配列を用いるのが効率的というわけです。

配列の設定方法ですが、追加したVariableのVariable type列をクリックし、その中から「Array of [T] 」を選択します。

すると、「Select Types」というウインドウが表示されますので、プルダウンから「String」を選択して「OK」ボタンを押します。これで、String型配列のVariableが作成されます。

あとはこれを、先ほどのAssignボックスの左側に入れておきましょう。

続いて、右側の欄の設定に移ります。

ここでは先ほど書いた、「Directory.GetFiles」という関数を使います。この関数の使い方ですが、

Directory.GetFiles(フォルダ名)

と記述することにより、指定したフォルダ内に含まれるファイルを、String型の配列として返します。ですので、この関数のフォルダ名のところに、申請書を入れているフォルダ名を入れて、Assignボックスの右側の欄に入れれば、このボックスの設定は完了です。ファイルの一覧がfileList Variableに保存されるようになります。

なお、下の画像では文字が切れていますが、私の環境では「Directory.GetFiles(“C:\expense\申請書”)」と指定しました。

登録の繰り返し処理

続いて、取得したファイル名1つ1つに対して、データの読み取りとアプリケーションへの登録を繰り返し行うという処理を実装します。

これには、「For Each」というActivityを使います。ActivitiesペインよりこのActivityを検索し、Mainワークフロー上の任意の場所にドラッグ&ドロップします。

続いて追加されたボックスをダブルクリックして、構成を見てみましょう。

For Each Activityは大きく分けて2つの項目、For each部分とBody部分から構成されています。

For each部分では、繰り返し処理を行う対象となる配列(右側)と、そこから1つずつ値をとってきた時に、その値を入れるための一時的なVariable(左側)を指定します。具体的には「For each A in B」という指定で、配列Bから1つずつ取得した値をAに入れるという意味になります。

また、Body部分には、配列から値を1つ取得する度に実行したい処理を入れます

まずはFor each部分から設定しましょう。

左側の欄はそのままitemと入れたままにし、右側の欄には先ほど作成したファイル名の配列、fileListを入れます。

これで、fileListからファイル名を1つずつ取得し、それをitemというVariableに入れるという指定ができました。

続いて、itemに値が入るたびに実行されるBody部分の設定に移ります。

ここでやりたいのは、「itemに格納されたファイル名に該当するExcel申請書ファイルを開き、その内容をアプリケーションへ登録する」ということですね。

ただ、基本的に処理は「Excelデータのコピー」と「Appへの登録」の中で実装済みです。ですので、これらをBody部分にコピーして、少し修正を加えていくことにしましょう。

コピーができましたら、「Excelデータのコピー」ボックスをダブルクリックで開いてみましょう。

現在、Excel application scopeの対象が1つの具体的な申請書ファイル名になっていますね。

ここを先ほど作成したitemに置き換えてやればよさそうです。なお置き換えに際しては2点注意点があります。

まず1点目は、ファイル名を取得するために使ったDirectory.GetFiles関数は、ファイル名そのものではなくファイルの絶対パスを取得するということです。

もう1点は、itemの型はObject型というもので、そのままではExcel application scopeに指定することができません。ですので、「toString」関数を使って、itemをObject型からString型に変換する必要があります。

これらを踏まえて、Excel application scopeには「item.toString」と入力します。

これで既存処理の修正も完了です。あとはMainワークフローに戻って、ボックス間を線でつないだり、ボックスの名称を修正するといった整理作業を行いましょう。

ボックスの並びですが、「Excelデータのコピー」と「Appへの登録」が残っていればそれを削除し、その代わりに追加したボックス2つを配置します。

名称も変更した後のワークフローは以下のようになります。

テスト実行

それではここまでの作業が正しく行われているか、テスト実行してみましょう。

アプリケーションフォルダに”expense.txt”が残っている方は、残しておいても事前に削除してもどちらでも構いません。ここでは、ファイルを残した状態で実行してみます。

いかがでしょう、正常に終了しましたでしょうか。

アプリケーションフォルダの”expense.txt”に、今回登録対象とした3つの申請書内容が追記されていれば、正しく処理が行われています。

終わりに

今回は複数のExcelを扱うためのFor Each Activityの使い方を紹介しました。また、その前提として、特定のフォルダ内に含まれているファイルの一覧を取得するDirectory.GetFiles関数と、その結果を格納する配列の概念について紹介しました。

今回、複数の申請書を一度に取り扱えるようになったことにより、だいぶ実用度が向上しましたね。

ただ、改善すべきところはまだまだあります。例えば、もしも申請書フォルダに何もファイルがないときに処理を実行すると、現在のプログラムではエラーが発生してしまいます。

次回の記事では、「条件分岐」という新しい概念を導入し、この場合に正しく処理を行えるようプログラムを修正したいと思います。