Optimisation de boucles (2)
(Re)Bonjour le forum,
J'ai 3 boucles qui parcourent plusieurs colonnes pour chacune de mes lignes de données. Le souci est qu'à chaque modification de valeurs dans ma plage, cela parcourt tout à chaque fois...
Je mets en fond ROUGE toutes les cellules contenant des valeurs rentrées à la main.
Ne serait-il pas possible de se focaliser uniquement sur la cellule modifiée et de mettre en forme uniquement celle-ci plutot que de tout parcourir à chaque fois ?
Si vous avez des pistes d'améliorations, je suis preneur... Voici mon code (s'éxecutant sur Worksheet_Change) :
'******************************************************************************************
' Bout de code permettant de mettre en rouge les cellules (parties CA / Heures / Achats)
'******************************************************************************************
If Not (Intersect(Range("CC6:CO" & nb_aff), Target) Is Nothing) Then
With f
Dim a As Integer
For Each Cell7 In Range("B6:B" & nb_aff)
' Si c'est une PDC (> 4 caractères) ET que % = 100 ou 99
If Len(Cell7.Value) > 4 And Cell7.Offset(, 22).Value = "100" Or Cell7.Offset(, 22).Value = "99" Then
For a = 79 To 90 'colonnes CA (vert)
If lire(Cell7.Offset(, a)) = False Then
Cell7.Offset(, a).Interior.ColorIndex = 3 'rouge
End If
Next
End If
Next
End With
End If
If Not (Intersect(Range("DS6:ED" & nb_aff), Target) Is Nothing) Then
With f
Dim b As Integer
For Each Cell7 In Range("B6:B" & nb_aff)
' Si c'est une PDC (> 4 caractères) ET que % = 100 ou 99
If Len(Cell7.Value) > 4 And Cell7.Offset(, 22).Value = "100" Or Cell7.Offset(, 22).Value = "99" Then
For b = 121 To 132 'colonnes Heures (orange)
If lire(Cell7.Offset(, b)) = False Then
Cell7.Offset(, b).Interior.ColorIndex = 3 'rouge
End If
Next
End If
Next
End With
End If
If Not (Intersect(Range("FI6:FT" & nb_aff), Target) Is Nothing) Then
With f
Dim c As Integer
For Each Cell7 In Range("B6:B" & nb_aff)
' Si c'est une PDC (> 4 caractères) ET que % = 100 ou 99
If Len(Cell7.Value) > 4 And Cell7.Offset(, 22).Value = "100" Or Cell7.Offset(, 22).Value = "99" Then
For c = 163 To 174 'colonnes Achats (violet)
If lire(Cell7.Offset(, c)) = False Then
Cell7.Offset(, c).Interior.ColorIndex = 3 'rouge
End If
Next
End If
Next
End With
End IfSalut Excellium,
Si c'est uniquement la cellule que tu viens de modifier que tu veux tester, il suffit de remplacer tes boucles For (qui checkent toute ta plage) par ta target (qui est la cellule modifiée), ça donne quelque chose comme ça (exemple sur ta première boucle) :
' Si c'est une PDC (> 4 caractères) ET que % = 100 ou 99
If Len(Target.Value) > 4 And Target.Offset(, 22).Value = "100" Or Target.Offset(, 22).Value = "99" Then
For a = 79 To 90 'colonnes CA (vert)
If lire(Target.Offset(, a)) = False Then
Target.Offset(, a).Interior.ColorIndex = 3 'rouge
End If
Next
End IfSalut Gaz0line,
Je vais essayer ta solution. Et je reviens vers toi. Merci !
Re,
Ton code ne marche pas. Erreur Incompatibilité de type...
Re !
Sans fichier excel de ta part c'est compliqué de tester. J'ai remplacé vite fait de tête, mais si tu peux mettre un fichier à dispo, ça sera plus facile de voir ton code dans son ensemble.
En tous cas, si tu ne peux pas uploader de fichier pour x raison, le principe est là : il faut que tu fasse déclencher ta macro en Private Sub Worksheet_Change(ByVal Target As Range) (si ce n'est pas déjà le cas) et que, au lieu de faire un "For each cell7", tu utilises la target qui a déclenché la macro, ainsi tu ne checkeras que la cellule "déclencheuse" et pas toute ta plage.
Autre idée pour optimiser ton temps de macro (qui n'a rien à voir avec ce sujet mais tu cherches depuis hier à gagner du temps donc ---> astuce), c'est de bloquer la mise à jour de l'écran :
En temps normal, à chaque action de la macro, l'écran se raffraichit et montre l'action.
Avec la fonction "ScreenUpdating", tu as la possibilité de bloquer le raffraichissement de l'écran, ce qui fait gagner un temps non négligeable à la macro.
Place Application.ScreenUpdating = False en début de macro, et Application.ScreenUpdating = True en fin de macro.
Bonjour Gaz0line,
Merci beaucoup pour l'aide que tu m'apportes. Je ne peux pas uploader de fichier car il dépasse la taille autorisée (meme en étant "vierge")...
Pour la mise à jour de l'écran, je l'utilise déja.
Pour le Target, je suis pas à l'aise avec. Je vais chercher de mon coté encore.
A +
Excellium