はじめに
この投稿は、UiPathブログ発信チャレンジサマー2025 の5日目の記事です。
UiPathStudioでの「処理の書き方」の話です。今回は「繰り返し」を使った実装について。
実装1)配列化して繰り返す
例えば、以下のような要件があるとします。
出力用フォルダがなければ`作成`。フォルダは`複数`あり、作成したらその旨を`ログ`に出力すること
この場合、以下のように「フォルダパスをその場で配列にして、繰り返しで処理する」と、短くなります。
「繰り返し」アクティビティに配列を書くのが嫌なら、先に変数にセットしておきます。
出力フォルダは「作成する数が決まっている」事が多いので、この書き方でも事足りますが、「対象が増減するかもしれない」場合は、(この後で説明するように)Configに値をカンマ区切りで入れておいて、カンマでスプリットして配列化します。
実装2)配列化してContainsで含まれるかチェック
例えば、以下のような要件があるとします。
入力データが`あらかじめ決まっている許容値`かチェック。許容値は`後で変更`される可能性あり
この場合、(後から変更できるように)Configで許容値をリスト定義して、カンマでスプリットして配列化し、Contains
で「含まれるか」をチェックします
エラーの行をすべて把握したいのなら、例外スローせず、エラー行の情報を退避しておきます。
繰り返しアクティビティを使わずに、エラー行の情報をLINQで取得すると以下のようになります。
ary_ジャンル指定エラー行 =
dt_入力シート.AsEnumerable.Where(
Function(r) Not(ary_ジャンル許容値.Contains(r("ジャンル").ToString))
).Select(
Function(r) String.Format("{0}行目:ジャンル={1}",
dt_入力シート.Rows.IndexOf(r) + 1,
r("ジャンル").ToString)
).ToArray
※ LINQに抵抗があるプロジェクトでは「無理せず」普通にアクティビティで書くほうが良いこともあります。
⇒「LINQを学習していなくても、誰でも容易に修正できる」という意味での「保守性」を優先
Contains
メソッドは非常に便利で、コレクション型なら基本使用できます。
DataTableのRowsやColumnsなどもコレクション型なので、例えば「DataTableに指定の列があるか」のチェックも「Contains」で簡単にできます。
DataTable.Columns.Contains(String) メソッドは、
指定した名前の列がDataTable内に存在するかを確認します。
・戻り値がTrue=存在する
慣れてきたら
ary_うち存在しない列名 =
in_Config("存在チェックする列名").ToString.Split(",").Where(
Function(s) Not(dt_入力シート.Columns.Contains(s))
).ToArray
のように中間変数なしで片付けるのも良し。
この「Config上でカンマ区切りで値を定義して、Splitで配列化する
」と「その配列を使ってContainsで含まれるかチェックする
」という実装は便利なので、よく使います。
ちなみに「コレクション.Contains(値)
」は、Orで繋ぐよりも短くなるのも利点です。
例えば 値 = "A" OrElse 値 = "B" OrElse 値 = "C"
という式も {"A","B","C"}Contains(値)'
と書くと少し短くなります。(配列を変数化するとより短くなる)
実装3)Configの特定項目を配列のように扱う
上述のように「Configの1セルにカンマ区切りで書く」方法では、文字列が長いもの、例えばファイルパスなどは向いてません(セル内が長くなり、見た目で把握しにくい)
そんなときは、以下のように別項目で定義して、Configのキーをループさせます。
例えば、以下のような要件があるとします。
マシンが出力するログファイルを読み込み、内容を集計。ファイルは異なる場所にあり、増減する可能性あり
この場合、Configにパスを複数設定して、キー名をルール化して配列に取り込みます。
Configとは別のシートで「ファイルパスリスト」のような一覧シートを用意してもいいですが、シートを用意したくない時は、上記のような方法でも実現できます。
実装4)大枠をループで表現する
例えば、以下のような要件があるとします。
昨日分 と 今日分のデータを検索する。処理内容は「ほぼ同じ」で、違うのは日付と保存先だけ
似たような処理だから、同じ部分は2回書きたくないけど、完全一致はしていない という時です。
この場合、以下のように日付名を文字列にしてループを回します。
要するに「昨日と今日で2回ループを回す・違う箇所だけIf分岐する」ということです。
終わりに
共通しているのは「意図的に配列を生み出して、処理をしている」ことです。
結果、フローが短くなったり、楽できたりします。
初見だと「これは何?」となりますが、意識して使えると どこかで役立つかも?
以上、参考例でした。