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 ?

15tests.xlsm (85.96 Ko)

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 Sub

Bonjour,

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 Sub

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

A+

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 Function

A+

Rechercher des sujets similaires à "lenteur execution macro"