For Each

Bonjour,

j'utilise un For Each dans un range de manière assez massif. Or le For Each a tendance à ralentir gravement le code. Une solution pour rendre cela plus rapide?

Function CompteCouleurCP(champ As Range)

    Call Acceleration

   Application.Volatile

   Dim c, temp
   temp = 0
   For Each c In champ
     If c.Font.ColorIndex = 3 And c.Value = "CP" Then
       temp = temp + 1
     End If
        If c.Font.ColorIndex = 3 And c.Value = "0,5 CP" Then
       temp = temp + 0.5
     End If
   Next c
   CompteCouleurCP = temp

   Call Deceleration
End Function

Le but est de récupérer la couleur et la valeur de chaque cellule du range dans une une nouvelle formule volatile

Si quelqu'un à une idée pour accélérer tout ca!

Hello,

Si tu peux éviter les for .. each car excel va parcourir toutes les cellules de ta range le pauvre!! il va galérer.

Essaye de bien définir la zone à traiter dans ta boucle.

Tu peux faire for i=1 to dernligne par exemple plus rapide.

Voila

Le problème c'est que c'est une fonction que j'utilise du coup je ne peux pas je crois pour récupérer la couleur

Je suis pas un expert des function, je veux pas dire de bêtises et un membre expert dans le domaine va sans doute nous éclairer, mais j'ai cherché un code pour une fonction qui check les couleurs des cellules.

Le gars utilise ça sur ce site.

http://www.cpearson.com/Excel/CFColors.htm

Function ActiveCondition(Rng As Range) As Integer
Dim Ndx As Long
Dim FC As FormatCondition
Dim Temp As Variant
Dim Temp2 As Variant

If Rng.FormatConditions.Count = 0 Then
    ActiveCondition = 0
Else
    For Ndx = 1 To Rng.FormatConditions.Count
        Set FC = Rng.FormatConditions(Ndx)

Bonjour,

Or le For Each a tendance à ralentir gravement le code.

S'il y a lenteur, je ne pense pas que cela vienne de là ! Microsoft ne ferait pas la promotion de cette boucle comme moyen d'accélération du code.

Je cite :

L'utilisation de la boucle For Each... Next pour itérer dans une collection ou un tableau est plus rapide que le recours à une boucle indexée.

Pour ce qui est du code, en l'écrivant correctement, cela améliorerait certainement l'exécution :

  • déclaration des variables en début de procédure,
  • les variables typées sont plus rapides que les variables non typées (Variant),
  • 2 instructions conditionnelles là ou une suffit, cela fait deux fois plus de temps,
  • et elle pourrait être structurée autrement : test couleur, si couleur on teste valeur, sinon on poursuit (cela diminue le nombre de tests),
  • sauf erreur la couleur cherchée est rouge, tu peux donc tester sur la propriété Color en utilisant la constante VBA vbRed (toujours un iota de gagné).

Mais surtout, il y a deux appels de procédures en début de fonction et en fin : Acceleration et Deceleration dont on ne connaît pas le contenu (donc l'impact sur l'exécution), et dont on se demande par ailleurs ce que ces procédures (non utilisées dans le calcul) viennent faire dans une procédure Function.

Et s'agissant de lenteur le diagnostic n'est jamais complet sans passer au peigne fin la façon dont est constitué le classeur...

Cordialement.

Accélération et Décélération sont juste des screenupdating et calcul auto mis à l'arrêt mais ne change rien.

Je passe déja par

Public Ndx as Integer
Function CompteRTT(Plage As Range)

Application.Volatile

'Dim Ndx As Integer

    For Ndx = 1 To Plage.Count
        If Plage(Ndx).Font.ColorIndex = 1 Then
                If Plage(Ndx).Value = "RTT" Then
                    CompteRTT = CompteRTT + 1
                End If
                If Plage(Ndx).Value = "0.5 RTT" Then
                    CompteRTT = CompteRTT + 0.5
                End If
        End If
    Next

End Function
Function CompteRecup(Plage As Range)

Application.Volatile

'Dim Ndx As Integer

    For Ndx = 1 To Plage.Count
        If Plage(Ndx).Font.ColorIndex = 1 Then
                If Plage(Ndx).Value = "recup" Then
                    CompteRecup = CompteRecup + 1
                End If
                If Plage(Ndx).Value = "0.5 recup" Then
                    CompteRecup = CompteRecup + 0.5
                End If
        End If
    Next

End Function

Ca me fait déja gagné 50% de temps mais toujours un peu d'attente 1s/1s.5. En effet j'applique un ensemble de formule de ce style dans 300cellulesenviron mais qui peut vite augmenter à plus de 1000.

La question que je me suis posé est puis-je renvoyer des valeurs différentes dans un ensemble de cellules à partir d'une fonction ou suis-je cantonné à une seule cellule?

Merci en tout cas des réponses, le code est déja plus rapide.

Ou si toujours d'autres astuces pour accélérer^^


Alors vu que toutes les cellules sont en font rouges par défauts, j'ai comparé d'abord le contenu ce qui rend le travail plus rapide et presque instantané. Mais si d'autres solutions je suis preneur!

Rechercher des sujets similaires à "each"