0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【UiPath】実装例:繰り返しを意図的に使う

Posted at

はじめに

この投稿は、UiPathブログ発信チャレンジサマー2025 の5日目の記事です。

UiPathStudioでの「処理の書き方」の話です。今回は「繰り返し」を使った実装について。

実装1)配列化して繰り返す

例えば、以下のような要件があるとします。

要件
出力用フォルダがなければ`作成`。フォルダは`複数`あり、作成したらその旨を`ログ`に出力すること

この場合、以下のように「フォルダパスをその場で配列にして、繰り返しで処理する」と、短くなります。

image.png

「繰り返し」アクティビティに配列を書くのが嫌なら、先に変数にセットしておきます。

出力フォルダは「作成する数が決まっている」事が多いので、この書き方でも事足りますが、「対象が増減するかもしれない」場合は、(この後で説明するように)Configに値をカンマ区切りで入れておいて、カンマでスプリットして配列化します。

実装2)配列化してContainsで含まれるかチェック

例えば、以下のような要件があるとします。

要件
入力データが`あらかじめ決まっている許容値`かチェック。許容値は`後で変更`される可能性あり

この場合、(後から変更できるように)Configで許容値をリスト定義して、カンマでスプリットして配列化し、Containsで「含まれるか」をチェックします

image.png

エラーの行をすべて把握したいのなら、例外スローせず、エラー行の情報を退避しておきます。

繰り返しアクティビティを使わずに、エラー行の情報を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=存在する


image.png

慣れてきたら

代入アクティビティの例
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にパスを複数設定して、キー名をルール化して配列に取り込みます。

image.png

Configとは別のシートで「ファイルパスリスト」のような一覧シートを用意してもいいですが、シートを用意したくない時は、上記のような方法でも実現できます。

実装4)大枠をループで表現する

例えば、以下のような要件があるとします。

要件
昨日分 と 今日分のデータを検索する。処理内容は「ほぼ同じ」で、違うのは日付と保存先だけ

似たような処理だから、同じ部分は2回書きたくないけど、完全一致はしていない という時です。
この場合、以下のように日付名を文字列にしてループを回します。

image.png

要するに「昨日と今日で2回ループを回す・違う箇所だけIf分岐する」ということです。

終わりに

共通しているのは「意図的に配列を生み出して、処理をしている」ことです。
結果、フローが短くなったり、楽できたりします。

初見だと「これは何?」となりますが、意識して使えると どこかで役立つかも?

以上、参考例でした。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?