如何在运行时重新执行相同的function

我们已经创build了一些用于对应用程序执行特定操作的脚本。 每个脚本都有多个函数调用,在执行过程中,由于应用程序相关的性能问题,这些函数调用中的一些失败(比如窗口没有正确加载/窗口花费的时间比预期的要多等)

由于这些应用程序性能相关的问题频繁发生,而且我们的执行一直失败,所以我们计划在脚本中实现一些代码,在执行过程中我们可以重新执行失败的函数(macros函数)。
你可以让我知道我应该如何编码,以达到我的目标,再次执行相同的function。

例如,

如果在macros中有以下函数调用:
function1
function2
function3
在这种情况下,如果function2失败,那么我想在运行时重新执行function2。

注意 :这里我们不知道哪个函数调用会失败,所以我需要实现一个能够重新执行任何在执行过程中失败的函数,所以它可能是函数1 /函数2 /函数3。

你可以让所有的函数返回一个布尔值,表示成功或失败,然后testing,以确定是否重新运行。 这里有一个例子还包括一个运行计数器,以避免无限循环。

Sub Master() Dim lRunCount As Long Const lRUNMAX As Long = 5 lRunCount = 0 Do lRunCount = lRunCount + 1 Loop Until Function1 And lRunCount <= lRUNMAX lRunCount = 0 Do lRunCount = lRunCount + 1 Loop Until Function2 And lRunCount <= lRUNMAX lRunCount = 0 Do lRunCount = lRunCount + 1 Loop Until Function3 And lRunCount <= lRUNMAX End Sub Function Function1() As Boolean Dim bReturn As Boolean On Error GoTo ErrHandler bReturn = True Debug.Print "function 1 did stuff" ErrExit: Function1 = bReturn Exit Function ErrHandler: bReturn = False Resume ErrExit End Function Function Function2() As Boolean Dim bReturn As Boolean On Error GoTo ErrHandler bReturn = True 'simulate error If Rnd < 0.5 Then Err.Raise 9999 Debug.Print "function 2 did stuff" ErrExit: Function2 = bReturn Exit Function ErrHandler: bReturn = False Resume ErrExit End Function Function Function3() As Boolean Dim bReturn As Boolean On Error GoTo ErrHandler bReturn = True Debug.Print "function 3 did stuff" ErrExit: Function3 = bReturn Exit Function ErrHandler: bReturn = False Resume ErrExit End Function 

将所有的函数存储在字典对象中。

设置对Microsoft脚本运行时库的引用

 public Sub MasterFunction() Public Dict as Dictionary Set dict = New Dictionary Dict.add "Function1" Dict.add "Function2" Dict.add "Function3" call Function1 call Function2 call Function3 

当函数运行时…在函数结束时,从字典中删除函数名称。 即

 public Function Function1() dict.remove "Function1" End Function 

最后一步是在字典中添加一个循环来查看是否还有剩余的项目。 如果字典中没有项目,那么你的函数成功执行。 如果有项目,再用application.run“Function1”再次调用该函数,用“Function1”代替你的函数名称。 下面的完整示例,复制并粘贴到模块中并运行“MasterFunction”。 第三个函数我没有调用它来模拟它没有运行。 如果你通过代码,你会看到剩下的唯一项目是没有被调用的Function3。

 Public dict As Dictionary Public Function MasterFunction() Set dict = New Dictionary dict.Add "Function1", "Function1" dict.Add "Function2", "Function2" dict.Add "Function3", "Function2" Call Function1 Call Function2 Dim DictItem For Each DictItem In dict Application.Run DictItem MsgBox DictItem & " has run again because it didn't execute last time" Next Set DictItem = Nothing Set dict = Nothing End Function Function Function1() dict.Remove "Function1" End Function Function Function2() dict.Remove "Function2" End Function Function Function3() dict.Remove "Function3" End Function