XL 2016 Optimiser et revoir une boucle

sebastien450

XLDnaute Occasionnel
Bonjour,
J'ai une macro, qui fonctionne bien mais un peu lente,
Je me demande comment l'optimiser pour eviter les boucles imbriquée "IF" et bien sur plus rapide en Set/with.

Merci de vos conseils.


PS: je n'ai pas trouvé comment éviter la fonction Feuil1.activate;;

VB:
                        For X3 = 1 To 20 ' a partir de la premiere ligne je descend sur 20 ' a partir de la a vérifier les actions qui conduisent a indiquer ruptur
                            If Feuil5.Cells(x2 - 1 + X3, 4).Value <> cible Then Exit For
                                    If Feuil5.Cells(x2 - 1 + X3, 8).Value >= 3 Then Feuil6.Cells(X, 12).Value = "DÉJÀ ALLOUÉ": Exit For
                                    If Feuil5.Cells(x2 - 1 + X3, 6).Value - Feuil5.Cells(x2 - 1 + X3, 7).Value >= Feuil5.Cells(x2 - 1 + X3, 2).Value Then Feuil6.Cells(X, 12).Value = "OK"
                                    If Feuil5.Cells(x2 - 1 + X3, 6).Value - Feuil5.Cells(x2 - 1 + X3, 7).Value < Feuil5.Cells(x2 - 1 + X3, 2).Value Then
                                    Feuil6.Cells(X, 14).Value = Feuil5.Cells(x2 - 1 + X3, 5).Value ': MsgBox "marupture est le " & Feuil6.Cells(x, 14).Value
                                    If Feuil6.Cells(X, 14).Value Like "A####-*" Or Feuil6.Cells(X, 14).Value Like "A###-*" Then ' je vais donc aller cherche cette cible
                                
                                                    Feuil1.Activate
                                                    For R = 4 To Cells(5, 8000).End(xlToLeft).Column ' Sur toute les colonnes je cherche la colonne correspondante date du jour
                                                        If Feuil1.Cells(1, R).Value = CDate(Year(Now) & "/" & Month(Now) & "/" & Day(Now)) Then R2 = R: Exit For 'l2= date du jour
                                                        Next R
                                                        If R2 = "" Then MsgBox "LA DATE DU JOUR N'APPARAIT PAS SUR LE PLANNING": Exit Sub
                                                        
                                                        Set plage = Range(Cells(6, R2 - 24), Cells(213, R2 + 60)) ' sur ma plage de R2-48h à R2 +1000
                                                          With plage 'defini le range de travail, qui va devenir variable
                                                            Set c = .Find(Feuil6.Cells(X, 14).Value, LookIn:=xlValues, lookat:=False) 'cherche le produit manquant désigné dans les articles (si pas de PS il trouvera rien bien sur)
                                                            If Not c Is Nothing Then
                                                                Add1 = c.Address
                                                              Do
                                                                    For c2 = c.Column To c.Column - 24 Step -1 ' je vais donc lancer boucle col -1 jusqu'a -16 pour ma date de prod
                                                                        If Feuil1.Cells(1, c2).Value <> "" Then Feuil6.Cells(X, 15) = "EN PROD LE " & Feuil1.Cells(1, c2).Value: Exit For ' je colle la colonne du jour de prod
                                                                    Next c2
                                                                Set c = .FindNext(c)
                                                              Loop While Not c Is Nothing And c.Address <> Add1
                                                            End If
                                                          End With
                                                    Exit For   ' il me manque appro et je met quoi
                            End If 'je sort de la condition chaine de caractéere
                            End If 'je sort de l'écriture
                        Next X3
 

Diurnambul

XLDnaute Nouveau
Salut Sébastien,

Est ce que tu veux réécrire différemment la macro ou est ce que l'objectif uniquement d'accélérer la macro (bien que les deux ne soient pas forcément indissociable).

Essaye dans un premier temps de rajouter en début de macro les lignes suivantes

'Placer en début de code les lignes suivantes
Application.DisplayAlerts = False 'messages Excel
Application.DisplayStatusBar = True ' info avancement macro dans barre d'infos en bas écran
Application.StatusBar = "Mise à jour des données en cours"
Application.ScreenUpdating = False 'rafraichissement écran (pour ne pas voir défiler les macros)
Application.Cursor = xlWait 'sablier
Application.Calculation = xlCalculationManual ' supprime calcul auto EXCEL pour gagner du temps.
Application.enableEvents=False
'--------------------------------------------------------------------------------------------------------------------------

Et celles-ci en fin de macro

'--------------------------------------------------------------------------------------------------------------------------
'Placer en fin de code les lignes suivantes
Application.DisplayAlerts = True
Application.StatusBar = "Données à jour"
Application.ScreenUpdating = True 'rafraichissement écran
Application.Cursor = xlDefault 'sablier
Application.Calculation = xlCalculationAutomatic
Application.enableEvents=True

Si la vitesse d'exécution te convient, c'est gagné. Si ce n'est pas le cas, on essayera de voir comment on peut optimiser ça :)

Excellente journée
 

Statistiques des forums

Discussions
288 664
Messages
1 893 836
Membres
170 101
dernier inscrit
Lupinps
Haut Bas