UiPath|アクティビティ|Parallel+Excelマクロ監視|マクロ実行中のエラーダイアログを検知してフラグ化→Parallel外で例外化し、Retryで再実行制御する
■ 基本構文
(実務テンプレ:ThrowはParallelの外、Parallel内は“フラグ更新”に限定して安定化)
○ 目的
§ Excelマクロ実行(②)と、エラーダイアログ監視(①)を並列で走らせる
§ 監視で異常を検知したら flgMacroErr=True を立てる
§ Parallel終了後に If flgMacroErr Then Throw でTryCatchに確定に倒す
§ Retryは「例外で回す」より「フラグ+Conditionで回す」寄りにして再現性を上げる
○ 推奨ワークフロー骨格(ツリー)
§ Retry Scope
□ Action:Sequence
® Assign flgMacroErr=False / flgMacroDone=False
® Try Catch
◇ Try:
} Excel Application Scope(ContinueOnError=False 推奨)
– Parallel(ContinueOnError=False 推奨)
w ① 監視:エラーダイアログ検知 → flgMacroErr=True(可能なら閉じる)
w ② 実行:マクロ実行 → flgMacroDone=True
} If flgMacroErr Then Throw(※Parallelの外)
◇ Catch:必要に応じて後妻(Excel終了、プロセス整理など)+flgMacroErr=True
□ Condition:Not flgMacroErr(成功条件が満たされるまでリトライ)
○ Parallelの「条件(完了条件)」の考え方
§ 定数 True を入れると“どちらかが終わったら終了”になりやすく、監視側が先にキャンセルされて検知不能になりがち
§ 実務では、Parallelの条件は次のように「状態」で制御するのが安定
□ flgMacroErr Or flgMacroDone
□ 監視①が flgMacroErr=True を立てたら即終了
□ 実行②が flgMacroDone=True を立てたら正常終了
○ 使う変数(例)
§ flgMacroErr:Boolean(監視で異常検知したか)
§ flgMacroDone:Boolean(マクロ実行が完了したか)
§ msgErr:String(検知したエラー概要。ログや例外メッセージ用)
○ 戻り値の型・性質:なし(ワークフロー制御。失敗時は例外でCatchへ移動し、RetryはConditionで再実行)■ サンプルコード
サンプル①:Parallelで監視し、Parallel外でThrowしてRetryに繋げる(最小安定形)
役割:マクロ実行とエラーダイアログ監視を並列で行い、失敗を確実にTryCatchへ传撲させる
理由:Parallel内Throwはキャンセル/完了条件で実行されない・伝撲しない事故が起きやすいため
注意:Parallelの「条件」をTrue固定にしない。監視は“フラグ更新”に定期し、Throwは外で行う
// 変数(Workflow Variables)
// flgMacroErr : Boolean = False
// flgMacroDone: Boolean = False
// msgErr : String = ""
// Retry Scope
// - NumberOfRetries : 例 3
// - RetryInterval : 例 00:00:10
// - Condition : Not flgMacroErr
Retry Scope
Action (Sequence)
Assign flgMacroErr = False
Assign flgMacroDone = False
Assign msgErr = ""
Try Catch
Try
Excel Application Scope // ContinueOnError = False 推奨
Parallel
// Parallel
// - Condition(完了条件) : flgMacroErr Or flgMacroDone
// - ContinueOnError : False 推奨
Branch① 監視(エラーダイアログ)
// 例:On Element Appear / Element Exists などで「エラー ダイアログ」を待つ
// Timeout は「マクロ想定最大時間」寄りに置く
If (エラーダイアログが見つかった)
Assign flgMacroErr = True
Assign msgErr = "Excelマクロのエラーダイアログを検知"
// 可能なら閉じる(Click / Send Hotkey / タスクキルなど、運用に合わせる)
Branch② 実行(マクロ)
Execute Macro
Assign flgMacroDone = True
If flgMacroErr Then
Throw New System.Exception(msgErr)
Catch ex
// 必要に応じて後妻(Excel終了・プロセス整理など)
Assign flgMacroErr = True
Condition
Not flgMacroErr
サンプル②:監視側で「検知→閉じる」を実施してリトライの成功率を上げる
役割:ダイアログ検知後に閉じる動作を入れて、次リトライ時の阻害要図を減らす
理由:ダイアログが残ると、次のマクロ実行やExcel操作がフォーカス奪取で失敗しやすいため
注意:閉じ方(OK/閉じる/ESC)は対象ダイアログで異なる。誤爆防止のため要線指定を優先する
Branch① 監視(エラーダイアログ)
If (エラーダイアログが見つかった)
Assign flgMacroErr = True
Assign msgErr = "Excelマクロのエラーダイアログを検知"
// 推奨:要線を指定してボタンを押す(OK/閉じる)
Click 'OK' ボタン(セレクターで特定)
// 代替:ショートカット(誤爆しやすいので最後の手段)
Send Hotkey: Alt+F4 または Enter
// 最終手段:Excelプロセス整理(運用許可がある場合のみ)
Kill Process: EXCEL■ 備考
• Parallel内でThrowすると、完了条件・キャンセル挙動・ContinueOnErrorの影響で「Throwが実行されない/上に伝撲しない」事故が起きやすい
• Parallelの「条件(完了条件)」に True固定 を入れると、どちらか片方が先に終わった時点で残りが止まりやすく、監視が成立しない構図になりやすい
• 例外でRetryを回すより、フラグ(成功条件)でRetry Conditionを制御すると再現性が高い(失敗=flgMacroErr=True に寄せる)
• ContinueOnError=True がどこかに入ると、TryCatchに倒れず「成功扱いで抜ける」ことがあるため、Parallel/Excel Scope/親Sequenceを重点的に確認する
• 用語(英語・日本語・読み)
○ Parallel:並列|パラレル
○ Condition:条件(完了条件)|コンディション
○ Throw:例外を投げる|スロー
○ Retry:再試行|リトライ
いいなと思ったら応援しよう!
技術メモや学習の整理として書いています。
もし内容が役に立ったり、続きを読みたいと思っていただけたら、
応援として受け取らせてもらえたら嬉しいです。