XL 2019 Valeur maxi d'une colonne

Caninge

XLDnaute Accro
Bonsoir à tous,

je fais un petit tour sur Excel Downloads avant d'aller diner et regarder ma série préférée " Columbo "
Je peux vous demander un petit peu d'aide pour résoudre ce problème ?
J'aimerais extraire la valeur maxi d'une colonne sachant qu'il y en a plusieurs dans chaque cellule.
j'ai essayé avec stxt , droite gauche maxi. je me suis mélangé les pinceaux.
Je vous remercie,
Bonne soirée
 

Pièces jointes

  • Fonction Maxi avec Formule Droite ou Gauche.xlsx
    10.2 KB · Affichages: 42

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir Caninge,
Un essai en PJ avec cette fonction perso :
VB:
Function MaxCol(Plage As Range)
    Dim Maxi, tablo, T, i%, j%
    Maxi = 0: tablo = Plage
    For i = 1 To UBound(tablo)
        If tablo(i, 1) <> "" Then
            T = Split(tablo(i, 1), "-")
            For j = 0 To UBound(T)
                If Val(T(j)) > Maxi Then Maxi = Val(T(j))
            Next j
        End If
    Next i
    MaxCol = Maxi
End Function
 

Pièces jointes

  • Fonction Maxi avec Formule Droite ou Gauche.xlsm
    16 KB · Affichages: 4

Robert

XLDnaute Barbatruc
Repose en paix
Bonsoir Caninge, bonsoir le forum,

Si une proposition VBA peut convenir, essaie le code ci-dessous :

VB:
Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim NT As Byte 'déclare la variable NT (Nombre des Tirets)
Dim V As Integer 'déclare la variable V (Valeur)
Dim VM As Integer 'déclare la variable VM (Valeur Maximale)

Set O = Worksheets("Feuil1") 'définit l'onglet O
DL = O.Cells(Application.Rows.Count, "D").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne D de l'onglet O
TV = (O.Range(O.Cells(2, "D"), O.Cells(DL, "D"))) 'définit le tableau des valeurs TV
For I = 1 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV
    If TV(I, 1) <> "" Then 'condition : si la donnée ligne I colonne 1 de TV n'est pas vide
        NT = UBound(Split(TV(I, 1), "-")) 'définit le nombre de tirets NT de la donnée ligne I colonne 1 de TV
        For J = 0 To NT - 1 'boucle 2 : sur le nombre de tirest NT moins un
            V = Split(TV(I, 1), "-")(J) 'définit la valeur V (valeur avant le tiret J)
            If V > VM Then VM = V 'si V est supérieure à VM (qui vaut 0 au départ), alors VM devient V (VM sera toujours la valeurs maximale de toutes les valeurs rencontrées)
        Next J 'prochain tiret de la boucle 2
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle 1
O.Range("F2").Value = VM 'renvoie la valeur maximale VM dans la cellule F2
End Sub

Essaie aussi la série Inspecteur Lewis sur polar (55)...

[Édition]
Bonsoir Sylvanu, je navet pas rafraîchi et nos posts se sont croisés...
 
Dernière édition:

R@chid

XLDnaute Barbatruc
Bonjour @ tous,
Salut Sylvanu, et un salut spécial à l'ami Robert
[Édition]
Bonsoir Sylvanu, je navet pas rafraîchi et nos posts se sont croisés...
Mon ami Robert navet pas rafraichi, moi j'ai carotté une formule matricielle.
VB:
=MAX(SIERREUR(FILTRE.XML("<a><b>"&SUBSTITUE(D2:D34;"-";"</b><b>")&"</b></a>";"//b");))
@ valider par Ctrl+Maj+Entrée


Cordialement
 

patricktoulon

XLDnaute Barbatruc
Bonjour à tous
@rachid 👍
c'est le genre d'astuce dont je suis friand
il fallait y penser
mais j'ai un résultat de une cellule (la première) et pas celui de plusieurs ?
1618728708395.png
 
Dernière édition:

Caninge

XLDnaute Accro
Bonjour à tous,
merci pour toutes vos réponses,
là maintenant je pars faire un tour de vélo (à moins de 10 km).
Quand je reviendrais je regarderai toutes vos propositions.
Probablement cet après-midi.
Bonne matinée.
Caninge
 

job75

XLDnaute Barbatruc
Bonjour à tous,

Une solution qui utilise JOINDRE.TEXTE et la fonction macro Excel 4.0 EVALUER pour définir le nom Matrice :
Code:
=EVALUER("{"&SUBSTITUE(SUBSTITUE(SUBSTITUE(JOINDRE.TEXTE("-";VRAI;Feuil1!$D$2:$D$34);"--";"-");"-";";")&"}";";}";"}"))
JOINDRE.TEXTE existe seulement sur les versions Excel récentes.

Formule en F2 =MAX(Matrice)

A+
 

Pièces jointes

  • Evaluer(1).xlsm
    10.7 KB · Affichages: 7

patricktoulon

XLDnaute Barbatruc
re
sinon par vba une fonction perso
VB:
Function maxIncolumn(r As Range)
Dim t,maxi&,i&
t = Application.Transpose(Application.Index(r, 0, 1))
t = Split(Join(t, "-"), "-")
For i = 0 To UBound(t)
If Val(t(i)) > maxi Then maxi = Val(t(i))
Next
maxIncolumn = maxi
End Function

formule:
=maxIncolumn(A1:A10)
 

R@chid

XLDnaute Barbatruc
Bonjour @ tous,
Bonjour à tous
@rachid 👍
c'est le genre d'astuce dont je suis friand
il fallait y penser
mais j'ai un résultat de une cellule (la première) et pas celui de plusieurs ?
Regarde la pièce jointe 1102570
Oui patricktoulon, je viens de découvrir que la formule ne renvoie la valeur max de la première cellule, même si on évaluant la formule on voit bien qu'elle prenne toute la matrice.
Capture d'écran 2021-04-18 10.55.48.png




Une variante avec Power Query en attendant que je revienne vers la formule pour voir d'où vient l'anomalie.
Voir PJ


Cordialement
 

Pièces jointes

  • Fonction Maxi avec Formule Droite ou Gauche_PowerQuery_V1.xlsx
    20.3 KB · Affichages: 2

R@chid

XLDnaute Barbatruc
Re,
Bonjour à tous
@rachid 👍
c'est le genre d'astuce dont je suis friand
il fallait y penser
mais j'ai un résultat de une cellule (la première) et pas celui de plusieurs ?
Regarde la pièce jointe 1102570
:D :D :D
VB:
=MAX(SIERREUR(FILTRE.XML("<a><b>"&SUBSTITUE(JOINDRE.TEXTE("-";;D2:D34);"-";"</b><b>")&"</b></a>";"//b");))
@ valider toujours par Ctrl+Maj+Entrée
Bien sûr ceux qui sont sous Excel pour Microsoft 365 peuvent valider la formule par une simple Entrée.



Cordialement
 

patricktoulon

XLDnaute Barbatruc
re
allez on se creuse les méninges 👨‍🎓

et ceux qui n'ont pas joindre .texte
il doit bien y avoir une formule pour joindre des valeurs cellules non?

j'ai bien tenté le concatener avec un transpose mais ça ne fonctionne pas

Méthode 2. La fonction TRANSPOSE pour obtenir la plage

La meilleure façon de combiner du texte de différentes cellules dans une seule cellule consiste à utiliser la fonction de transposition avec la fonction de concaténation.

  1. Sélectionnez la cellule dans laquelle vous avez besoin d’obtenir le résultat.
  2. Accédez à la barre de formule et insérer la formule =CONCATENER(TRANSPOSE(A1:A8) & " ") sans appuyer sur Entrée.
en fait c'est ctrl+maj+enter mais ça ne fonctionne pas
 
Dernière édition:

Caninge

XLDnaute Accro
Bonsoir à tous chers amis d'Excel,
j'ai fait le tour de toutes vos propositions.
Maintenant il faut que je choisisse celle qui me plait.
Je vous remercie pour votre aide.
En ce qui concerne les séries policières j'aime bien aussi Maigret.
Bonne soirée et à la prochaine.
CANINGE
 

patricktoulon

XLDnaute Barbatruc
re
bonjour a tous
je savais que j'avais ça dans mes archives

je propose une fonction perso sans boucle
le problème avec max c'est que pour que ca fonctionne sur un array 1 dim il faut le tester en matriciel

le second problème est que si cet array est issue d'un split c'est donc des item string et donc max renvoie 0

donc il nous faut joindre toute les cellules
spliter pour en faire un array tout en faisant en sorte que cet array soit des valeurs numériques

je vais donc récupérer l'index 1 en colonne de la plage désignée
le transposer pour en faire un array 1 dim
le joindre
et là (TRES IMPORTANT!!!)je ne le split pas mais j’évalue en tant que matrice avec evaluate
a partir de là j'ai bien un array 1 dim avec toutes les valeurs
ensuite nous avons un autre problème !!!! la fonction max ne fonctionne pas sur un array 1 dim
il nous faut matricialiser l'array pour que max fonctionne
tenu de tout ces paramètres voici ma fonction perso sans boucle

VB:
Function maxInJoinTexteIncolumn(r As Range)
Dim tbl()
t = Application.Transpose(Application.Index(r, 0, 1))
t = "{" & Replace(Join(t, "-"), "-", ",") & "}"
tbl = Evaluate(t)
maxInJoinTexteIncolumn = Application.WorksheetFunction.Max(Array(tbl()))
End Function

Sub test3()
MsgBox maxInJoinTexteIncolumn([A1:A3])
End Sub
utilisable en formule bien sur
=maxInJoinTexteIncolumn(A1:A3)
démonstration
demo7.gif


et pour parfaire cette petite fonction qui peut s'avérer tres utile
on peut (puisque les worksheetfunctions fonctionnent )ajouter un parametre pour chopper le plus grand avec index c'est a dire le 1 le 2d le 3em etc..... et cela avec cette fois ci la fonction large

VB:
'le plus grand
Function maxInJoinTexteIncolumn(r As Range)
Dim tbl(), T
T = Application.Transpose(Application.index(r, 0, 1))
T = "{" & Replace(Join(T, "-"), "-", ",") & "}"
tbl = Evaluate(T)
maxInJoinTexteIncolumn = Application.WorksheetFunction.Max(Array(tbl()))
End Function

Sub test3()
MsgBox maxInJoinTexteIncolumn([A1:A3])
End Sub

'le N eme plus grand
Function maxInJoinTexteIncolumn2(r As Range, Optional index& = 1)
Dim tbl(), T
T = Application.Transpose(Application.index(r, 0, 1))
T = "{" & Replace(Join(T, "-"), "-", ",") & "}"
tbl = Evaluate(T)
maxInJoinTexteIncolumn2 = Application.WorksheetFunction.Large(tbl, index)
End Function

Sub test4()
MsgBox maxInJoinTexteIncolumn2([A1:A3], 1)' le premier'
MsgBox maxInJoinTexteIncolumn2([A1:A3], 3)' le 3 eme
End Sub
la formule serait alors
=maxInJoinTexteIncolumn2(A1:A3;1)
=maxInJoinTexteIncolumn2(A1:A3;3)
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 103
Messages
2 085 325
Membres
102 862
dernier inscrit
Emma35400