Pb macros entre doublon et couleur cellule

Bonjour à tous,

J'ai un souci avec mes 2 macros, indépendamment elles fonctionnent mais pas ensemble...

Lors d'essais séparés des macros, pour la gestion:

- Des doublons, elle ne fonctionne qu'une seule 1 fois, lorsque je refais volontairement un autre doublon, la macro le laisse passer.

- Des couleurs, elle ne fonctionne qu'à moitié, si je mets une valeur dans les colonnes P, Q, R et que je sélectionne une autre cellule dans une colonne autre que ces 3 là, la cellule ne change pas de couleur, mais change si je sélectionne une cellule dans une de ces 3 colonnes!

Autre problème à venir peut-être, si j'insère une ligne est-ce que les macros fonctionneront toujours?

Ci-joint un fichier pour exemple.

Si quelqu'un avait une idée pour m'aider...

B.A.

8exemple.xlsm (33.02 Ko)

Bonjour BlackAdder, bonjour le forum,

Pour moi, les deux macros doivent réagir au même événement : Change. Essaie comme ça et supprime le module 1 :

Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
If Target.Column = 6 Then 'condition 1 : si la colonne de la cellule modifiée est dans la colonne F (=6)
    If Application.CountIf(Range("F:F"), Target) > 1 Then 'condition 2 : si la valeur de la cellule modifiée apparaît plus d'une seule fois dans le colonne F
        Application.EnableEvents = False 'empêche les événementielles
        Set R = Columns(6).Find(Target.Value, Range("F1"), xlValues, xlWhole) 'définit la recherche R
        MsgBox "Ce numéro existe déjà ! Voir la ligne N° : " & R.Row 'message
        Target.ClearContents 'efface le contenu de la cellule modifiée
        Target.Select 'sélectionne la cellule
        Application.EnableEvents = True 'autorise les événementielles
    End If 'fin de la condition 2
    Exit Sub 'sort de la procédure
End If 'fin de la condition 1

If Application.Intersect(Target, Range("P:R")) Is Nothing Then Exit Sub 'si la cellule modifiée ne se trouve pas dans les colonne P, Q ou R, sort de la procédure
    Select Case Target.Column 'agit en fonction de la colonne
        Case 16 'colonne P
            IC = RGB(255, 199, 206) 'définit la couleur du fond
            FC = RGB(156, 0, 6) 'définit la couleur de la police
        Case 17 'colonne Q
            IC = RGB(255, 192, 0) 'définit la couleur du fond
            FC = RGB(255, 255, 156) 'définit la couleur de la police
        Case 18 'colonne R
            IC = RGB(255, 255, 156) 'définit la couleur du fond
            FC = RGB(255, 192, 0) 'définit la couleur de la police
    End Select 'fin de l'action en fonction de la colonne
    If Target.Value >= 1 Then 'condition : si la valeur de la cellule est supérieure ou égale à 1
        Target.Interior.Color = IC 'couleur du fond
        Target.Font.Color = FC 'couleur de la polie
    Else 'sinon
        Target.Interior.Color = xlNone 'couleur du fond
        Target.Font.Color = RGB(0, 0, 0) 'couleur de la polie
    End If 'fin de la condition
End Sub

Bonjour Thauthème et le forum,

Merci d'avoir pris en charge ma demande, la macro proposée fonctionne mais il reste un petit problème:

- Lorsque j'insère une ligne

ou

- Quand je sélectionne une plage de P3 à R1000 (par exemple) pour effacer les valeurs

La macro plante et une fenêtre apparait avec "Erreur d'exécution '13': Incompatibilité de type" et cette ligne ressort en jaune lors du Débogage:

image

Merci d'avance pour ton aide.

B.A.

Re,

Le code modifié :

Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
Dim CEL As Range 'déclare la variable CEL
If Target.Column = 6 Then 'condition 1 : si la colonne de la cellule modifiée est dans la colonne F (=6)
    If Application.CountIf(Range("F:F"), Target) > 1 Then 'condition 2 : si la valeur de la cellule modifiée apparaît plus d'une seule fois dans le colonne F
        Application.EnableEvents = False 'empêche les événementielles
        Set R = Columns(6).Find(Target.Value, Range("F1"), xlValues, xlWhole) 'définit la recherche R
        MsgBox "Ce numéro existe déjà ! Voir la ligne N° : " & R.Row 'message
        Target.ClearContents 'efface le contenu de la cellule modifiée
        Target.Select 'sélectionne la cellule
        Application.EnableEvents = True 'autorise les événementielles
    End If 'fin de la condition 2
    Exit Sub 'sort de la procédure
End If 'fin de la condition 1

If Application.Intersect(Target, Range("P:R")) Is Nothing Then Exit Sub 'si la cellule modifiée ne se trouve pas dans les colonne P, Q ou R, sort de la procédure
    For Each CEL In Target 'bouce sur toutes les cellules de la plage sélectionnée dans les colonnes P à R
        Select Case CEL.Column 'agit en fonction de la colonne de la cellule
            Case 16 'colonne P
                IC = RGB(255, 199, 206) 'définit la couleur du fond
                FC = RGB(156, 0, 6) 'définit la couleur de la police
            Case 17 'colonne Q
                IC = RGB(255, 192, 0) 'définit la couleur du fond
                FC = RGB(255, 255, 156) 'définit la couleur de la police
            Case 18 'colonne R
                IC = RGB(255, 255, 156) 'définit la couleur du fond
                FC = RGB(255, 192, 0) 'définit la couleur de la police
        End Select 'fin de l'action en fonction de la colonne
        If CEL.Value >= 1 Then 'condition : si la valeur de la cellule est supérieure ou égale à 1
            CEL.Interior.Color = IC 'couleur du fond
            CEL.Font.Color = FC 'couleur de la polie
        Else 'sinon
            CEL.Interior.Color = xlNone 'couleur du fond
            CEL.Font.Color = RGB(0, 0, 0) 'couleur de la polie
        End If 'fin de la condition
    Next CEL 'prochaine cellule de la plage
End Sub

Re bonjour ThauThème,

J'ai toujours le même problème, la macro plante et une fenêtre apparait avec "Erreur d'exécution '13': Incompatibilité de type" et cette ligne ressort en jaune lors du Débogage, lors de l'insertion d'une ligne et pour l'effaçage d'une plage de P3 à Rxxx, les valeurs disparaissent après avoir cliquer sur débogage, mais il reste la couleur...

image

Merci d'avance pour ton aide.

Bonjour BlackAdder, bonjour le forum,

Je ne comprends pas dans la nouvelle macro cette ligne n'existe plus. La variable CEL a remplacé Target. La ligne est devenue :

If CEL.Value >= 1 Then 'condition : si la valeur de la cellule est supérieure ou égale à 1

Chez moi ça marche correctement et je ne comprends pas pourquoi tu me montres cette ligne qui bugue si tu as utilisé la dernière macro que je t'ai proposée...

Bonjour Thauthème et le forum,

Je suis désolé mais c'est moi qui est dû faire une mauvaise manip, car au final ça marche vraiment super bien!!!

Pourrais-je solliciter encore une fois ton aide pour un autre tableau ayant à peu près la même structure, pourrais-tu me m'indiquer ce qu'il faudrait modifier sachant que la partie doublon est à conserver et les modifications ne se font dans les colonnes P, Q, R avec des valeurs uniques:

Si dans la colonne P, il y a que la valeur 1 alors
RGB(255, 199, 206) 'définit la couleur du fond
RGB(156, 0, 6) 'définit la couleur de la police

Si dans la colonne Q, il y a que la valeur 2 alors
RGB(255, 192, 0) 'définit la couleur du fond
RGB(255, 255, 156) 'définit la couleur de la police

Si Si dans la colonne R, il y a que la valeur 3 alors
RGB(255, 255, 156) 'définit la couleur du fond
RGB(255, 192, 0) 'définit la couleur de la police

Et bien évidemment :

Si P, Q, R est vide alors
Target.Interior.Color = xlNone 'couleur du fond
Target.Font.Color = RGB(0, 0, 0) 'couleur de la polie

Merci d'avance pour ton aide.

P.S.:
Ce qui vraiment appréciable dans tes macros, ce sont les commentaires que tu rajoutes pour chaque ligne ce qui permet de comprendre bien plus facilement chaque instruction!
B.A.

Bonjour BlackAdder, bonjour le forum,

Je m'applique à commenter mes codes pour permettre à l'utilisateur de les comprendre et/ou de les modifier. Ce n'était quand même pas si compliqué me semble-t-il...

Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
Dim CEL As Range 'déclare la variable CEL
Dim IC As Variant 'déclare la variable IC
Dim FC As Variant 'déclare la variable FC

If Target.Column = 6 Then 'condition 1 : si la colonne de la cellule modifiée est dans la colonne F (=6)
    If Application.CountIf(Range("F:F"), Target) > 1 Then 'condition 2 : si la valeur de la cellule modifiée apparaît plus d'une seule fois dans le colonne F
        Application.EnableEvents = False 'empêche les événementielles
        Set R = Columns(6).Find(Target.Value, Range("F1"), xlValues, xlWhole) 'définit la recherche R
        MsgBox "Ce numéro existe déjà ! Voir la ligne N° : " & R.Row 'message
        Target.ClearContents 'efface le contenu de la cellule modifiée
        Target.Select 'sélectionne la cellule
        Application.EnableEvents = True 'autorise les événementielles
    End If 'fin de la condition 2
    Exit Sub 'sort de la procédure
End If 'fin de la condition 1

If Application.Intersect(Target, Range("P:R")) Is Nothing Then Exit Sub 'si la cellule modifiée ne se trouve pas dans les colonne P, Q ou R, sort de la procédure
    For Each CEL In Target 'bouce sur toutes les cellules de la plage sélectionnée dans les colonnes P à R
        Select Case CEL.Column 'agit en fonction de la colonne de la cellule
            Case 16 'colonne P
                If CEL.Value = 1 Then 'condition : si la valeur de la cellule vaut 1
                    IC = RGB(255, 199, 206) 'définit la couleur du fond
                    FC = RGB(156, 0, 6) 'définit la couleur de la police
                Else 'sinon
                    IC = xlNone 'définit la couleur du fond
                    FC = RGB(0, 0, 0) 'définit la couleur de la polie
                End If 'fin de la condition
            Case 17 'colonne Q
                If CEL.Value = 2 Then 'condition : si la valeur de la cellule vaut 2
                    IC = RGB(255, 192, 0) 'définit la couleur du fond
                    FC = RGB(255, 255, 156) 'définit la couleur de la police
                Else 'sinon
                    IC = xlNone 'définit la couleur du fond
                    FC = RGB(0, 0, 0) 'définit la couleur de la polie
                End If 'fin de la condition
            Case 18 'colonne R
                If CEL.Value = 3 Then 'condition : si la valeur de la cellule vaut 3
                    IC = RGB(255, 255, 156) 'définit la couleur du fond
                    FC = RGB(255, 192, 0) 'définit la couleur de la police
                Else 'sinon
                    IC = xlNone 'définit la couleur du fond
                    FC = RGB(0, 0, 0) 'définit la couleur de la polie
                End If 'fin de la condition
        End Select 'fin de l'action en fonction de la colonne
        CEL.Interior.Color = IC 'attribue la couleur de fond IC à la cellule
        CEL.Font.Color = FC 'attribue la couleur de la police FC à la cellule
    Next CEL 'prochaine cellule de la plage
End Sub

Bonjour Thauthème et le forum,

Merci pour ton aide pour la résolution de mon problème et à une prochaine, peut-être...
B.A.

Rechercher des sujets similaires à "macros entre doublon couleur"