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 FunctionLe 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 FunctionCa 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!