XL 2016 Rechercher plus grande valeur dans une colonne avec données combinant chiffre puis texte

pilote301152

XLDnaute Occasionnel
Bonjour,
je cherche une fonction pour extraire d'une colonne la donnée complète (Chiffre plus texte) avec le plus grand chiffre.
Les données sont soit "1 - Faible", "2 - Plutôt faible", "3 - Moyen" et "4 - Fort"
J'ai bien trouvé une solution partielle avec Grande.Valeur en créant une colonne supplémentaire qui extrait la partie numérique (avec cnum et gauche). Seulement je ne réussis pas à reconstituer la donnée complète (si Grande.valeur donne 4 je veux "4 - Fort" .......)
Connaissez-vous en outre un moyen plus direct d'obtenir le résultat sans passer par la création d'une colonne supplémentaire ?
Merci de vos suggestions.`Cordialement
 
Solution
@pilote301152 (salut job75)

tu as écrit : « Mais s'il n'y a pas de notation "4 - Fort" comment extraire la plus forte existante ? » ; alors voici une autre solution, avec une fonction personnalisée :​

VB:
Function NivMax() As String
  Application.Volatile
  Dim n&: n = Cells(Rows.Count, 3).End(3).Row: If n < 7 Then Exit Function
  Dim s$, i&, j&, k As Byte, m As Byte
  For i = 7 To n
    s = Cells(i, 3)
    If s <> "" Then
      k = Asc(Left$(s, 1)) - 48: If k > m Then m = k: j = i
    End If
  Next i
  If m > 0 Then NivMax = Cells(j, 3)
End Function

formule en B1 : =NivMax() ; y'a pas d'colonne D, et tu peux ajouter d'autres données sous...​

job75

XLDnaute Barbatruc
Bonjour pilote301152,

En supposant que les données soient dans la plage B2:B100 utilisez cette formule matricielle :
Code:
=RECHERCHEV(MAX(SIERREUR(--GAUCHE(B2:B100);))&"*";B2:B100;1;0)
à valider par Ctrl+Maj+Entrée.

A+
 

soan

XLDnaute Barbatruc
Inactif
@pilote301152 (salut job75)

tu as écrit : « Mais s'il n'y a pas de notation "4 - Fort" comment extraire la plus forte existante ? » ; alors voici une autre solution, avec une fonction personnalisée :​

VB:
Function NivMax() As String
  Application.Volatile
  Dim n&: n = Cells(Rows.Count, 3).End(3).Row: If n < 7 Then Exit Function
  Dim s$, i&, j&, k As Byte, m As Byte
  For i = 7 To n
    s = Cells(i, 3)
    If s <> "" Then
      k = Asc(Left$(s, 1)) - 48: If k > m Then m = k: j = i
    End If
  Next i
  If m > 0 Then NivMax = Cells(j, 3)
End Function

formule en B1 : =NivMax() ; y'a pas d'colonne D, et tu peux ajouter d'autres données sous C17 : elles seront automatiquement prises en compte, sans devoir changer la macro ; si y'a pas de "4 - Fort" dans les données, c'est "3 - Moyen" qui sera affiché (s'il y en a) ; idem pour les niveaux qui sont moins bons ; exemple : va en C15, et supprime le "4 - Fort" ➯ en B1, il y a maintenant : "3 - Moyen" ; accessoirement, tu peux voir que ça marche même si y'a une cellule vide au milieu des autres données. :)



j'ai essayé la formule de job75 ; en l'adaptant à ton fichier, ça donne :

=RECHERCHEV(MAX(SIERREUR(--GAUCHE(C7:C100);))&"*";C7:C100;1;0)

(formule matricielle, à valider par Ctrl Maj Entrée)

bien sûr, il ne faudra pas oublier d'adapter le C100 (2×) si tu ajoutes beaucoup de données et que ça dépasse la ligne 100.​

soan
 

Pièces jointes

  • test.xlsm
    14.8 KB · Affichages: 8
Dernière édition:

pilote301152

XLDnaute Occasionnel
@pilote301152 (salut job75)

tu as écrit : « Mais s'il n'y a pas de notation "4 - Fort" comment extraire la plus forte existante ? » ; alors voici une autre solution, avec une fonction personnalisée :​

VB:
Function NivMax() As String
  Application.Volatile
  Dim n&: n = Cells(Rows.Count, 3).End(3).Row: If n < 7 Then Exit Function
  Dim s$, i&, j&, k As Byte, m As Byte
  For i = 7 To n
    s = Cells(i, 3)
    If s <> "" Then
      k = Asc(Left$(s, 1)) - 48: If k > m Then m = k: j = i
    End If
  Next i
  If m > 0 Then NivMax = Cells(j, 3)
End Function

formule en B1 : =NivMax() ; y'a pas d'colonne D, et tu peux ajouter d'autres données sous C17 : elles seront automatiquement prises en compte, sans devoir changer la macro ; si y'a pas de "4 - Fort" dans les données, c'est "3 - Moyen" qui sera affiché (s'il y en a) ; idem pour les niveaux qui sont moins bons ; exemple : va en C15, et supprime le "4 - Fort" ➯ en B1, il y a maintenant : "3 - Moyen" ; accessoirement, tu peux voir que ça marche même si y'a une cellule vide au milieu des autres données. :)



j'ai essayé la formule de job75 ; en l'adaptant à ton fichier, ça donne :

=RECHERCHEV(MAX(SIERREUR(--GAUCHE(C7:C100);))&"*";C7:C100;1;0)

(formule matricielle, à valider par Ctrl Maj Entrée)

bien sûr, il ne faudra pas oublier d'adapter le C100 (2×) si tu ajoutes beaucoup de données et que ça dépasse la ligne 100.​

soan
Effectivement cette solution sous VBA fonctionne également. Je retiens son code car très formatrice pour moi. Encore merci et bonne journée
 

pilote301152

XLDnaute Occasionnel
Bonjour pilote301152,

En supposant que les données soient dans la plage B2:B100 utilisez cette formule matricielle :
Code:
=RECHERCHEV(MAX(SIERREUR(--GAUCHE(B2:B100);))&"*";B2:B100;1;0)
à valider par Ctrl+Maj+Entrée.

A+
Bonsoir job75
Après avoir utilisé cette solution j'essaie à présent de tout comprendre de cette fonction.
J'aurais 2 questions : pourquoi insérer "si erreur"? et quelle est la signification des -- avant la fonction "gauche" ? En effet ces 2 insertions sont indispensables au bon fonctionnement de la formule ...
Cordialement
 

soan

XLDnaute Barbatruc
Inactif
Bonsoir pilote301152, le fil,

GAUCHE(B2:B100) : idem que GAUCHE(B2:B100;1) : pour chaque cellule de B2:B100, ça retourne le 1er caractère de gauche : un chiffre de 1 à 4 ; mais c'est le texte "1" à "4", c'est pas numérique.

avec --GAUCHE(B2:B100) le 1er signe moins convertit le chiffre_texte en chiffre_nombre ; comme il devient négatif, on double le signe moins pour rétablir le signe positif ; exemple : -(-1) = +1 = 1.

enfin, au cas où ça retournerait une valeur d'erreur (du genre #VALEUR! ou #N/A!), pour éviter qu'elle soit affichée, on utilise SIERREUR() ; je te laisse lire l'Aide Excel pour plus d'infos. :)


soan
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour pilote301152, le forum,

Avec une plage comme B2:B100 ou B2:B1000 il y a forcément des cellules vides.

Avec GAUCHE elles donnent le texte vide "" qui avec -- donne la valeur d'erreur #VALEUR!.

SIERREUR(xxx; ) transforme cette valeur d'erreur en zéro.

A+
 

Discussions similaires

Statistiques des forums

Discussions
312 248
Messages
2 086 595
Membres
103 250
dernier inscrit
keks974