[RÉSOLU] Réduire le temps d'éxécution de la macro

aubelix

XLDnaute Impliqué
Bonjour à tous les amis du Forum.
Je reviens vers vous une fois de plus pour vous demander votre aide.
Mon problème est le suivant:
J'ai une macro avec l'aide du Forum, ma permis de colorer des cellules
en fonction du nombre de jours et d'inscrire un symbole voir fichier joint.
La macro fonctionne très bien, mais elle est anormalement longue...
Plus de 20 minutes pour les données de mon fichier.
J'ai l'ai coupé pour la démo et éviter qu'il dure, mais cela prend comme même
plus de 7 minutes !
Pourriez-vous SVP essayer de l'optimiser.
Par avance, Merci, pourvotre aide.
Cordialement.
 

Pièces jointes

  • COLORATION_DONNEES.xlsm
    220.7 KB · Affichages: 83
  • COLORATION_DONNEES.xlsm
    220.7 KB · Affichages: 87
  • COLORATION_DONNEES.xlsm
    220.7 KB · Affichages: 81
Dernière édition:

GeoTrouvePas

XLDnaute Impliqué
Re : Réduire le temps d'éxécution de la macro

Bonjour aubelix !

Juste pour info, ta macro s'exécute en à peine 10 secondes chez moi, ce qui n'a rien extraordinaire pour un traitement qui passe sur 800 lignes.

Je regarde ton code d'un peu plus près pour savoir exactement ce qu'il fait et comment l'accélérer.
 

GeoTrouvePas

XLDnaute Impliqué
Re : Réduire le temps d'éxécution de la macro

Re,

Je viens de tester avec Excel 2007 (contre 2002 précédemment) et l'exécution est effectivement TRES longue. Je continue à regarder mais à mon avis il doit y avoir une plage mal définie ce qui fait que la macro s'exécute sur le million de lignes disponibles.
 

aubelix

XLDnaute Impliqué
Re : Réduire le temps d'éxécution de la macro

Bonjour à tous les Amis du Forum.

Désolé de vous relancer, mais le temps d'éxécution sur mon fichier
est beaucoup trop lent plus de 35 mn avec la quantité de Datas...
Pourriez-vous SVP essayer de trouver une solution à mon problème.
Même si vous remanier complètement le code.
Vous me sauverez la mise. C'est un fichier que j'utilise à longueur de
journée et qui me fait perdre beaucoup de temps.

Par avance Merci pour votre aide.
Cordialement.
 

GeoTrouvePas

XLDnaute Impliqué
Re : Réduire le temps d'éxécution de la macro

Re,

Je n'ai pas eu le temps d'y regarder très en profondeur hier. Je vais essayer de regarder ça de plus près ce matin.
Quelques commentaires supplémentaires dans le code auraient été toutefois été très utiles pour comprendre ta démarche.
 

GeoTrouvePas

XLDnaute Impliqué
Re : Réduire le temps d'éxécution de la macro

Alors déjà dans cette boucle :
Code:
        For i = 2 To UBound(V)
            With .Cells(i).Interior
                If IsDate(V(i, 1)) Then
                    Select Case V(i, 1)
                    Case Is > D + 10: V(i, 2) = "J" : .Color = vbGreen
                    Case Is > D + 3: V(i, 2) = "K" : .Color = 49407
                    Case Is >= D: V(i, 2) = "L" : .Color = vbRed
                    Case Is < D: V(i, 2) = "x" : .Color = vbRed
                    End Select
                Else
                    Select Case V(i, 1)
                    Case "SANS LIMITE VAL": V(i, 2) = "n" : .Color = &HE0E0E0
                    Case Else: V(i, 2) = ""
                    End Select
                End If
            End With
        Debug.Print i
        Next

Il suffit de ne pas exécuter les changements de couleur pour que le code s'exécute à une vitesse bien plus raisonnable. Ne pourrais tu pas utiliser une MFC plutôt ?

Ensuite dans cette boucle :

Code:
For Each c In Range("L10").Resize(Rows.Count - 10, 1)
        If c.Borders(xlEdgeBottom).LineStyle <> xlNone Then c.Offset(, 1) = IIf(CStr(c) <> "", "ü", "û")

    Next c

Tu as du oublier un élément car elle paluche un million de lignes (-10) à cause du Rows.Count

Voilà quelques éléments qui devraient te permette d'améliorer ton code.
Tiens nous au courant.
 

aubelix

XLDnaute Impliqué
Re : Réduire le temps d'éxécution de la macro

Bonjour GeoTrouvePas et tous les Amis du Forum.
Merci pour ta réponse et pour ton aide.
J'ai testé ta macro, mais la durée n'a pas changé.
J'ai testé en masquant des lignes sans data, l'exécution est plus rapide.
Tu as raison elle doit mouliner dans le vide.
Une MEFC, je suis preneur si tu as la syntaxe.
Merci pour ton aide.
Cordialement.
 

klin89

XLDnaute Accro
Re : [RÉSOLU] Réduire le temps d'éxécution de la macro

Bonjours à tous,
Bonjour aubelix, GeoTrouvePas

Dans ton cas, pourquoi ne pas faire appel à la méthode SpecialCells de l'objet Range ?
Tu supprimerais un test.
Tu t'appuies sur ta colonne D pour définir 2 "ranges" et tu boucles successivement sur :
'Exemple :
range("D10:D100").SpecialCells(xlCellTypeConstants,xlnumbers)
range("D10:D100").SpecialCells(xlCellTypeConstants,xltextvalues)
Peut-être un peu plus rapide, à voir :p
Exemple pour la mise en forme de la colonnne K :
VB:
Sub Colorier()
'Colore la colonne K selon tes critères
Dim cell As Range
On Error Resume Next
Range("K10:K800").SpecialCells(xlCellTypeFormulas).Interior.ColorIndex = xlColorIndexNone
With Range("D10:D800")
  For Each cell In .SpecialCells(xlCellTypeConstants, xlNumbers)
    Select Case cell
      Case Is > Range("A1").Value + 10
        cell.Offset(0, 7).Interior.Color = vbGreen
      Case Is > Range("A1").Value + 3
        cell.Offset(0, 7).Interior.Color = 49407
      Case Else
        cell.Offset(0, 7).Interior.Color = vbRed
    End Select
  Next cell
End With
On Error GoTo 0
End Sub
Klin89
 
Dernière édition:

Herdet

Nous a quitté
Repose en paix
Re : [RÉSOLU] Réduire le temps d'éxécution de la macro

Bonsoir aubelix !
Pourquoi faire ce coloriage en code VBA ?

En pièce jointe, une solution avec un format conditionnel multiple sur les cellules de "Nb_jours_restants" ou plus de lignes.

A+
Robert
 

Pièces jointes

  • Coloration.jpg
    Coloration.jpg
    40.4 KB · Affichages: 84

Herdet

Nous a quitté
Repose en paix
Re : [RÉSOLU] Réduire le temps d'éxécution de la macro

Bonjour aubelix !
La nuit porte conseil !

Le problème vient de la ligne
If c.Borders(xlEdgeBottom).LineStyle <> xlNone Then c.Offset(, 1) = IIf(CStr(c) <> "", "ü", "û")
dans laquelle Excel interprète mal l'écriture des caractères spéciaux "ü" et "û"
Le plus simple et rapide est d'utiliser des formules Excel avec les codes 251 et 252 puis de coller les valeurs

Voici ci-jointe une solution globale par plages de cellules sans boucle For Next qui passe le temps d'éxécution de 20 minutes à 3 secondes.
J'ai juste ajouté 4 noms définis par T_XXX voir feuille "Noms définis"

Cordialement
Robert
 

Pièces jointes

  • RD-COLORATION_DONNEES.xlsm
    240.2 KB · Affichages: 79

Discussions similaires

Réponses
15
Affichages
836

Statistiques des forums

Discussions
312 158
Messages
2 085 831
Membres
102 997
dernier inscrit
sedpo