条件によってRPAの処理を変えてみよう ~条件分岐~(基礎編)

ロボットを作成していると、時々「ここはどうやって組むのだろう?」「ここの操作が思っていたより難しい!」と感じる場面があると思います。
今回からはそのような悩みを解決するTipsをこのブログで提供します。初回は「条件分岐」です。
条件分岐では「If」を思い浮かべる人が多いと思われますが、RPAソフトウェアでは様々な条件分岐を設定出来ます
今回はRPAソフトウェアにおける様々な条件分岐のコマンドを説明します。

条件分岐とは

まず、「条件分岐」とは何でしょうか?
これは「指定した条件に応じて処理を分岐すること」を指します。RPAでは条件の分岐に後述の「If」「Else」、「Switch」「Case」などが主に使われます。

条件分岐を行うことで、1つのロボットで指定した条件ごとに様々な処理を行えます
ただしあまりに複雑な条件を組んだり、大量の条件分岐を加えたりするとロボットに負荷がかかったり、ロボットのロジックが複雑化して保守がしづらくなったりするデメリットもあります。
そのため、「その処理は本当に条件分岐が必要か」を考えて条件分岐を組む必要があります。

条件分岐の基本的なコマンド

ここではRPAにおける条件分岐で使われることが多いコマンドについて説明します。

If ~単純な条件指定~

条件分岐というと、この「If」のコマンドを真っ先に思い浮かべる人が多いのではないでしょうか?
皆様もご存じだと思いますが、「If」は「〇〇が△△の場合」といった単純な条件を設定する際に使います。「If」は「End」や「}」といった条件分岐の終了を示すコマンドや記号と共に以下のように使います。

     // 条件を設定する
     if (条件) {
      (条件に応じた処理)
    }


「If」は設定する条件が1つだけの場合は、このコマンドを使用して条件を指定するだけで済みます。
しかし、

  • Ifに対応した条件以外の場合の処理を設定したい
  • Ifで組む必要のある条件が3つ以上ある

といった場合、「If」だけでは分岐や設定するロジックの量が複雑になり、ロボットの保守作業時の負担が増します
こうした場合には下で紹介する「Else if」や「Else」を使う、あるいは「If」ではなく「Switch」や「Case」といったコマンドで条件分岐を行うことを考える必要があります。

Else if ~If以外の条件を設けて処理を指定する~

Else if」は、「If」で設定した条件以外の条件を指定したい場合に使用します。
そのためこのコマンドは

  • 「If」以外に設定する条件が具体的に決まっている
  • 設定する条件が2つ以下

の場合は特に向いています。
また設定すべき条件が3つ以上の場合でも、

  • 値の大小比較(ある変数の数値が10よりも大きいかどうかを判定する)がある

場合は「If」や「Else if」のコマンドで条件分岐を行う必要があります。(理由は後述)

「Else If」は以下のように設定します。

           // 条件1を設定する
     if (条件1) {
      (条件1に応じた処理)
         // 条件2を設定する
     }else if(条件2){
          (条件2に応じた処理)
        }

Else ~「If」「Else if」の条件以外での処理~

Else」は上記の「If」や「Else if」で設定した条件に合致しない場合の処理を設定する際に使用します。
「Else if」との違いは、「Else if」がコマンドを設定した後に別の条件を指定する必要があるのに対し、「Else」はその必要がないという点です。
そのため、

  • 「If」や「Else if」で設定した条件以外の場合にまとめて特定の処理を行いたい

という場合はElse」を設定してそのあとに行う処理をまとめる方が良いです。

「Else」は以下のように設定します。

          // 条件を設定する
     if (条件) {
      (条件に応じた処理)
         // ifの条件を満たさない場合
     }else{
          (ifの条件を満たさない場合の処理)
        }

Switch ~変数で複数の条件を指定する~

条件分岐のコマンドというと上記の「If」や「Else」などを思い浮かべる方が多いと思われますが、RPAソフトウェアの中には「Switch」や「Case」というコマンドを使えるものもあります。ここからはこれらのコマンドについて説明いたします。

この「Switch」は条件分岐に確認する変数を指定する場合に使用します。
「Switch」は「If」と違い、これ単独では条件分岐が出来ません。そのため「Case」と共に使用する必要があります
「じゃあこのコマンド意味がないじゃないか」と思う人もいるかもしれませんが、「If」の場合は条件分岐を行う変数と同時に条件を指定する必要があるのに対して「Switch」では条件は後述の「Case」で指定すればよいため
特に、

  • 指定する条件が3つ以上ある

場合はロボットのロジック量の削減につながります。

「Switch」は以下のように設定します。

        // 条件分岐に使用する変数を設定する
    Switch (変数)

Case ~3つ以上の条件の設定~

Case」は「Switch」で述べた通り、指定した変数に対して条件を指定する際に使用します。コマンドを使用する際は「Switch」とともに使います
「Case」の場合、「If」と違って確認に使用する変数はすでに「Switch」で設定されているため、条件分岐の際に変数名を書かなくてよいことが多いです。
ただし注意点として「Case」では値の大小比較は不可能なことが多いです。
(大小比較が必要な場合は先ほどの「If」や「Else if」などを使用します。)
そのため「Case」は基本的に

  • 確認に使用する変数の条件となる値が1つに決まっている

場合に使用します。

「Case」は以下のように設定します。

           // 条件に使用する値を設定する
     Case = (条件に使用する値)
      // 条件を満たした場合の処理を行う
     (条件を満たした場合の処理)
           // Caseの処理終了
          End Case

Default Case ~「Switch」「Case」以外の処理~

Default Case」は「Case」で使用した条件に合致しない場合の処理を設定する際に指定します。「Switch」「Case」と共に使用します。
「Default Case」は「If」における「Else」コマンドと同じです。そのため「Default Case」も条件を具体的に指定する必要はありません。

「Default Case」は以下のように設定します。

           // 条件に使用する値を設定する
     Case = (条件に使用する値)
      // 指定した値が条件を満たした場合の処理を行う
     (指定した値が条件を満たした場合の処理)
    // それ以外の値の場合
    Default Case
     // それ以外の値の場合の処理を行う
    (指定した値以外の場合の処理)
       // Caseの処理終了
       End Case

条件分岐におけるTips

ここでは条件分岐のコマンドを設定する上で役に立つ知識について解説します。

特定の条件の条件分岐を行うコマンド

ここまでは基本的な条件分岐のコマンドについて説明してきましたが、条件分岐が必要な処理の中には基本的な条件分岐コマンドだけでは複雑になってしまう場合があります。
例えば「ある画像が画面に存在するかを確認し、見つけたらそれに対してAという操作を行う」ロボットを作成したいとします。
この時、IfやElseなど基本的な条件分岐のコマンドを使って判定する場合、

  1. 特定の画像やオブジェクトの存在を確認し、変数を設定
  2. 変数に対して条件分岐を行う

という設定が必要になり、処理が複雑になってしまいます。
しかしもしここで「画像が存在した場合」というコマンドがある場合はどうでしょうか。
これは指定した特定の画像が画面に表示されているかを調べ、それに対する処理を設定するコマンドです。
このコマンドを使った場合、「画像の存在確認用の変数を設定する」という処理を組む必要がなくなります。そうすれば必然的にロボットのロジックは簡素化され、ロボットの処理の負担軽減にもつながります
このように一部のRPAソフトウェアでは特定の条件に対する条件分岐に対応できるコマンドを設定しているものもあります。特に

  • 画像
  • オブジェクト

など画面表示が関わるような条件分岐ではそのようなコマンドを使う方が良い場合も多いです。

ブーリアン(Boolean)変数 ~「TRUE」と「FALSE」~

まず「ブーリアン」(Boolean)とはどういう意味かと思った人もいるのではないでしょうか?
これはプログラミング言語における変数の基本データ型の種類の1つです。「『』か『』か」といったどちらか2つのうち1つを選ぶ条件を示す際に利用されます。
ブーリアン変数は基本的にはプログラミングで使われますが、RPAソフトウェアでもブーリアン変数の設定が可能だったり、デフォルトでいくつかのブーリアン変数が設定されていたりするものがあります。
ブーリアン変数では文字列や数値型の変数と違い設定可能な値は「TRUE」か「FALSE」に限られていることが多いです。
そのため、場合によってはコマンド設定時に条件分岐のロジックを簡素化出来ます。
例えば「ある特定の条件で変数にフラグを設定し、条件分岐時にその変数のフラグの値を判定する」というロジックを組むとします。
この時、文字型の変数でフラグの判定を行う場合は該当の変数が空白ではないかの判定のために
(変数名) != “”」(「!=」という記号は「同じでない」という意味です。つまりこの場合、「(変数名)がの値空白ではない」ということを確認します。)といったロジックを組む必要があります。
一方ブーリアン変数を使って判定する場合、それがTRUEであるかを確認すればよいので、条件分岐のコマンドを設定する際にブーリアン変数名をコマンドに記入するだけで条件判定が可能になります。

ロジックの組み方の事例

ここまで条件分岐にかかわる様々なコマンドを紹介しましたが、中には「どのような場面でコマンドを使うかが知りたい!」と思われる方もいるでしょう。ここではコマンドに応じたロボットの条件分岐の組み方の例を紹介します。

If、Else if、Elseを使った条件分岐の組み方の例

「テストの点数を設定した変数の値によって以下のようにメッセージボックスの表示を変えたい」とします。

  • 90点以上→メッセージボックスに「あなたは成績優秀者です」と表示
  • 50点未満→メッセージボックスに「あなたは不合格です」と表示
  • それ以外→メッセージボックスに「あなたは合格です」と表示

この場合、以下のようにRPAで設定します。(下の例の「Alart」はRPAソフトウェアによっては、「メッセージボックス」などのコマンドで代用できます。)

     // 点数が90点以上の場合
     if (score >= 90) {
      Alert "あなたは成績優秀者です"

     // 点数が50点未満の場合
     }else if(score < 50){
      Alert "あなたは不合格です"

     // それ以外の点数の場合
    } else {
     Alert "あなたは合格です"
    }

Swtich、Case、Default Caseを使った条件分岐の組み方の例

日付の変数の値によって以下のように割引率を設定するとします。

  • 日付の変数の値が「5」→割引率の変数に「0.05」を代入
  • 日付の変数の値「10」→割引率の変数に「0.1」を代入
  • 日付の変数の値が「25」→割引率の変数に「0.25」を代入
  • それ以外→割引率の変数に「0」を代入

この場合、以下のように設定します。

   // 日付の変数を設定する
   Switch day

    // 日付の変数の値が「5」の場合
    Case = 5
     // 割引率に「0.05」を代入する
     discountRate = 0.05
    // 日付の変数の値が「10」の場合
    Case = 10
     // 割引率に「0.1」を代入する
     discountRate = 0.1
    // 日付の変数の値が「25」の場合
    Case = 25
     // 割引率に「0.25」を代入する
     discountRate = 0.25
   // それ以外の日付の場合
   Default Case
    // 割引率に「0」を代入する
    discountRate = 0

   End Case

ブーリアン変数を使用したロジックの組み方の例

「ExcelファイルのA1セルの値が『〇』かどうかを確認し、『〇』だった場合は変数「セル値」に「True」と設定してロボットを終了させる」というロジックを組むとします。

この場合、以下のように設定します。

   // 変数「セルフラグ」を設定(通常では「False」となる)
   bool cellFlg = False

   // Excelファイルを開く
   Excel "open" file="(Excelファイル名)"

   // ExcelのSheet1のA1セルの値を確認
   Excel "select" column="1" sheet="Sheet1" row="1"

   // 取得したセル値が「〇」の場合(セル値はすでに変数「cellValue」に設定されているものとする。)
   if (cellValue == "〇"){
    // 変数「セルフラグ」に「True」と設定
    bool cellFlg = True
   }

   // セルフラグが「True」の場合
  if (cellFlg){
   // ロボットを終了
  Exit "0" scope="process"
  // セルフラグが「False」の場合
  }else {
   (セルフラグが「False」の場合の処理)
  }

コメント

タイトルとURLをコピーしました