2010-11-18 41 views
1

Nous avons créé quelques macros Excel que nous utilisons comme script pour effectuer certaines actions contre l'application. Chaque script a plusieurs appels de fonction et pendant l'exécution, certains de ces appels de fonction échouent en raison de problèmes de performance liés à l'application (comme la fenêtre n'a pas été chargée correctement/fenêtre a pris plus de temps que prévu)

calme souvent et notre exécution est en train d'échouer tout le temps, nous prévoyons d'implémenter du code dans le script en utilisant lequel pendant l'exécution nous pourrions être en mesure de ré-exécuter la fonction échouée à nouveau (fonction de macro).
Pouvez-vous me dire comment je devrais coder pour atteindre mon objectif d'exécuter la même fonction à nouveau.

Par exemple,

Si dans macro il y a ci-dessous les appels de fonction:
Fonction 1
Fonction 2
Fonction 3
Dans ce cas, si la fonction 2 échoue alors je voudrais re-exécuter la fonction 2 au cours temps d'exécution.

Remarque: Ici, nous ne savons pas quelle fonction d'appel échouera si je dois mettre en place une capacité de ré-exécuter toute fonction qui échoue lors de l'exécution de sorte qu'il pourrait être fonction 1/Fonction 2/Fonction 3.Comment ré-exécuter la même fonction pendant l'exécution

Répondre

0

Vous pouvez faire toutes vos fonctions renvoient un succès ou d'échec indiquant booléenne, puis tester que pour déterminer si recourue. Voici un exemple qui comprend également un compteur d'exécution pour éviter les boucles sans fin.

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

Stocke toutes les fonctions dans un objet dictionnaire.

définir une référence à 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 

Lorsqu'une fonction est exécutée ... à la fin de la fonction, effacer le nom de la fonction du dictionnaire. Par exemple,

public Function Function1() 

dict.remove "Function1" 

End Function 

La dernière étape consiste à ajouter une boucle dans le dictionnaire pour voir s'il reste des éléments. S'il n'y a aucun élément dans le dictionnaire, vos fonctions sont exécutées avec succès. S'il y a des éléments, appelez à nouveau la fonction avec application.run "Function1", en remplaçant "Function1" par votre nom de fonction. Exemple complet ci-dessous, Copiez et collez dans un module et exécutez "MasterFunction". La troisième fonction que je n'appelle pas pour simuler qu'elle n'a pas fonctionné. Si vous parcourez le code, vous verrez que le seul élément restant est Function3 qui n'a pas été appelé.

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