Simplification de macro avec TARGET
Bonjour le forum,
J'aimerais vraiment pouvoir simplifier ma macro avec (je pense) l'utilisation de TARGET.
Pour résumer le problème, dès qu'une valeur est rentrée à la main dans mes plages de cellules, je veux que le fond de cette cellule se mette en rouge. Et dans mon cas, dès qu'il y a ce changement, je parcours toute la plage de données à chaque fois. J'aimerais pouvoir cibler uniquement la cellule modifiée afin de mettre en rouge uniquement celle-ci.
Je n'arrive toujours pas à adapter ma boucle avec TARGET afin de mettre en forme que la cellule changée au lieu de parcourir toute la boucle à chaque fois. Voici mon code :
'******************************************************************************************
' 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 car) 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 car) 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 car) 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 IfComme vous pouvez le voir, dès qu'une modification se fait dans la plage de données :
- je regarde pour chaque cellule de la colonne B s'il y a plus de 4 caractères
- je regarde si le % (22ème colonne plus loin) = 100 ou 99
Si c'est vérifié, je regarde (avec la fonction LIRE) si la cellule contient une formule ou pas : si c'est une valeur rentrée à la main, cela s'affiche en rouge.
J'espère etre clair dans ma demande... Merci d'avance pour votre aide précieuse.
Bonjour,
une proposition théorique :
Private Sub Worksheet_Change(ByVal Target As Range) 'macro qui s'active sur changement de valeur d'une cellule
If Not Application.Intersect(Target, Cells) Is Nothing Then 'remplacer "cells" par la plage de donnée intéresser
if lire(target) = false then 'vérifie si la case modifier n'est pas une formule
target.interiro.color = 3 'rouge
end if
End If
End SubBonjour minanse,
Merci pour la réponse, mais j'ai déja essayé de mettre target comme cela, mais sans succès. Car j'ai un test à faire sur la colonne B avant de pouvoir mettre en rouge les cellules dans ma plage de données :
'******************************************************************************************
' 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) 'cest dans cette colonne que je vérifie un certain nombre de chose
' Si c'est une PDC (> 4 car) ET que % = 100 ou 99
If Len(Cell7.Value) > 4 And Cell7.Offset(, 22).Value = "100" Or Cell7.Offset(, 22).Value = "99" Then 'conditions
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 Ifmet le teste dans le code
C'est ce que j'ai fait
Voilà ce à quoi j'ai abouti mais sans succès...
If Not (Intersect(Range("CC6:CO" & nb_aff), Target) Is Nothing) Then
With f
Dim a As Integer
' Si c'est une PDC (> 4 car) ET que % = 100 ou 99
If lire(Target) = False And Len(Target.Offset(, -54).Value) > 4 And Target.Offset(, -32).Value = "100" Or Target.Offset(, -32).Value = "99" Then
Target.Interior.ColorIndex = 3 'rouge
End If
End With
End Ifj'ai peut être trouver l'erreur
dans
If lire(Target) = False And Len(Target.Offset(, -54).Value) > 4 And Target.Offset(, -32).Value = "100" Or Target.Offset(, -32).Value = "99" des "and" et " OR" en même temps sans parenthèse excel n'est pas fan ^^
exemple :
if range("A1") = 1 and range("B1") = 1 OR range("C1") = 1 c'est différent de
if range("A1") = 1 and (range("B1") = 1 OR range("C1") = 1) Ca ne vient pas de là... Quand je mets un message, y a rien. C'est là mon souci. Target.Offset c'est OK ?
Msgbox (Len(Target.Offset(, -54).Value))il n'affiche rien parce que il ne rentre pas dans la boucle ou il n'affiche rien sur cette ligne ?
parce que je vois pas de problème avec la syntaxe de offset
à quoi sert le
with f enfaite ^^
Il n'affiche rien sur cette ligne (avant la boucle). Idem pour Offset de -32...
Il faut que je teste le nombre de caractères de la cellule en colonne B, puis que je teste le % de la cellule en colonne X : tout cela à partir de la colonne CC jusqu'à CO (plage de données)
f correspond à ma feuille de données.
du coup la ligne "with f" ne sert a rien vu que le code est exécuté dans la feuille f non ?
J'ai vu quelque part qu'en mettant cela, ca optimisait (d'un poil) la macro. Donc je le mets et ca ne m'a jamais posé de souci
teste avec
Application.Intersect C'est ce que j'utilise pourtant. Voici une solution qui met à jour uniquement la cellule modifiée (sans parcourir à chaque fois toute la plage de données)
'Si on ne modifie pas la plage de cellules CC6:CN(nbaffaires) alors on fait rien, sinon traitement
If Not (Intersect(Range("CC6:CN" & nb_aff), Target) Is Nothing) Then
' Partie CA
With f
i = Target.Row
j = Target.Column
If lire(Target) = True And Not Cells(i, j).Interior.Color = xlNone And Not Cells(i, j).Interior.ColorIndex = 3 Then ' Si cest une formule (que ce n'est pas rentré à la main) : on met en vert
Cells(i, j).Interior.Color = RGB(135, 233, 144) 'vert
ElseIf Cells(i, j).Interior.ColorIndex <> 3 Then ' Si pas rouge
Cells(i, j).Interior.ColorIndex = xlNone
End If
End With
End If