Optimisation d'un code

Résolu/Fermé
Louloude74 Messages postés 62 Date d'inscription mercredi 1 août 2018 Statut Membre Dernière intervention 17 avril 2024 - 2 sept. 2018 à 17:20
Louloude74 Messages postés 62 Date d'inscription mercredi 1 août 2018 Statut Membre Dernière intervention 17 avril 2024 - 2 sept. 2018 à 19:28
Bonjour à tous,

J'ai réalisé ce bout de code afin de vérifier si ente deux date, si dans la colonne "F" la valeur est égale à "Oui" (Je souhaite savoir si la ligne est prélèvement automatique). Si oui alors je récupère les données de la ligne de la colonne "C" à "I" et les intègre à la dernière ligne. En "B" j'inscris la date avec un mois supplémentaire et en "J" j'intègre une liste de validation. Après je passe à la ligne suivante et ainsi de suite jusqu'à la fin de ma boucle.

Ce code fonctionne parfaitement bien mais le calcul dure plus de 20 secondes. Mes compétences en VBA sont vraiment très limitées. Cf le code plus bas. Alors, je viens vous demander si il y a moyen d'optimiser l'écriture de mon code afin que le calcul soit plus rapide.

Encore un fois je vous remercie par avance et à très bientôt.

Cdt, Ludwig

Sub PrélèvementAuto()

Colonne = 2
Boucle = 9
BoucleFin = Worksheets("Journal").Cells(65536, Colonne).End(xlUp).Row
Fin = 8


While Boucle <= BoucleFin 'Je boucle sur toutes les lignes de mon tableau
    
'Je redonne les valeurs de départ
Colonne = 2
BoucleFin = Worksheets("Journal").Cells(65536, Colonne).End(xlUp).Row
Début = 2

'Je vérifie si les dates sont comprises entre le début du mois et la fin du mois précédent
If Worksheets("Journal").Cells(Boucle, Colonne).Value >= Worksheets("Paramètres").Range("DateDébutPlvtAuto").Value And Worksheets("Journal").Cells(Boucle, Colonne).Value <= Worksheets("Paramètres").Range("DateFinPlvtAuto").Value Then
    
    'Je vérifie si la colonne 6 est égale à "Oui"
    If Worksheets("Journal").Cells(Boucle, Colonne + 4).Value = "Oui" Then 'Si oui
        
        'J'inscris la date avec un mois de plus à la dernière ligne
        Worksheets("Journal").Cells(BoucleFin + 1, Colonne).Value = DateAdd("m", 1, Worksheets("Journal").Cells(Boucle, Colonne).Value)

            With Worksheets("Journal")  ' Ajout d'un liste déroulante "Oui" à la colonne "Vérif"
                Set Plage = .Cells(BoucleFin + 1, Colonne + 8)
            End With
   
            With Plage.Validation
                .Delete
                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=OuiListe"
                .IgnoreBlank = True
                .InCellDropdown = True
                .InputTitle = ""
                .ErrorTitle = ""
                .InputMessage = ""
                .ErrorMessage = ""
                .ShowInput = True
                .ShowError = True
        End With
        
        'je fais une boucle afin de récupérer les valeurs de la ligne sur chaque colonne
        While Début <= Fin
            Worksheets("Journal").Cells(BoucleFin + 1, Colonne + 1).Value = Worksheets("Journal").Cells(Boucle, Colonne + 1).Value
            Colonne = Colonne + 1
            Début = Début + 1
        Wend
                
    End If

End If

    Boucle = Boucle + 1
    
Wend

Cells(Cells(65536, Colonne).End(xlUp).Row, Colonne).Select

End Sub


A voir également:

1 réponse

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 306
2 sept. 2018 à 18:11
Bonjour

déjà, au départ, écris cette instruction qui fige le défilement de l'écran ---> confort visuel et rapidité

Application.screenupdating=False

1
Louloude74 Messages postés 62 Date d'inscription mercredi 1 août 2018 Statut Membre Dernière intervention 17 avril 2024 1
2 sept. 2018 à 19:28
Bonsoir Michel,

Effectivement le gain de temps n'est pas négligeable. Je suis passé d'une vingtaine de secondes à 3 ou 4 secondes. C'est dingue. Du coup en améliorant le code le calcul sera instantané ! Cool...!

Merci pour ce conseil très judicieux.

Bonne soirée à toi !
0