Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何在运行时重新执行相同的函数_Vba_Excel_Excel 2007 - Fatal编程技术网

Vba 如何在运行时重新执行相同的函数

Vba 如何在运行时重新执行相同的函数,vba,excel,excel-2007,Vba,Excel,Excel 2007,我们已经创建了几个excel宏,用作脚本,用于对应用程序执行某些操作。每个脚本都有多个函数调用,在执行过程中,其中一些函数调用由于与应用程序相关的性能问题而失败(例如窗口未正确加载/窗口加载时间超出预期等)。 由于这些与应用程序性能相关的问题经常发生,并且我们的执行一直失败,因此我们计划在脚本中实现一些代码,在执行过程中,我们可以使用这些代码再次重新执行失败的函数(宏中的函数)。 您能告诉我如何编写代码以实现再次执行相同函数的目标吗。 例如, 如果在宏中有以下函数调用: 功能1 功能2 功能3

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

由于这些与应用程序性能相关的问题经常发生,并且我们的执行一直失败,因此我们计划在脚本中实现一些代码,在执行过程中,我们可以使用这些代码再次重新执行失败的函数(宏中的函数)。
您能告诉我如何编写代码以实现再次执行相同函数的目标吗。

例如,

如果在宏中有以下函数调用:
功能1
功能2
功能3
在这种情况下,如果函数2失败,那么我希望在运行时重新执行函数2。


注意:这里我们不知道哪个函数调用会失败,因此我需要实现一种功能,以重新执行执行执行期间失败的任何函数,这样它可能是函数1/函数2/函数3。

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

设置对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

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

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
Sub-Master()
不算长
常量lRUNMAX(长度=5)
lRunCount=0
做
lRunCount=lRunCount+1
循环直到函数1和lRunCount