Fonction (VBA) pour obtenir le obtenir le nieme élément

Pour l'instant, j'ai écrit ca :

Function GetElem(table As Range, Optional ByVal elem As Integer = 1)
    Dim cel As Range
    Dim min As Variant

    For Each cel In table.Cells
        If cel.Value < min Or IsEmpty(min) Then
            min = cel.Value
        End If
    Next cel

    GetElem = min
End Function

Ca renvoi le plus petit élément.

Pour obtenir le second plus petit, il suffirait que j'exclue cette cellule de la liste, et que je recommence. (et si je sais faire ca, je pourrais améliorer tout seul en faisant un joli quickSelect)

Mais :

-> déjà, ca bug joyeusement : là, ca me sort c par exemple (ca bug à cause de la cellule vide)

sans titre

-> et je suis vraiment un incapable avec VBA, je n'arrive pas du tout à utiliser des listes dynamiques, ou quoi que ce soit d'autre.. Du coup, là, je suis bloqué à renvoyer le minimum.

A noter que j'ai excel 2019, (du coup, j'ai pas accès à la fonction sort) et je ne veux pas que le vba nécessite des configurations spécifiques (autre que le code vba présent dans le fichier) pour fonctionner : mes fichiers sont partagés.

Merci pour votre aide !

(et oui, je sais le faire sans VBA, mais là, il faut que je me crée des fonctions spécifiques pour gagner du temps)

bonsoir,

pourquoi ne pas utiliser la fonction excel PETITE.VALEUR()(exemple trouver la 9ème plus petite valeur dans la plage A1:A10)

=PETITE.VALEUR(A1:A10;9)

Wow ! Je ne pensais pas apprendre des fonctions de cette manière ... petite.valeur() grande.valeur() rang() .... J'avais toujours calculé ces valeurs à la main jusqu'à présent.

Bon, en attendant, ca ne fonctionne hélas pas sur les chaines de caractères, donc mon besoin reste valide.

(mais wow, déjà, ces 3 fonctions vont clairement me faire gagner du temps, tant pis si elles sont deprecated)

bonjour,

une adaptation de ta fonction

Function getelem(t As Range, Optional elem& = 1)
    Dim tel$(), i&, j&, k&, ctr&, el As Range, a$
'mettre les valeurs dans la table tel
    ReDim tel(t.Count)
    For Each el In t
        ctr = ctr + 1
        tel(ctr) = el.Value
    Next
'tri de la table tel
    For i = 1 To ctr - 1
        k = i
        For j = i + 1 To ctr
            If tel(k) > tel(j) Then k = j
        Next j
        If k <> i Then a = tel(i): tel(i) = tel(k): tel(k) = a
    Next i
'renvoie l'élément elem de la table
    getelem = tel(elem)
End Function

pour des tables de plus de 100 éléments, il faudra envisager un autre algorithme de tri.

bonjour Peuwi,H2SO4,

comme ceci

Sub test()
     MsgBox GetElem(Range("Tableau1"), 5)
End Sub

Function GetElem(Plage As Range, Optional Numéro As Integer)
     Dim SCA, a, aA
     If Numéro <= 0 Then Numéro = 1
     Set SCA = CreateObject("System.Collections.Arraylist")
     a = Plage.Value2
     For i = 1 To UBound(a)
          For j = 1 To UBound(a, 2)
               If Len(a(i, j)) > 0 Then SCA.Add CStr(a(i, j))     'ajouter valeur au SCA comme string
          Next
     Next
     SCA.Sort
     aA = SCA.toarray
     'MsgBox Join(aA, vbLf)
     GetElem = aA(Numéro - 1)
End Function

Merci beaucoup !!

Avec ces exemples, j'ai une solution fonctionnelle, mais j'ai aussi tous les petits éléments qui vont me permettre de perfectionner encore l'algorithme,
merci beaucoup !

re,

vous avez ici l'explication de cet outil. Avec par exemple "SCA.Sort" vous avez un tri ascendant, si vous faites après le "SCA.reverse", vous avez le même liste descendant.

https://excelmacromastery.com/vba-arraylist/

Rechercher des sujets similaires à "fonction vba obtenir nieme element"