見出し画像

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:再試行|リトライ

いいなと思ったら応援しよう!

Parusの寺小屋 技術メモや学習の整理として書いています。 もし内容が役に立ったり、続きを読みたいと思っていただけたら、 応援として受け取らせてもらえたら嬉しいです。