作ったもの
抽選対象者の一覧をExcelで用意します。 UiPathで抽選対象者一覧を読み込み、決められた人数分、ランダムに抽選してログに書き出すだけワークフローです。 まぁあえてワークフロー化する必要もないのですが、UiPath書籍抽選企画だったため、せっかくなので作ってみました。
スピード重視でさくっと作ったので、.NET関数含め小難しい作りかもしれません。
ワークフローサマリー
サマリー
項目 | 規模 |
---|---|
ワークフローファイル数 | 1 |
アクティビティ数 | 13 |
作成時間 | 1時間 |
アクティビティリスト
制御系
シーケンスやフローチャートなど、ワークフローを制御するアクティビティ
アクティビティ名 | アクティビティ数 |
---|---|
シーケンス | 4 |
フローチャート | 1 |
繰り返し | 1 |
処理系
Excel操作、画面操作、代入式など、なにかの処理を行うアクティビティ
アクティビティ名 | アクティビティ数 |
---|---|
代入 | 3 |
Excel アプリケーションスコープ | 1 |
範囲を読み込み | 1 |
メソッドを呼び出し | 1 |
メッセージをログ | 1 |
ワークフローマップ
ポイントの解説
抽選ロジック
抽選対象者の一覧を格納したDataTableからからランダムに1行を抽出する部分です。
.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は簡単に取得することができます。
当選者情報をログに書き出す
ということで、ログに当選者情報を書き出しましょう。
string.Format("{0}番目の当選者は{1}{2}さんです。おめでとうございます!",index+1,raffleName,raffleID)
3つの変数を組み合わせた文字列を作りたいので、string.Format関数を使って可読性を上げています。使い方を知りたい方はこちらの記事をご覧ください。
これで1名分の抽選は終わりです。仮に10名を抽選するなら10回この処理を繰り返せば良いのですが、それだと同じ方が抽選されてしまう可能性があります。そこで、当選した方は、抽選対象者一覧DataTableから削除します。
当選者行をDataTableから除外する
UiPathには「データ行を削除」というアクティビティがあるので、こちらを使って行削除を行います。
指定した回数、繰り返し処理を行う
UiPathで繰り返し処理を行いたい場合、以下の選択肢があります。
アクティビティ | 説明 |
---|---|
繰り返し (コレクションの各要素) | ArrayやListなどのコレクション(配列)を使って繰り返し処理する場合に使用 いわゆるFor Each文 |
繰り返し (前判定) | 条件を満たしている限り何度でも繰り返し処理をする 繰り返し処理を行う前に条件判定があるため、一度も処理されない場合もある いわゆるWhile文 |
繰り返し (後判定) | 条件を満たしている限り何度でも繰り返し処理をする 繰り返し処理を行った後に条件判定があるため、最低一度は処理される いわゆるDo While文 |
繰り返し (各行) | DataTableを繰り返し処理する場合に使用 いわゆるData Tableに特化したFor Each文 |
そのほか、「フローチャート」と「フロー条件分岐」アクティビティを使って繰り返し処理を作るケースも可能で、こちらを使うケースが多いかもしれません。
ただ指定した回数繰り返し処理をするいわゆるFor文に相当するアクティビティはありません。
なので、例えば5回繰り返し処理をしたい場合、以下のように繰り返し処理を実装する人をみかけます。
int32[] で表現されるArray配列で、要素を5つセットし、5回繰り返すわけですね。これをList型で表現すると、以下になります。
ただもし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)
これを「繰り返し (コレクションの各要素)」アクティビティと組み合わせると、変数で指定した回数繰り返すように作れるわけです。
ここでは説明しませんが、Enumerable.Rangeで生成したコレクションに対してはLINQも使えるので、100ずつカウントアップする、100からカウントダウンする、奇数だけのリストにするなど、細かな要件に従った作りにすることも可能です。
ソース(今回作った抽選ロボプロジェクト)
「Code -> Download ZIP」からダウンロードできます。
ということで、おしまいです😀