2010-11-18 103 views
1

我們已經創建了幾個用作對應用程序執行特定操作的腳本的excel宏。每個腳本有多個函數調用和執行過程中的一些這些函數調用的失敗,因爲應用程序相關的性能問題(如窗戶沒有正確加載/窗口時間比預計負荷等更多的時間)

由於這些應用PERF的相關問題發生經常安靜,我們的執行始終失敗,我們計劃在腳本中實現一些代碼,在執行過程中我們可以重新執行失敗的函數(宏中的函數)。
你可以讓我知道我應該如何編碼來實現我的目標再次執行相同的功能。

例如,

如果在宏有下面的函數調用:
功能1
功能2
功能3
在這種情況下,如果功能2失敗,則我想在重新執行功能2運行。

:在這裏,我們不知道哪個函數調用失敗,所以我需要實現重新執行,其執行過程中失敗的任何功能的能力,所以它可能是功能1 /功能2 /功能3.如何在運行時重新執行相同的功能

回答

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 
2

將所有函數存儲在字典對象中。

設置參考微軟腳本運行時庫

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