Mettre 3 cellules en surbrillance en fonction des valeurs

Bonjour à tous

J'ai un fichier contenant des valeurs sur trois colonnes

Je voudrais mettre en surbrillance les trois valeurs les plus élevées de la colonne "C"

Dans mon exemple ci-joint, il s'agirait donc des cellules C7, C8 et C9 que je voudrais "couleur de remplissage : jaune" de préférence dans une macro pour que je puisse l'intégrer a une macro déjà existante

Merci pour votre aide / Perceval

12synthese-sem-20.zip (587.60 Ko)

Bonjour,

il suffit de mettre 3 MFC sur la sélection ;

=SI($C2=GRANDE.VALEUR($C$2:$C$10;1);VRAI;FAUX)
=SI($C2=GRANDE.VALEUR($C$2:$C$10;2);VRAI;FAUX)
=SI($C2=GRANDE.VALEUR($C$2:$C$10;3);VRAI;FAUX)

Bonjour,

Je suis d'accord avec Doux Reveur sur le fait qu'une MFC serait plus logique ici puisqu'elles se mettent à jour automatiquement…

Ci-après un petit bout de code +/- équivalent, basé sur votre fichier.

Public Sub TriAuto()
  Sheet1.AutoFilterMode = False
  Dim colC As Range
  With Sheet1.Range("C2")
    Set colC = Range(.Cells, .End(xlDown))
  End With

  colC.Interior.Pattern = xlNone

  Sheet1.Range("A1:C1") = Array("Titre 1", "Titre 2", "Titre 3")
  Sheet1.Range("A1").AutoFilter Field:=3, Criteria1:="3", Operator:=xlTop10Items

  colC.SpecialCells(xlCellTypeVisible).Interior.Color = 65535

  Sheet1.AutoFilterMode = False
  Sheet1.Range("A1:C1").ClearContents
End Sub

Merci pour vos suggestion mais je préfère une macro car une nouvelle feuille est créé chaque jour dont le nombre de ligne est très variable

Le code proposé ne fonctionne pas chez moi, cela bug à la ligne "Sheet1.AutoFilterMode = False"

Changez Sheet1 par le nom de code de votre feuille. Ou bien ThisWorkbook.Worksheets("nom de la feuille")

Je me suis basé sur le fichier partagé, dans lequel la feuille de travail a pour nom de code Sheet1.

Bonsoir,
saboh12617 bonsoir,

Une autre proposition par VBA :

Sub LRD()
    Dim Plage As Range, Cel As Range, I As Integer
    Set Plage = ActiveSheet.Range("C2:C" & ActiveSheet.Range("C" & Rows.Count).End(xlUp).Row)
    Plage.Interior.Color = xlNone
    For I = 1 To 3
        Set Cel = Plage.Find(Application.WorksheetFunction.Large(Plage, I), LookIn:=xlFormulas, lookat:=xlWhole)
        If Not Cel Is Nothing Then Cel.Interior.Color = RGB(125, 255, 0)
    Next I
End Sub

Mais il faut que les trois valeurs soient différentes... A retravailler donc ! C'est ce qui me plait ici ! Aller dans mes retranchements ! Avec mes petites connaissances !

@ bientôt

LouReeD

Voilà, avec FindNext !

Sub LRD()
    Dim Plage As Range, I As Integer, Cel As Range, Adr As String, Cpt As Long
    ' on détermine l aplage de recherche
    Set Plage = ActiveSheet.Range("C1:C" & ActiveSheet.Range("C" & Rows.Count).End(xlUp).Row)
    ' on efface les couleurs
    Plage.Interior.Color = xlNone
    ' on boucle trois fois car on recherche les 3 "grande valeur"
    For I = 1 To 3
        ' avec la plage
        With Plage
            ' on attribue à Cel le résultat de la recherche de la "I"ième grande valeur
            Set Cel = .Find(Application.WorksheetFunction.Large(Plage, I), LookIn:=xlFormulas, lookat:=xlWhole)
            ' si on en trouve 1
            If Not Cel Is Nothing Then
                ' on récupère son adresse
                Adr = Cel.Address
                ' on boucle "indéfinie" afin de trouver les autres valeurs égale à la première
                Do
                    ' on incrémente le compteur du nombre de cellule trouvée
                    Cpt = Cpt + 1 ' supprimer si on peut afficher plus de trois cellule en vert
                    ' si l'on a pas encore trouvé les trois valeurs alors on colorie
                    If Cpt <= 3 Then Cel.Interior.Color = RGB(125, 255, 0) ' supprimer le "IF Cpt <=3 Then" si on peut afficher plus de trois cellule en vert
                    ' on cherche la suivante
                    Set Cel = .FindNext(Cel)
                ' on cherche tant que l'on arrive pas sur la première trouvée
                Loop While Cel.Address <> Adr
            End If
        End With
    Next I
End Sub

J'ai mis en place un compteur afin de ne pas afficher 6 cellules vertes s'il y en a 6 avec la même grande valeur. Maintenant s'il faut afficher toutes les cellules qui contiennent les trois grande valeur alors il suffira de supprimer ce compteur.

Attention tout de même cette technique de recherche avec Find et FindNext peut être chronophage si les zone de recherche sont grandes.

@ bientôt

LouReeD

Salut @LooReeD, sympa ta solution aussi. Sinon j'avais pensé à une solution via lecture dans un tableau VBA -> ArrayList -> Sort -> 3 premiers/derniers items.

Attention tout de même cette technique de recherche avec Find et FindNext peut être chronophage si les zone de recherche sont grandes.

De meme pour ma proposition avec l'autofilter comme on avait vu sur un autre post.

Bonjour à tous,

Pour le fun, deux version de macros avec un tableau (array) comme souhaité. Les codes sont dans le module mod3max. Ils sont un peu commentés. On "saute" les cellules qui ne contiennent pas un nombre.

Le premier code colorer3max() est classique; on utilise la fonction Excel de GRANDE.VALEUR pour trouver la plus grande 3ème valeur. Mais si les 3 plus grandes valeurs sont par exemple égales, on n'ira pas chercher la seconde valeur différente puis la 3° différente des deux autres.

Le second code colorer3maxDiff() recherche les 3 plus grandes valeurs toutes différentes. Pour le fun, j'ai voulu éviter un tri (qui portant simplifierait le code). Donc le code d'élimination des doublons puis de recherche de ces 3 valeurs n'est pas optimisé mais d'après l'exemple fourni, j'en ai déduit que les données sources auront toujours peu de lignes donc ça ne dégradera pas beaucoup la vitesse. Si ce n'est pas le cas, me le dire, on refera le code avec un tri quicksort.

Rechercher des sujets similaires à "mettre surbrillance fonction valeurs"