Affichage 3 ou 4 grandes valeurs

Bonsoir à tous,

Pour finir ma programmation, j'aurai besoin d'un coup de main.

Pour que se soit plus compréhensible, j'ai simplifié le fichier. Il y a juste le bout de code sur lequel je bloque.

Voici ce que j'ai :

J'ai une liste de nom (colonne A) à laquelle est associé une valeur (colonne G)

Voici ce que j'arrive à faire (Merci au autos du site ) :

Afficher le nom correspondant à la plus grande valeur dans une cellule (ex: dans la cellule I1)

Voici mon problème :

J'ai le cas où la plus grande valeur est présente dans plusieurs cellules (voir cellule en jaune sur mon fichier).

Je voudrai donc afficher les 3 noms (voir cellule en vert dans mon fichier) dans la colonne I.

Et là, je sèche.

Quelqu'un a-t-il ma solution ?

Merci d'avance

26classeur2.xlsm (17.86 Ko)

Bonsoir Seb, bonsoir le forum,

Voyons ce qui ne va pas dans ton code :

Sub Macro1()
Set R = Worksheets("Feuil1") 'définit l'onglet R
R.Select 'sélectionne l'Onglet A

With R 'on travaille avec l'Onglet R
ligmax = Cells(65000, 1).End(xlUp).Row ' cherche la dernière ligne non vide à partir du bas de la colonne 1
monmax = 0    ' rempli à 0 au départ
For I = 1 To ligmax ' à partir de la ligne 1
If Cells(I, 7).Value > monmax Then  ' cells(i,1).value donne le contenu de la cellule placée en ligne i  et colonne 7
monmax = R.Cells(I, 7).Value
imax = I
' si cells(i,7).value est supérieur à la valeur se trouvant dans monmax, alors c'est provisoirement la plus grande, je la range dans monmax et conserve le numéro de la ligne dans imax
End If
Next I
End With
R.Cells(1, 8).Value = monmax
R.Cells(1, 9).Value = R.Cells(imax, 1).Value
End Sub

- Première remarque : si tu utilises With R (ou R est un objet WorkSheet = onglet) , il faut mettre un point ensuite devant tous les .Cells ou .Range relationnés à cet onglet. Ça n'a pas d'incidence dans ton cas car le bouton Tester la macro se trouve dans le même onglet que là où le code traite les données... Si tu le places dans un autre onglet tu verras que ça posera un problème...

- Deuxième remarque : la boucle pour trouver la valeur maximum est fonctionnelle mais il existe la fonction Max utilisable directement dans VBA.

- Dernière Remarque (celle de ton problème réel) : Tu n'as stocké et renvoyé que le nom de la première valeur maximum trouvée. Il aurait fallu stocké dans un tableau les noms de toutes les valeurs maximum...

Je te propose le code ci-dessous :

Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim VM As Long 'déclare la variable VM (Valeur Maximum)
Dim I As Integer 'déclare la variable I (Incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim TVM() As Variant 'déclare la variable TVM (Tableau des Valeurs Maximum)

Set O = Worksheets("Feuil1") 'définit l'onglet O
O.Range("I1:I" & O.Cells(Application.Rows.Count, "I").End(xlUp).Row).ClearContents 'efface d'eventuelles anciennes données dans la colonne I
TV = O.Range("A1:G" & O.Cells(Application.Rows.Count, "G").End(xlUp).Row) 'définit le tableau des valeurs TV
VM = Application.WorksheetFunction.Max(Application.Index(TV, , 7)) 'définit la valeur maximum VM dans la 7ème colonne de TV
K = 1 'initialise la variable K
For I = 1 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV
    If TV(I, 7) = VM Then 'condition : si la valeur en colonne 7 de TV est égale à la valeur maximum VM
        ReDim Preserve TVM(1 To K) 'redimensionne le tableau de valeurs maximum TVM
        TVM(K) = TV(I, 1) 'récupère dans le tableau TVM, le nom en colonne 1 de TV correspondant à la valeur maximim
        K = K + 1 'incrémente K (ajoute une ligne au tableau des valeurs maximum TVM)
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
O.Range("I1").Value = VM 'renvoie la valeur Maximum en I2
O.Range("I2").Resize(UBound(TVM), 1) = Application.Transpose(TVM) 'renvoie dans I2 redimensionnée le tableau TVM transposé
End Sub

Travailler avec des variables tableau de type variant est beaucoup plus rapide que de travailler directement sur les cellules d'un onglet. C'est pour ça que j'utilise les deux tableaux TV et TVM...

Salut

essai

Sub Macro2()

Dim Lr As Long, i As Long, x As Long, C
x = 0
Lr = Cells(Rows.Count, "G").End(xlUp).Row
Range("H1:I" & Lr).ClearContents
    C = WorksheetFunction.Max(Range("G1:G" & Lr))
    For i = 1 To Lr
    If Cells(i, "G") = C Then
    x = x + 1
            Cells(x, 8) = C
            Cells(x, 9) = Cells(i, 1)
        End If
    Next

End Sub

Merci à vous deux pour vos réponses.

Merci surtout à ThauThème pour les explications détaillées (encore une fois ).

J'ai bien pris note de mes erreurs que je ne ferai plus.

A bientôt.

Rechercher des sujets similaires à "affichage grandes valeurs"