UipathではExcelを使うケースが多いです。
Excelファイルは既に用意されているものを利用することが多いですが、ヘッダー行の上に空白があるケースというのが非常に多いです。
今回はExcelの繰り返しの応用編となります!
目次
今回やりたいこと
以下の図をご覧ください。ヘッダー行の上に空白が存在します。
このエクセルファイルの中で、J列の職位が部長の時にB列に★を書き込むという処理を作成したいと思います。
職位:部長の場合に★を入力する繰り返し処理
1.Excelファイルを使用する設定を行う
アクティビティ:Excelファイルを使用を追加します。
ここで指定するファイルは前述したヘッダー行の上に空白があるファイルとなります。
2.繰り返し(Excelの各行)を追加する
アクティビティ:繰り返し(Excelの各行)を追加します。
ここでポイントです!!
対象範囲の指定について、+ボタンから Excel>Excel内で示す を選択します。
すると、前述のエクセルファイルが開かれます。
そこで、対象の範囲(C4:J15)を選択し、Uipathタブから確認をクリックします。
Uipathの開発画面に戻ると、先ほどの範囲「C4:J15」が対象範囲のボックスの中に入力されていることが分かります。
次に「先頭行をヘッダーとする」のオプションにチェックを付けてください。これで繰り返しの準備はOKです!!
3.条件分岐を設定する
アクティビティ:条件分岐 を追加します。
条件分岐の際には、「条件ビルダー」を活用しましょう。
ここでは、職位が部長の時にB列に書き込みを行う のがやりたいことなので、、、
以下の通り、CurrentRowから職位を選択し、次の値と等しいを選択し、部長を選択します。
4.セルに書き込みを行う(CurrentIndexの利用)
アクティビティ:セルに書き込み を追加します。
書き込む内容は ★(テキスト)を入力します。
重要なのは、書き込む場所です・・・!
では、以下の図のように、B5/B10/B15という流れで入力するにはどうしたら良いのでしょうか?
間違った例ですが、以下のようにB5だけ指定してしまうと、もちろんB5にしか★は入力されません。(当たり前ですね)
では、どのように実現するかというと、ここで出てくるのが CurrentIndex です!
Currentindexとは以下の 現在のインデックスのことです。
この現在のインデックスがどのような動きになるか、メッセージボックスを使って検証したいと思います。
これを実行すると、以下のように 1→6→11 というメッセージが表示されます。
謎解きのようですが、この 1→6→11 というのは、エクセルのループ(繰り返し)の回数 があらわされているのです。
つまり、1回目のループをする→松潤は部長なのでメッセージを表示→・・・→6回目のループでキムタクは部長なのでメッセージを表示→・・・という流れになっているわけです。
では、このCurrentindexを使って、B5/B10/B15 に★を入力するにはどうしたら良いのでしょうか?
書き込む場所の+をクリックし、詳細エディターを開きます。
式エディタというものが開きます。この式ではB5にしか入力できないことが証明されていますので、ここでは、5の部分をCurrentindex(現在のインデックス)を用いて B5を作ってみます。
とっても重要です!B5の5を削除し、以下の通り、Currentindex+4 と入力します。
修正前:Excel.Sheet(“Sheet1”).Cell(“B5”)
修正後:Excel.Sheet(“Sheet1”).Cell(“B”&CurrentIndex+4)
勘の良い方はお分かりかと思いますが、このCurrentindexには1→6→11 というエクセルのループ(繰り返し)の回数 が入るため、+4とすることで、5→10→15 というカウントアップができるのです。
ここまで設定した内容を実行すると、以下のように職位が部長の時にB列に★を入力することができました!
行数が増えたときの対処方法
冒頭、範囲を指定する際に、C4:J15とベタ書きしてしまいました。
すると、以下のケースのように、行が追加されたとき、★を入力できなくなってしまいます。
繰り返しの範囲の指定をする際に、行を追加しても問題がないように対処することが可能です。
こちらの方法も併せてご紹介します。
1.最後のデータ行を検索する
アクティビティ:最初/最後のデータ行を検索 を追加します。
ソースにはエクセルの表の中で最後のデータが入るであろう行を指定します。ここでは、IDは絶対に入っているだろうということで、C4を指定指定します。
列名には Range>ID を指定します。これで、列の指定は完了です。
仕上げです。上記までの設定で、C列の最後の行番号を取得できたのですが、これを格納する箱を準備します。
この箱のことをプログラミングでは変数と呼びます。Uipathでは 後で使用するために保存 を利用して変数を定義します。
ここでは、名前を「最終行」にしてみました。
2.最終行を別の箱(変数)に格納しなおす
このパートが相当重要なのですが、説明すると複雑なので、おまじないのように設定をしてもらえるとありがたいです。。(適当で申し訳ないです)
1.Excelファイルを使用の歯車から値のマッピングを行う
Excelファイルを使用の右側の歯車マークから値のマッピングを選択します。
値にはなにも入れずに名前に「endRow」を入力します。(名前はもちろん任意です)
※全然関係ない位置の設定のようですが、この作業をしないと機能しないのです。。
2.最終行の行番号を別の変数(A)に格納する
最終行の行番号を取得したアクティビティの下に「後のために保存」を追加します。
こちらのアクティビティには以下の変数を入力します。
保存先:tempRow(任意。テキストで入力)
保存する値:最終行(保存された値を使用)
2.変数(A)に格納した行番号を別の変数(B)に格納する
更に「後のために保存」を追加します。
こちらのアクティビティには以下の変数を入力します。
保存先:endRow(変数)
保存する値:tempRow(保存された値を使用)
3.対象範囲を取得した変数を用いて修正する
ここまでで変数「endRow」には最終行の行番号を格納できました。
繰り返しの範囲に戻ってみます。この範囲「C4:J15」の15部分が最終行であり、この数字を取得した変数に置き換えれば良いということは分かりますでしょうか?
ということで、詳細エディタを開きます。
さて、CurrentIndexを既に使いこなしている皆さんなら、もうお分かりでしょう。
J15の15を削除し、以下の通り、endRow と入力します。
修正前:Excel.Sheet(“Sheet1”).Range(“C4:J15”)
修正後:Excel.Sheet(“Sheet1”).Range(“C4:J“&endRow)
これで範囲の指定も完了です!実行してみると、以下のように16行目以下も★を入力することができました!
さいごに
変数が登場して少しプログラミングっぽくなりましたが、これくらいのボリュームであれば、特に問題なく対応できるのではないでしょうか?
マジで新卒の時にUipath使って勉強したかった・・・!時代の変化すごい・・・!
ではまた!
[…] 現在のインデックス の使用方法 […]