Lenteur execution macro
Bonjour à tous,
Encore une fois j'ai besoin de votre aide.
J'ai le code suivant qui est lent alors que les opérations à réaliser me semblent assez simple.
Avez-vous des idées pour rendre ce code plus rapide lorsque je modifie la cellule L4 de la feuille "Avril 2022" par exemple ?
Voir le code dans le module 3 et dans la feuille "Avril 2022" du fichier joint.
Merci de vos lumières ;);)
Public Function FeuilleExiste(FeuilleAVerifier As String) As Boolean
'fonction qui vérifie si la "FeuilleAVerifier" existe dans le Classeur actif
On Error GoTo SiErreur
Dim Feuille
FeuilleExiste = False
For Each Feuille In Sheets
If UCase(Feuille.Name) = UCase(FeuilleAVerifier) Then
FeuilleExiste = True
Exit Function
End If
Next Feuille
Exit Function
SiErreur:
FeuilleExiste = CVErr(xlErrNA)
End Function
Sub Scénarios()
Application.ScreenUpdating = False
année = Worksheets("Actions Wolf+réduc impot revenu").Range("K1").Value2
moisDéclaration = Worksheets("Actions Wolf+réduc impot revenu").Range("Z33").Value2
If FeuilleExiste("Avril " & année) = True Then
If Worksheets("Actions Wolf+réduc impot revenu").Range("AN41") > 0 Then
Worksheets("Actions Wolf+réduc impot revenu").Range("W5").Value2 = "Salaires"
Worksheets(moisDéclaration & " " & année).Range("R7").Value2 = "TMI"
Worksheets("Actions Wolf+réduc impot revenu").Range("W29").Formula = Worksheets(moisDéclaration & " " & année).Range("S2").Value2
Worksheets("Actions Wolf+réduc impot revenu").Range("W5").Value2 = 0.3
Worksheets(moisDéclaration & " " & année).Range("R7").Value2 = "TMI"
Worksheets("Actions Wolf+réduc impot revenu").Range("X29").Formula = Worksheets(moisDéclaration & " " & année).Range("S2").Value2
Worksheets("Actions Wolf+réduc impot revenu").Range("W5").Value2 = "Salaires"
Worksheets(moisDéclaration & " " & année).Range("R7").Value2 = "PFU"
Worksheets("Actions Wolf+réduc impot revenu").Range("Y29").Formula = Worksheets(moisDéclaration & " " & année).Range("S2").Value2
Worksheets("Actions Wolf+réduc impot revenu").Range("W5").Value2 = 0.3
Worksheets(moisDéclaration & " " & année).Range("R7").Value2 = "PFU"
Worksheets("Actions Wolf+réduc impot revenu").Range("Z29").Formula = Worksheets(moisDéclaration & " " & année).Range("S2").Value2
Worksheets("Actions Wolf+réduc impot revenu").Range("W5") = Worksheets("Actions Wolf+réduc impot revenu").Range("Z25").Value2
Worksheets(moisDéclaration & " " & année).Range("R7") = Worksheets("Actions Wolf+réduc impot revenu").Range("Z24").Value2
If moisDéclaration = "Mai" Then
Worksheets(moisDéclaration & " " & année).Range("J4:S27").Copy Worksheets("Avril " & année).Range("J4:S27")
End If
End If
End If
Application.ScreenUpdating = True
End SubBonjour,
Le code révisé pour l'alléger, il ne devrait pas être plus rapide à ce stade puisque ce sont toujours les mêmes instructions :
Public Function FeuilleExiste(FeuilleAVerifier As String) As Boolean
'fonction qui vérifie si la FeuilleAVerifier existe dans le Classeur actif
Dim Feuille As Boolean
On Error GoTo SiErreur
For Each Feuille In Sheets
If UCase(Feuille.Name) = UCase(FeuilleAVerifier) Then FeuilleExiste = True: Exit For
Next Feuille
Exit Function
SiErreur:
FeuilleExiste = CVErr(xlErrNA)
End Function
Sub Scénarios()
Dim année As Integer, moisDéclaration As String
Application.ScreenUpdating = False
With Worksheets("Actions Wolf+réduc impot revenu")
année = .Range("K1")
moisDéclaration = .Range("Z33")
If FeuilleExiste("Avril " & année) Then
If .Range("AN41") > 0 Then
.Range("W5") = "Salaires"
Worksheets(moisDéclaration & " " & année).Range("R7") = "TMI"
.Range("W29") = Worksheets(moisDéclaration & " " & année).Range("S2")
.Range("W5") = 0.3
.Range("X29") = Worksheets(moisDéclaration & " " & année).Range("S2")
Worksheets(moisDéclaration & " " & année).Range("R7") = "PFU"
.Range("Y29") = Worksheets(moisDéclaration & " " & année).Range("S2")
.Range("Z29") = Worksheets(moisDéclaration & " " & année).Range("S2")
.Range("W5") = .Range("Z25")
Worksheets(moisDéclaration & " " & année).Range("R7") = .Range("Z24")
If moisDéclaration = "Mai" Then Worksheets(moisDéclaration & " " & année).Range("J4:S27").Copy Worksheets("Avril " & année).Range("J4:S27")
End If
End If
End With
Application.ScreenUpdating = True
End SubJuste une question : est ce que les valeurs affectées par la macro interagissent avec des formules de calculs ? Si oui, la macro récupère-t-elle le(s) résultat(s) pour l'utiliser plus loin dans le code ?
Si ce n'est pas le cas, vous pouvez ajouter à côté de Application.ScreenUpdating = False, un Application.Calculation = xlCalculationManual puis en fin de macro Application.Calculation = xlCalculationAutomatic
Bonjour,
La fonction FeuilleExist peut encore être largement optimisée :
Function WsExist(Nom$) As Boolean
On Error Resume Next
WsExist = Worksheets(Nom).Index
End FunctionA+
Salut Pedro22,
Merci, effectivement pas de gain de temps.
Merci de ton aide.
Pour répondre à ta qyestion oui les valeur vont interagir avec d'autre calcul, je ne peux donc pas mettre un Application.Calculation = xlCalculationManual puis en fin de macro Application.Calculation = xlCalculationAutomatic
Bonjour,
c'est quoi que tu appelles lent ?
0.1 s chez moi...
eric
Salut Eriiic,
Lorsque je modifie la cellule L4 de la feuille "Avril 2022", la macro met 4 secondes à s'executer....
T'as pu jeter un oeil à mon fichier?
Merci de ton temps et de ton aide.
A++
Wolf76
Bonsoir,
après téléchargement et modification de valeur en cellule L4 de la feuille "Avril 2022" le temps approximatif est de l'ordre de moins d'une seconde, à peine un clignotement de l'écran pour la mise à jour des valeurs de la feuille en fonction de L4.
Il est courant de dire que le temps maximum d'acceptabilité d'attente d'un utilisateur est de l'ordre de 7 secondes pour un code qui travaille... Donc 4, l'utilisateur n'a pas le temps de "décrocher"... Et 4 secondes combien de fois par "heure" ?
@ bientôt
LouReeD
Bonsoir,
OK merci à tous.
Mon pc doit dater un peu alors pourtant un Core I5.
Bref je vais me contenter d emon temps d'attente (et oui l'être humain est un éternel insatisfait) !!! :)
Bonne soirée.
A++
Wolf76
Le mien doit avoir 15 ans...
Peut-être un pb sur 2007, ou ton vrai fichier est plus lourd avec des formules dépendantes gourmandes (matricielles...) ?
Bonsoir,
vous parlez d'interaction au niveau des calculs, mais avec quelles cellules ou feuille, car si ce sont des cellules de la même feuille vous pouvez demandez à calculer que la feuille en question sans devoir faire "le tour" du classeur...
@ bientôt
LouReeD
Bonjour le fil,
Juste une petite astuce en passant
Au lieu de faire une boucle pour vérifier si une feuille existe, il suffit de l'attribuer à une variable objet
' Fonction qui vérifie si la "FeuilleAVerifier" existe dans le Classeur actif
Public Function FeuilleExiste(FeuilleAVerifier As String) As Boolean
Dim Sht As Worksheet
On Error Resume Next
Set Sht = ThisWorkbook.Sheets(FeuilleAVerifier)
FeuilleExiste = Not Sht Is Nothing
On Error GoTo 0
Set Sht = Nothing
End FunctionA+