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

  • Initiateur de la discussion Initiateur de la discussion Piaf79
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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

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

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
 
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.
 
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
 
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
 
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
 
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
 
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
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour