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