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 If

Comme 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 Sub

Bonjour 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 If

met 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 If

j'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
Rechercher des sujets similaires à "simplification macro target"