長文失礼します。
UiPath Studio Community Editionユーザです。
INPUT.xlsxを開いて、1行ずつデータを読み込み、複数のアプリを連続実行し、Webに表示された結果をOUTPUT.xlsxに書き込むワークフローを解析しています。
アプリの数は決まっていませんが、INPUT.xlsxを開いて、1行ずつデータを読み込み、Webに入力/出力し、Webに表示された結果をOUTPUT.xlsxに出力するのは共通です。
INPUT.xlsxとOUTPUT.xlsxは、同じフォーマットです。(添付画像参照)
今回は、INPUT.xlsxから身長と体重を取得し、WebサイトでBMI計算を行い、BMIと肥満度をOUTPUT.xlsxに書き込むアプリと、
2都市間を出発する時間と到着する時間をWebサイトに入力し、飛行時間をWebサイトから取得、OUTPUT.xlsxに書き込むアプリを連続実行するワークフローを作成してみました。
解析中に不明点が出てきたので分かる方、アドバイスをお願いします。
ーーーーーーーーーーーーーーーーーーーーー
ワークフローの流れをざっくり説明すると以下の通りです。
1.最初にINPUT.xlsxファイルをOUTPUT.xlsxに全コピーした後、ワークフロー実行結果情報であるINPUT.xlsxのA列からD列まで(列名で言うと、Test Case Number Status Execution Date Error Messeage)を後から再度OUTPUT.xlsxにコピーする。
2.arobjインプットデータカラム=dtインプットデータ.Rows(0).ItemArray
これで、INPUT.xlsxの2行目(Test Case Number、Status、Execution Date、、、が記入されている行です)
をまるごと変数arobjインプットデータカラムに代入します。(※インデックス番号がずれていますが気にしないでください)
3.strシート名=dtインプットデータ(1)(“Column0”).ToString
これで、変数strシート名に、INPUT.xlsxの1行目1列目の文字列"Test Case Number,RPA Execution Result,BMI計算など)を代入します。
※なぜかダミー行がいちばん上に挿入されるため、dtインプットデータ(0)ではなくdtインプットデータ(1)となります。
4.次に、繰り返し (コレクションの各要素)アクティビティで、INPUT.xlsxの列の数分繰り返します。
繰り返し 次のコレクション内の各要素 index:intindex
item arobjインプットデータカラム
条件分岐
Not String.IsNullOrEmpty(item.ToString) And intIndex<>0 OrElse intIndex=arobjインプットデータカラム.Count-1
INPUT.xlsxのデータがNullやEmptyであったり、最初のTest Case Numberであったり、最後のデータの次の列のデータはskipしているようです。
繰り返し (コレクションの各要素)アクティビティの条件分岐のThenで実行している処理は以下の通りです。
1.int列番号_Endとstr列番号_Endの初期値を設定します。
int列番号_EndとはINPUT.xlsxの1行でデータが存在する最終列の列番号(1,2,3,4,)です。
str列番号_EndとはINPUT.xlsxの1行でデータが存在する最終列の列名(A,B,C,D,)です。
※後で、INPUT.xlsxの1行の列を順番に読み込む際に、R1C1形式の最終列の列番号を使い、INPUT.xlsxのデータ記入エリアを範囲で読み込む際にA1形式で
読み込んでいるため、R1C1形式とA1形式の相互変換をやっているようです。
条件分岐 繰り返しの最後か?
条件:intIndex=arobjインプットデータカラム.Count-1
Then
int列番号_End=intIndex+1
Else
int列番号_End=intIndex
代入:str列番号_End=“”
2.繰り返し(後判定)アクティビティで、対象の1行の最後の列をアルファベットで取得します。
代入:int列番号_End=int列番号_End-1
代入:str列番号_End=Chr(int列番号_End Mod 26+65)&str列番号_End
代入:int列番号_End=int列番号_End \ 26
条件 int列番号_End>0
3.ExcelアプリケーションスコープでINPUT.xlsxのデータ記入済みエリアを読み出します。
Excelアプリケーションスコープ
開くファイル:strインプットファイルパス
範囲を読み込み
“input” str列番号_Start+“2:”+str列番号_End+int最終行.ToString
TO:dtインプットデータ_カラム
4.条件分岐アクティビティで、strシート名<>“Test Case Number” AndAlso strシート名<>"RPA Execution Resultの場合のみ、Thenの処理を実行します。
アプリ単位で別々のシートを作成して、OUTPUT.xlsxに挿入します。
Excel プロセス スコープ
Excel ファイルを使用:strRPA実行結果ファイルパス
参照名:Excel
変更を保存をチェック
存在しない場合ファイルを作成をチェック
セルを書式設定
ソース: Excel.Sheet(strシート名)
データの書式設定の種類:書式設定
Delay 1秒
Excelアプリケーションスコープ
strRPA実行結果ファイルパス
範囲に書き込み
strシート名 "A1"
FROM:dtインプットデータ_TestCaseNumber
範囲に書き込み
strシート名 "B1"
FROM:dtインプットデータ_カラム
5.int列番号_Startとstr列番号_Startの初期値を設定します。
int列番号_StartとはINPUT.xlsxの1行でデータが存在する最初の列番号(1,2,3,4,)です。
str列番号_StartとはINPUT.xlsxの1行でデータが存在する最初の列名(A,B,C,D,)です。
int列番号_Start=intIndex+1
str列番号_Start=“”
6.繰り返し(後判定)アクティビティで、対象の1行の最初の列をアルファベットで取得します。
代入:int列番号_Start=int列番号_Start-1
代入:str列番号_Start=Chr(int列番号_Start Mod 26+65) & str列番号_Start
代入:int列番号_Start=int列番号_Start \ 26
条件
int列番号_Start>0
7.長すぎるとExcelシートにシート名を記入できないためシート名をitemの左から31文字列取り出します。
strシート名=left(item.ToString,31)
ーーーーーーーーーーーーーーー
以上が、長くなりましたがワークフローの説明です。
ここで1点疑問が湧きました。
変数strシート名は、4.で使われているにも関わらず、どうして、7.で値が設定されているのでしょうか。
理由が分かる方、教えてください。