Problème de mise en forme condtionnelle

SERIEUXETCOOL

XLDnaute Occasionnel
Bonjour le Forum,

Je me retourne vers vous une nouvelle fois car je bloque sur un petit problème de mise en forme conditionnelle.

Voici la description du problème :

-Dans une première feuille Excel, j'ai une valeur dans la cellule A1. Une valeur décimale. Ici on va la noter "a" pour simplifier le problème.

-Dans une deuxième feuille Excel, j'ai une valeur dans la cellule A1. Une valeur décimale. Ici on va la noter "b" pour simplifier le problème.

-J'aimerais appliquer une mise en forme conditionnelle à la cellule A1 de ma deuxième feuille avec Excel 2007. Mise en forme avec jeux d’icônes, les 3 drapeaux que propose Excel.

-"b" peut être plus grand que "a" tout comme il peut être plus petit que "a".

-J'aimerais aider l'utilisateur dans sa prise de décision et le guider à faire son choix concernant la valeur de "b".

Voici les conditions qui s'appliquent à la cellule A1 de la feuille 2 ("b"):

-Si "a"-2<"b"<"a"+2 alors drapeau Vert
-Si "a"-4<"b"<"a"+4 alors drapeau Orange
-Si "a"-6<"b"<"a"+6 alors drapeau Rouge


Le problème c'est que je ne sais pas comment coder tout sa, et de plus je vois bien qu'il y a un problème d'intervalle car le "drapeau Rouge" englobe à la fois l'intervalle "drapeau Orange et "drapeau Vert"

Je suis perdu pour le coup. La finalité de mon objectif étant grosso-modo, de faire afficher le drapeau Vert si la valeur absolue de la différence entre "a" et "b" est inférieur à 2, drapeau Orange si la valeur absolue de la différence comprise entre 2 et 4, puis drapeau Rouge si la valeur absolue de la différence supérieur à 4.


Si vous avez des idées, des conseils je suis preneur.

Bien cordialement,

André qui se casse la tête lol


PS : Je désire programmer la mise en forme conditionnelle sous VBA (Macro Excel). De plus, j'ai bien compris que pour faire appel à une valeur qui se trouve sur une autre feuille il faut nommer la plage. Du coup on peut dire que la cellule A1 de la feuille 1 est une plage nommée "MaPlage"
 

Pierrot93

XLDnaute Barbatruc
Re : Problème de mise en forme condtionnelle

Bonjour André, Jean-Claude:)

pas tout suivi... mais petite info, avec l'événement "Workbook_SheetChange" le 1er argument "Sh" représente la feuille sur laquelle la modif est faite, "target" représente toujours la ou les cellules... il me semble qu'il y a lieu de tester le nom de la feuille au préalable, exemple ci-dessous, si cela peut te faire avancer...
Code:
Option Explicit
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.Name = "Feuil2" Then
    If Target.Address = "$A$1" Then Macro1
End If
If Sh.Name = "Feuil1" Then
    If Target.Address = "$C$4" Then Macro2
End If
End Sub

bonne journée
@+
 

JCGL

XLDnaute Barbatruc
Re : Problème de mise en forme condtionnelle

Bonjour à tous,
Salut Pierrot :),

André : tu comprends maintenant pourquoi nous souhaitions un fichier... Nous aurions vu ton code et la présence d'une seule feuille à l'ouverture.

A+ à tous
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Problème de mise en forme condtionnelle

Merci Pierrot93, c'est exactement l'info que je recherchais.

Avec cette aide j'ai pu faire ce que je voulais.

Je post ici le code le plus actualisé ( à placer dans un "WorkBook" et non un "module") :

Code:
Option Explicit

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

If Sh.Name = "Feuil1" And Target.Address = "$A$1" Then

        Cells.FormatConditions.Delete 'Supprime les mises en formes conditionnelles
        Sheets("Feuil1").Select 'Une nouvelle plage
        Range("A1").Select
        ActiveWorkbook.Names.Add Name:="Plage1", RefersToR1C1:="=Feuil1!R1C1"

        Sheets("Feuil2").Select 'Mise en forme conditionnelle
        Range("A1").Select
        Selection.FormatConditions.AddIconSetCondition
        Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
        With Selection.FormatConditions(1)
            .ReverseOrder = True
            .ShowIconOnly = False
            .IconSet = ActiveWorkbook.IconSets(xl3Flags)
        End With

        If Abs(Sheets("Feuil1").Range("A1") - Sheets("Feuil2").Range("A1")) <= 2 Then
        With Selection.FormatConditions(1).IconCriteria(2)
            .Type = xlConditionValueFormula
            .Value = "=Plage1+2"
            .Operator = 5
        End With
        End If

        If Abs(Sheets("Feuil1").Range("A1") - Sheets("Feuil2").Range("A1")) <= 4 Then
        With Selection.FormatConditions(1).IconCriteria(3)
            .Type = xlConditionValueFormula
            .Value = "=Plage1+4"
            .Operator = 5
        End With
        End If

        Range("A1").Select 'Pour se positionner proprement

        MsgBox "Vous venez de modifier la cellule " & Target.Address & " d'une valeur de " & Target.Value & " de la feuille " & Sh.Name

End If


If Sh.Name = "Feuil2" And Target.Address = "$A$1" Then

        Cells.FormatConditions.Delete 'Supprime les mises en formes conditionnelles
        Sheets("Feuil1").Select 'Une nouvelle plage
        Range("A1").Select
        ActiveWorkbook.Names.Add Name:="Plage1", RefersToR1C1:="=Feuil1!R1C1"

        Sheets("Feuil2").Select 'Mise en forme conditionnelle
        Range("A1").Select
        Selection.FormatConditions.AddIconSetCondition
        Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
        With Selection.FormatConditions(1)
            .ReverseOrder = True
            .ShowIconOnly = False
            .IconSet = ActiveWorkbook.IconSets(xl3Flags)
        End With

        If Abs(Sheets("Feuil1").Range("A1") - Sheets("Feuil2").Range("A1")) <= 2 Then
        With Selection.FormatConditions(1).IconCriteria(2)
            .Type = xlConditionValueFormula
            .Value = "=Plage1+2"
            .Operator = 5
        End With
        End If

        If Abs(Sheets("Feuil1").Range("A1") - Sheets("Feuil2").Range("A1")) <= 4 Then
        With Selection.FormatConditions(1).IconCriteria(3)
            .Type = xlConditionValueFormula
            .Value = "=Plage1+4"
            .Operator = 5
        End With
        End If

        Range("A1").Select 'Pour se positionner proprement

        MsgBox "Vous venez de modifier la cellule " & Target.Address & " d'une valeur de " & Target.Value & " de la feuille " & Sh.Name

End If

End Sub

Il ne reste plus qu'un problème que je vois à l'heure actuelle : Si je ne rentre pas un nombre dans ma cellule A1 de ma feuille 1 ou 2, alors sa me génère une erreur avec l'événement "WorkBook_Change". En effet je ne peux pas comparer une lettre à un nombre.

Question : Comment faire en sorte que l’évènement ne se déclenche que si le contenu de ma cellule A1 de ma feuille 1 ET A1 de ma feuille 2 sont des nombres au bon formats ? (avec une virgule et pas un point pour les nombres décimaux)

Merci pour ces dernières précisions. Mon code sera alors optimisé je pense.

Bien cordialement,

André

Ps : Je post mon fichier Excel qui contient ce code pour ceux qui attendent un fichier Excel ;)
DRAPEAU est un fichier Excel 2003 ne prenant pas en compte le jeux d'icônes, et DRAPEAU1 est un fichier Excel 2007 qui contient tout
 

Pièces jointes

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Problème de mise en forme condtionnelle

Me revoilà.

Ayé mon problème est résolu à 100%. Merci à toi Pierrot93 pour ton aide. C'est encore une fois l'info qu'il me manquait^^

Le code a été testé et il fonctionne bien. A noter que j'ai particulièrement modifié le code pour le rendre plus souple et plus simple d'utilisation.
J'ai divisé le nombre de lignes par 2, mis les paramètres essentiels en variables pour éviter de devoir chercher dans le code la ou il faut changer les valeurs.

Du coup c'est que du bonheur et sa marche !

Je poste ci-après la version définitive du code :

Code:
Option Explicit

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

Dim F1 As String, F2 As String, L1 As String, L2 As String 'Définitions des variables
Dim C1 As Integer, C2 As Integer
Dim V1 As Long, V2 As Long

F1 = Worksheets("Feuil1").Name 'Nom de la première feuille
F2 = Worksheets("Feuil2").Name 'Nom de la deuxième feuille
L1 = "A" 'Cellule de la première feuille
C1 = 1 'Cellule de la première feuille
L2 = "A" 'Cellule de la deuxième feuille
C2 = 1 'Cellule de la deuxième feuille
V1 = 2 'Premier intervalle pour le jeu d'icônes
V2 = 4 'Deuxième intervalle pour le jeu d'icônes

If IsNumeric(Target.Value) Then

    If (Sh.Name = F1 And Target.Address = "$" & L1 & "$" & C1) Or (Sh.Name = F2 And Target.Address = "$" & L2 & "$" & C2) Then

            Cells.FormatConditions.Delete 'Supprime les mises en formes conditionnelles
            Sheets(F1).Select 'Nomme une nouvelle plage
            Range("" & L1 & "" & C1).Select
            ActiveWorkbook.Names.Add Name:="Plage1", RefersToR1C1:=ActiveCell

            Sheets(F2).Select 'Mise en forme conditionnelle
            Range("" & L2 & "" & C2).Select
            Selection.FormatConditions.AddIconSetCondition
            Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
            With Selection.FormatConditions(1)
                .ReverseOrder = True
                .ShowIconOnly = False
                .IconSet = ActiveWorkbook.IconSets(xl3Flags)
            End With

            If Abs(Sheets(F1).Range("" & L1 & "" & C1) - Sheets(F2).Range("" & L2 & "" & C2)) <= 2 Then
            With Selection.FormatConditions(1).IconCriteria(2)
                .Type = xlConditionValueFormula
                .Value = "=Plage1+" & V1
                .Operator = 5
            End With
            End If

            If Abs(Sheets(F1).Range("" & L1 & "" & C1) - Sheets(F2).Range("" & L2 & "" & C2)) <= 4 Then
            With Selection.FormatConditions(1).IconCriteria(3)
                .Type = xlConditionValueFormula
                .Value = "=Plage1+" & V2
                .Operator = 5
            End With
            End If

            Range("" & L2 & "" & C2).Select 'Pour se positionner proprement

            MsgBox "Vous venez de modifier la cellule " & Target.Address & " d'une valeur de " & Target.Value & " de la feuille " & Sh.Name

    End If
End If

End Sub

Voila, 2 jours pour régler mon problème de drapeaux, mais je suis fière d'avoir pondu ce code avec un peu d'aide je dois l'admettre. Merci à ceux qui m'ont conseillé. C'est sympa de votre part.

Bien cordialement,

André qui a finit de se casser la tête^^

Ps : Je dépose en pièce jointe le fichier Excel qui contient le code. Je ne mets pas la version 2003 car la mise en forme conditionnelle ne prends pas en charge le jeu d'icônes.
 

Pièces jointes

Discussions similaires

Réponses
5
Affichages
155
Réponses
2
Affichages
72
Réponses
3
Affichages
295
Réponses
4
Affichages
227
Réponses
19
Affichages
936

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
315 283
Messages
2 118 012
Membres
113 408
dernier inscrit
lausablk