作ったもの

抽選対象者の一覧をExcelで用意します。 UiPathで抽選対象者一覧を読み込み、決められた人数分、ランダムに抽選してログに書き出すだけワークフローです。 まぁあえてワークフロー化する必要もないのですが、UiPath書籍抽選企画だったため、せっかくなので作ってみました。

pic1

スピード重視でさくっと作ったので、.NET関数含め小難しい作りかもしれません。

ワークフローサマリー


サマリー


項目 規模
ワークフローファイル数 1
アクティビティ数 13
作成時間 1時間

アクティビティリスト


制御系

シーケンスやフローチャートなど、ワークフローを制御するアクティビティ
アクティビティ名 アクティビティ数
シーケンス 4
フローチャート 1
繰り返し 1

処理系

Excel操作、画面操作、代入式など、なにかの処理を行うアクティビティ
アクティビティ名 アクティビティ数
代入 3
Excel アプリケーションスコープ 1
範囲を読み込み 1
メソッドを呼び出し 1
メッセージをログ 1

ワークフローマップ


pic2

ポイントの解説


抽選ロジック


抽選対象者の一覧を格納したDataTableからからランダムに1行を抽出する部分です。

pic3

.NET関数には、乱数(ランダムな数値)を生成する System.Randomというクラスがあります。 以下の構文では、0以上10未満の整数値を返却します。

New System.Random().Next(0, 10)
最小値以上~最大値未満の値が返ってくるため注意しましょう。
0以上10未満だと、0~9のいずれかが選ばれ、10が選ばれることはありません

これを利用すると、抽選対象者一覧行のいずれかの行番号(0始まり)をランダム抽出する構文は以下となります。

raffleNo = New System.Random().Next(0, inputDT.Rows.Count)

行番号がわかれば、当選者の名前やIDは簡単に取得することができます。

pic4

当選者情報をログに書き出す

ということで、ログに当選者情報を書き出しましょう。

pic5

string.Format("{0}番目の当選者は{1}{2}さんです。おめでとうございます!",index+1,raffleName,raffleID)
3つの変数を組み合わせた文字列を作りたいので、string.Format関数を使って可読性を上げています。使い方を知りたい方はこちらの記事をご覧ください。

これで1名分の抽選は終わりです。仮に10名を抽選するなら10回この処理を繰り返せば良いのですが、それだと同じ方が抽選されてしまう可能性があります。そこで、当選した方は、抽選対象者一覧DataTableから削除します。

当選者行をDataTableから除外する

UiPathには「データ行を削除」というアクティビティがあるので、こちらを使って行削除を行います。

pic6

指定した回数、繰り返し処理を行う

UiPathで繰り返し処理を行いたい場合、以下の選択肢があります。

アクティビティ 説明
繰り返し (コレクションの各要素) ArrayやListなどのコレクション(配列)を使って繰り返し処理する場合に使用
いわゆるFor Each文
繰り返し (前判定) 条件を満たしている限り何度でも繰り返し処理をする
繰り返し処理を行う前に条件判定があるため、一度も処理されない場合もある
いわゆるWhile文
繰り返し (後判定) 条件を満たしている限り何度でも繰り返し処理をする
繰り返し処理を行った後に条件判定があるため、最低一度は処理される
いわゆるDo While文
繰り返し (各行) DataTableを繰り返し処理する場合に使用
いわゆるData Tableに特化したFor Each文

そのほか、「フローチャート」と「フロー条件分岐」アクティビティを使って繰り返し処理を作るケースも可能で、こちらを使うケースが多いかもしれません。

ただ指定した回数繰り返し処理をするいわゆるFor文に相当するアクティビティはありません。

なので、例えば5回繰り返し処理をしたい場合、以下のように繰り返し処理を実装する人をみかけます。

pic7

int32[] で表現されるArray配列で、要素を5つセットし、5回繰り返すわけですね。これをList型で表現すると、以下になります。

pic8

ただもし100回繰り返すとしたら、要素を100コ作らないといけないわけで、どこかでイヤになってきます。 ということで、指定要素数の配列を作成する.NET関数 Enumerable.Range を私はよく使用します。

以下では、1から始まり、連続する整数の値を10回生成します。

Enumerable.Range(1,10)

つまり、{1,2,3,4,5,6,7,8,9,10}というInt32のコレクションを生成するわけです。

10を100にすれば、1~100まで要素が100コあるコレクションが簡単に作れるわけです。

Enumerable.Range(1,100)

これを「繰り返し (コレクションの各要素)」アクティビティと組み合わせると、変数で指定した回数繰り返すように作れるわけです。

pic9

ここでは説明しませんが、Enumerable.Rangeで生成したコレクションに対してはLINQも使えるので、100ずつカウントアップする、100からカウントダウンする、奇数だけのリストにするなど、細かな要件に従った作りにすることも可能です。

ソース(今回作った抽選ロボプロジェクト)

ソースはGitHubに公開しています。

「Code -> Download ZIP」からダウンロードできます。

pic10

ということで、おしまいです😀