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
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
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