戻りを待つか、待たないか。そして、タイムアウト。


はじめに

Automation360の「Excelの高度な操作」アクションの「マクロを実行」でマクロエラーが起きるとBotの実行が止まってしまいます。どうやら「マクロを実行」はマクロの終了を待っているようです。
では、その他の実行系のアクションはどうなっているのか、試してみました。

★A360.22でタイムアウトがサポートされました。
 なので以下で書いた『タイムアウト無理やり実装』はもう意味ありません。 (2021/9/18)

結果

アクション 終了を待つ 待たない 
アプリケーション: プログラム/ファイルを開く   ○
VBScript: 関数を実行   ○
Python スクリプト: スクリプトを実行   ○
Excel の高度な操作: マクロを実行   ○

Excelマクロエラーで止まらないようにできないか

エラーが起きないようにマクロを作るのが大前提なのですが、それでも不測の事態に備えマクロが一定時間戻ってこなかった場合にタイムアウトができるか否かを考えてみます。
まず、Automation Anywhere V11にはタスクのプロパティとして「timeout設定」がありましたが、これはExcelマクロエラーのようにBotから呼んだアクションが長時間戻ってこない場合には使えません(詳しい理由は割愛)。
それ以前に、Automation 360には現在のところタイムアウト設定がないようです。
そのため、自力で無理やりな実装を考えてみます。

ひとつの案

(1)マクロを「Excel の高度な操作: マクロを実行」ではなく、「アプリケーション: プログラム/ファイルを開く」で起動する。
(2)マクロを実行したあとBotの次のステップに進むのでループと遅延を使って一定時間たったら強制的にExcelを終了させる。

※(1)については以下を参考にしました。
https://qiita.com/tomotagwork/items/4a5927142ee4b939c4cd

#タイムアウト付きのマクロ実行

#1:VBscriptを実行後すぐに戻るよう、「アプリケーション: プログラム/ファイルを開く」で起動。
#2:100回は適当。変数$Counter$に回数を入れる。
#4:Excelが終わっていたらループを抜ける(正常終了)
#6:変数$Counter$ > 15ならタイムアウトとみなして、強制終了させる。15は適切な値にする。
#7:タイムアウトのため、強制終了させるbatファイルを呼ぶ

使ったVBSやBAT

最小限の動作確認のため、非常に雑な作りである点、ご注意ください。

#1のVBscript

Dim obj
Set obj=WScript.CreateObject("Excel.Application")

obj.Visible=true
obj.Workbooks.Open  "D:\temp\MacroTest.xlsm"
obj.Application.Run "Macro1"

obj.Application.DisplayAlerts = False
obj.Workbooks.Close
obj.Application.Quit
    
set obj = nothing

#7のBAT

@echo off
taskkill /F  /IM  wscript.exe
taskkill /F  /IM  EXCEL.EXE

・無理やり終わらせているので、Excelの回復が裏で走る。あとで綺麗にしないといけない。
・GUIのエラーダイアログが出てたら消すために、wscript.exeも殺しています。
・Excelやwscript.exeが他には動いていない事が前提。

#さいごに
試してみたものの、やっぱり煩雑。
Automation360自身に綺麗なタイムアウトが実装される事を期待。
でも、一番考えるべきは、呼び出すマクロやプログラムを、止まらないようにきちんと作る事かな。

★A360.22でタイムアウトがサポートされました。 (2021/9/18)