Table Of Contents
1.Quiz
さっそくですが、クイズです。
下図フローの実行結果を考えてみましょう。制限時間は1分です。
※「strPrice」はString型の変数です。
答えを確認していきましょう。
下図のように、「1000以上です」というメッセージボックスが表示される、が実行結果となります。
少し簡単すぎましたね。
処理の流れをみていきます。
String型の変数strPriceに文字列「1200」を代入後、「条件分岐(else if)」アクティビティでstrPriceを対象とした条件判定をおこなっています。
1つめの条件「strPrice.Contains(“円”)」では、strPriceに「円」という文字が含まれているかどうかを判定しています。
strPriceには「円」は含まれていませんので、2つ目の条件「CInt(strPrice) >= 1000」の判定に移ります。
「CInt()」は、()内の値をInt32型に変換するメソッドのため、「1200 >= 1000」という条件を判定していることになります。
もちろん結果はTrueとなりますので、条件がTrueの場合の処理である「1000以上です」というメッセージボックスが表示される、というわけです。
それでは第2問です。同様に1分間考えてみましょう。
※「strPrice」はString型の変数です。
答えを確認していきましょう。
「金額に’円’が含まれています」というメッセージボックスが表示される、ではなくstrPriceをInt32型に変換できない旨のエラーが発生する、が正解です。
メッセージを確認するかぎり、エラーの発生個所は2つ目の条件「CInt(strPrice) >= 1000」内の「CInt(strPrice)」の箇所のようです。
しかしながら、今回の場合、条件分岐(else if)の対象となるstrPriceに設定されている値は「1200円」なので、1つ目の条件「strPrice.Contains(“円”)」の判定結果はTrueになり、2つ目の条件判定には進まないはずです。
どうしてエラーになるのでしょうか。
原因究明のために、「条件分岐(else if)」アクティビティの細かい動きを見ていきましょう。
2.「条件分岐(else if)」アクティビティについて
「条件分岐(else if)」アクティビティは名前の通り、1つ目の条件を判定し、結果がFalseなら2つ目の条件を判定、さらに結果がFalseなら3つ目の条件を判定、というように複数の条件を順番に評価したい場合に使用します。
しかしながら、条件の評価について注意すべきことがあります。
UiPathの公式ドキュメントに以下の記載があります。
“このアクティビティは、先にすべての条件を評価してから実際にアクティビティを実行します。”
“[Else If] アクティビティが実際に実行される前に、先にすべての条件が評価されます。
これにより、例外などの副作用が発生する可能性があります。
これを回避するには、ELSE 条件にチェックを追加します。”
出典:ワークフローに関するアクティビティhttps://docs.uipath.com/ja/activities/other/latest/workflow/if-else-if
上記はつまり、条件判定に先立って「条件分岐(else if)」アクティビティ内で指定した条件文自体の妥当性をすべてチェックしているということです。
今回の場合は、条件判定の前に、以下2つの条件文の妥当性が評価されていることになります。
1つ目の条件:「strPrice.Contains(“円”)」
2つ目の条件:「CInt(strPrice) >= 1000」
第2問の場合、strPriceの値は「1200円」で、「円」という文字が含まれてるためInt32型に変換できず、2つ目の条件内の「CInt(strPrice)」メソッドでエラーが発生します。
結果として、条件判定をおこなう前の条件文自体の妥当性チェックの時点でエラー終了するため、上記のようなメッセージが表示されるというわけです
したがって、条件判定だけを見ると、到達しえない2つ目の条件でエラーが発生しているように見えるというわけです。
※第1問の場合、strPriceの値は「1200」でInt32型への変換が可能なため、正常に条件判定が行われます。結果としてエラーは発生しません。
3.上記エラーの回避方法
今回の場合、下図のように、1つ目の「条件分岐(if)」アクティビティに条件「strPrice.Contains(“円”)」を指定し、Falseだった場合の処理に条件「CInt(strPrice) >= 1000」を指定した2つ目の「条件分岐(if)」アクティビティを配置することで当該エラーを回避することができます。