コラム コラム:タスク処理高速化1...そのループ、必要ですか?

本記事では、タスクの処理を高速化するための手法として、一例を紹介します。
(あくまでも一例ですので、ここで紹介するものが最適という訳ではありません)

AutoMateのようなRPAで処理をする業務内容としては、
データの比較処理などが多く挙げられるかと思われます。
そのような処理の中で、Excelの1レコードごとに毎回ループを繰り返して
非常に時間がかかった経験など無いでしょうか?
(注:ここで言う比較処理は、Excel同士の突合のようなデータマージ処理ではなく
対象のデータがリストAのうちのどれかに合致するか、のような処理を想定しています)

例として、ExcelのA列に入っているデータが
「総務」「経理」「財務」「法務」「管理」のどれかであるかどうか、を比較する際に
ループを使用したり、IF文を5回使用したりしていないでしょうか?

そうすると、1レコードあたりの経過ステップ数が長くなってしまうため
累計処理時間に大きく影響してしまいます。
(とりわけ、5つのどれにも一致しないデータの場合、
一致することのない条件式を5回も無駄に通ってしまいます。)

そのような際は、ループを使用したり、IF文を5つ並べたりするよりも
「IF - テキストが含まれる場合」を使用すると比較処理が1回で済みます。

具体的には以下の通りです。
【Before】

<AMVARIABLE NAME="var_Busho" VALUE="" DESCRIPTION="部署名を格納" TYPE="text" />
<AMVARIABLE NAME="var_temp" VALUE="" DESCRIPTION="一時領域" />
<AMVARIABLE NAME="var_isFound" VALUE="0" DESCRIPTION="該当すれば1,該当しなければ0" TYPE="number" />
<AMARRAY NAME="array_kanri" ROWS="4" />
<!--比較対象としたい部署一覧を配列で作成-->
<AMARRAY ACTIVITY="set" NAME="array_kanri" STARTINDEXZERO="YES"><SETTER INDEX="0" VALUE="総務" /><SETTER INDEX="1" VALUE="経理" /><SETTER INDEX="2" VALUE="財務" /><SETTER INDEX="3" VALUE="法務" /><SETTER INDEX="4" VALUE="管理" /></AMARRAY>
<!--リスト値を順に配列と比較 ヒットしたらダイアログを出す(本来は、Excelのデータセットの列などを順にチェックする処理を想定)-->
<AMLOOP ACTIVITY="list" LIST="総務,経理,システム,営業,法務,秘書" RESULTVARIABLE="var_Busho" />
<!--変数初期化-->
<AMVARIABLE ACTIVITY="set" VARIABLENAME="var_isFound" VALUE="0" />
<!--配列をループ-->
<AMLOOP ACTIVITY="array" ARRAY="array_kanri" RESULTVARIABLE="var_temp" STARTINDEXZERO="YES" />
<!--比較してヒットすれば該当ありをマークしてループを抜ける-->
<AMIF EXPRESSION="%var_Busho% = %var_temp%" />
<AMVARIABLE ACTIVITY="set" VARIABLENAME="var_isFound" VALUE="1" />
<AMSHOWDIALOG MESSAGE="ヒットしました" COUNTDOWNDELAY="2" />
<AMBREAK />
<AMIF ACTIVITY="end" />
<AMLOOP ACTIVITY="end" />
<!--該当しなければ、「該当なし」と表示-->
<AMIF EXPRESSION="%var_isFound% = 0" />
<AMSHOWDIALOG MESSAGE="該当なし" COUNTDOWNDELAY="2" />
<AMIF ACTIVITY="end" />
<AMLOOP ACTIVITY="end" />

【After】

<AMVARIABLE NAME="var_Busho" VALUE="" DESCRIPTION="部署名を格納" TYPE="text" />
<!--リスト値を順に配列と比較 ヒットしたらダイアログを出す(本来は、Excelのデータセットの列などを順にチェックする処理を想定)-->
<AMLOOP ACTIVITY="list" LIST="総務,経理,システム,営業,法務,秘書" RESULTVARIABLE="var_Busho" />
<!--完全一致を担保するため、前後の区切り文字も含めてテキスト検索-->
<AMIF ACTIVITY="contains_text" TEXT=",総務,経理,財務,法務,管理," SUBSTRING=",%var_Busho%," />
<AMSHOWDIALOG MESSAGE="ヒットしました" COUNTDOWNDELAY="2" />
<AMELSE />
<AMSHOWDIALOG MESSAGE="該当なし" COUNTDOWNDELAY="2" />
<AMIF ACTIVITY="end" />
<AMLOOP ACTIVITY="end" />

上記の2つを比較すると、【After】の方では以下のようなメリットがあります。
1. コメントを含めたステップ数が大幅に減る
2. 管理する変数や配列が減る
3. 無駄なループの読み飛ばしがなくなる

特に処理件数が多い場合は、3のループの読み飛ばしが多いと累計処理時間に大きな影響を及ぼします。

ループの無駄な読み飛ばしが多く、処理時間が気になる場合は
ループを使用しない方法もあるとどこかで覚えておいていただければと思います。

なお、Excel同士の突合で時間がかかってしまっている場合であれば
https://automate.sct.co.jp/knowledge/10846/
も参考にしてください。