Microsoft 365 Identifier ligne par ligne les différents chiffres par une couleur précise

Piaf79

XLDnaute Junior
Bonjour le forum,

Après plusieurs essais via les mises ne formes conditionnelles je fais appel à vous pour m'aider à résoudre mon problème en vba.

Dans le fichier joint, j'ai un tableau qui peut avoir entre 1 et 500/600 lignes pour lesquelles j'ai entre 1 et 3 valeurs différente(s).
Je cherche à identifier en vert les premiers chiffres identiques, en orange les deuxièmes chiffres identiques (si ils existent) et en rouge les troisièmes chiffres identiques (si ils existent).

Merci pour vos pistes !

Bonne journée,

Piaf79
 

Pièces jointes

  • Exemple (sortie matrice).xlsm
    13.1 KB · Affichages: 9

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Piaf,
En PJ un essai qui ne répond pas exactement à la demande mais qui est simple.
Vert pour le minimum, Rouge pour le max et Orange si ni min ni max.
Mais peut être est suffisant.
( Je n'ai pas trouvé de solution pour respecter à la lettre votre demande.:)
Mais patience, un ami trouvera vraisemblablement la solution. )
 

Pièces jointes

  • Exemple (sortie matrice).xlsm
    17.6 KB · Affichages: 8

vgendron

XLDnaute Barbatruc
en VBA, je proposerais ceci

VB:
Sub Test2()
Application.ScreenUpdating = False
    Set plage = ActiveSheet.UsedRange
    plage.Interior.Color = xlNone
    
    For i = 2 To plage.Rows.Count
        ValMin = WorksheetFunction.Min(plage.Rows(i))
        ValMax = WorksheetFunction.Max(plage.Rows(i))
        For j = 1 To plage.Columns.Count
            Select Case plage.Cells(i, j)
                Case ""
                    plage.Cells(i, j).Interior.Color = xlNone
                Case ValMin
                    plage.Cells(i, j).Interior.Color = vbGreen
                Case ValMax
                    plage.Cells(i, j).Interior.Color = vbRed
                Case Else
                    plage.Cells(i, j).Interior.Color = vbYellow
            End Select
                
        Next j
    Next i

Application.ScreenUpdating = True
End Sub

avec une restriction sur le UsedRange qui prend les lignes SOUS le tableau
si les données étaient sous forme de table structurée.. ce serait plus propre
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Mais nos solutions ne répondent toujours pas strictement à la demande.
"Le premier chiffre vert, le second orange, le 3ème rouge"
S'il n'y a que deux chiffres on ne devrait avoir que Vert et Orange.
Et à part une usine à gaz en VBA, je ne vois pas comment résoudre simplement le problème.
Espérons que nos solutions satisfasse Piaf.
 

vgendron

XLDnaute Barbatruc
il faudrait donc pour chaque ligne (for i=2 to plage.rows.count)
extraire les 1 2 ou 3 valeurs triées
peut etre que l'association de la fonction "unique" et de Petite.valeur(résultatdeUnique,x) (x de 1 à 3) ??

avec un truc du genre
VB:
for i=2 to plage.rows.count
   val1=petite.valeur(unique(plage.rows(i)),1)
   val2=petite.valeur(unique(plage.rows(i)),2)
   val3=petite.valeur(unique(plage.rows(i)),3)
next i
' un petit tri pour trier les 3 valeurs par ordre croissant


mais je n'ai pas la version qu'il faut pour tester la fonction unique
 

vgendron

XLDnaute Barbatruc
ma petite "usine à gaz"
VB:
Sub Test2()
Application.ScreenUpdating = False
    Dim Dico As Object

    Set plage = ActiveSheet.Range("A1").CurrentRegion 'on détecte la plage à colorer
    plage.Interior.Color = xlNone 'on enlève la coloration en cours
    
    For i = 2 To plage.Rows.Count 'pour chaque ligne de la plage (hors ligne d'entete)
        Set Dico = CreateObject("Scripting.dictionary") 'on déclare le dico
        For j = 1 To plage.Columns.Count 'pour chaque colonne de la ligne
            Val0 = plage.Cells(i, j) 'on récupère la valeur
            If Val0 <> "" Then 'si il y a une valeur
                If Not Dico.exists(Val0) Then 'si elle n'est pas dans le dico
                    Dico.Add Val0, Val0 'on l'ajoute au dico
                End If
            End If
        Next j
        
        a = Dico.keys 'on transvase les clés du dico dans un tablo
        Select Case Dico.Count 'selon le nombre de valeurs différentes detectées
            Case 1
                Val1 = a(0)
            Case 2
                Val1 = WorksheetFunction.Min(a(0), a(1))
                Val2 = WorksheetFunction.Max(a(0), a(1))
            Case 3
                Val1 = WorksheetFunction.Min(a(0), a(1), a(2))
                Val3 = WorksheetFunction.Max(a(0), a(1), a(2))
                For k = 0 To 2
                    If a(k) <> Val1 And a(k) <> Val3 Then Val2 = a(k)
                Next k
        End Select
        
        'on passe à la coloration
        For j = 1 To plage.Columns.Count
            Select Case plage.Cells(i, j)
                Case ""
                    plage.Cells(i, j).Interior.Color = xlNone
                Case Val1
                    plage.Cells(i, j).Interior.Color = vbGreen
                Case Val2
                    plage.Cells(i, j).Interior.Color = vbYellow
                Case Val3
                    plage.Cells(i, j).Interior.Color = vbRed
            End Select
        Next j
        
        Set Dico = Nothing 'on supprime le dico pour la ligne suivante
    Next i
Set Dico = Nothing
Application.ScreenUpdating = True
End Sub
 

Lolote83

XLDnaute Barbatruc
re bonjour
Re,
Mais nos solutions ne répondent toujours pas strictement à la demande.
"Le premier chiffre vert, le second orange, le 3ème rouge"
Ma solution au post#4 semble bien correspondre à la demande mais comme l'a dit Vgendron, si ce n'est pas classé, cela ne fonctionne pas.
Je viens de voir que @vgendron vient de poster quelque chose de nouveau. Peut être à t'il au final trouvé la solution idéale.
Sinon, dans l'après midi, j'essayerai de poster une nouvelle version
@+ Lolote83
 

Piaf79

XLDnaute Junior
Bonjour @Lolote83, @vgendron, @sylvanu,

Merci à tous les trois de vous être intéressé à mon problème.
J'ai regardé avec attention vos différentes productions et je pense que celle qui correspond le mieux à la question inutile est celle de @Lolote83 au post #4. Toutefois je ne comprends pas "si ce n'est pas classé, cela ne fonctionne pas". Si par exemple le premier chiffre est le 4 puis le 1 puis le 3, le 4 est bien en vert, le 1 en orange et le 3 en rouge.

Par contre, est il possible d'adapter le code pour prendre les lignes non vides à partir de la ligne 2 et éviter de devoir délimiter une plage de fin ?

Piaf79
 

Lolote83

XLDnaute Barbatruc
Re bonjour à tous,
Quand je dis "non classé", c'est par exemple
- une suite de 1
- puis une suite de 2
- une nouvelle suite de 1
- puis enfin une suite de 3

Ici le 1 revenant après une autre donnée, cela ne fonctionne pas
Classé (OK)
1693484641886.png


Non classé (NON OK)
1693484606810.png


@+ Lolote83
 

ALS35

XLDnaute Occasionnel
Bonjour à tous,
Une solution en Feil3, si j'ai bien compris, pour Excel 365 uniquement avec 3 MFC du style :
VB:
=A2=CHOISIRCOLS(UNIQUE(FILTRE($A2:$AF2;$A2:$AF2<>"");VRAI);1)
qui fonctionne aussi avec des valeurs texte.
Cordialement
 

Pièces jointes

  • Exemple (sortie matrice) modif.xlsm
    22.3 KB · Affichages: 1

Statistiques des forums

Discussions
312 215
Messages
2 086 316
Membres
103 176
dernier inscrit
jean.yvesjean.yves