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

时间:2010-11-18 21:46:56

标签: excel vba excel-vba excel-2007

我们创建了一些excel宏,我们将其用作执行针对应用程序的某些操作的脚本。每个脚本都有多个函数调用,并且在执行期间,由于与应用程序相关的性能问题(例如窗口未正确加载/窗口花费的时间超出预期加载等),其中一些函数调用失败。

由于这些应用程序性能相关问题经常发生,并且我们的执行始终失败,我们计划在脚本中实现一些代码,使用这些代码在执行期间我们可以再次重新执行失败的函数(来自宏的函数)。
你能告诉我如何编码以实现我再次执行相同功能的目标。

例如,

如果在宏中有以下函数调用:
功能1
功能2
功能3
在这种情况下,如果功能2失败,那么我想在运行时重新执行功能2 注意:这里我们不知道哪个函数调用会失败,所以我需要实现一个能力来重新执行在执行期间失败的任何函数,因此它可以是函数1 /函数2 /函数3。 / p>

2 个答案:

答案 0 :(得分:2)

将所有功能存储在字典对象中。

设置对Microsoft Scripting Runtime Library的引用

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

答案 1 :(得分:0)

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

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