Fonction grande.valeur

Résolu
giiggz Messages postés 49 Statut Membre -  
giiggz Messages postés 49 Statut Membre -
Bonjour,

J'aimerais savoir comment faire pour trouver la n-ième plus grande valeur sur une plage de cellule qui se trouve sur deux onglets différents, svp ?

J'ai essayé avec la fonction GRANDE.VALEUR mais dès que la plage de cellule concerne 2 onglets différents, la fonction ne fonctionne plus.

Merci par avance,

Cordialement,

Guillaume.

8 réponses

  1. Hillian Fellers Messages postés 81 Statut Membre 12
     
    Bonsoir,

    Je viens d'essayer, j'arrive à avoir sur l'onglet "Feuil1" la Nième plus grande valeur d'un tableau se trouvant sur un autre onglet (ici "Plan Comptable").
    La formule qui s'affiche à l'endroit où je veux le résultat est:
    =GRANDE.VALEUR('Plan Comptable'!L44:L56;4)

    (les apostrophes qui entourent le nom de l'onglet source, ici Plan Comptable, ne sont nécessaires que si le nom de l'onglet contient des espaces).

    Ou alors, la question est: la plage de cellules sur laquelle porte la recherche est répartie sur plusieurs onglets différents. Mais dans ce cas, je ne sais pas définir une telle plage.
    0
  2. Vaucluse Messages postés 27336 Date d'inscription   Statut Contributeur Dernière intervention   6 453
     
    Bonjour
    le plus simple serait de renvoyer toutes vos valeurs cote à cote en colonne dans une feuille masquée et d'utiliser cette plage

    crdlmnt
    0
  3. giiggz Messages postés 49 Statut Membre
     
    Bonjour,

    Effectivement, Hillian Fellers, la fonction que je recherche correspond bien à la question : "la plage de cellules sur laquelle porte la recherche est répartie sur plusieurs onglets différents.".

    Merci Vaucluse pour cette solution. Si je n'ai pas de meilleure réponse, je me verrai obligé d'utiliser cette solution.

    Bien cordialement,

    Guillaume.
    0
  4. JvDo Messages postés 1924 Date d'inscription   Statut Membre Dernière intervention   859
     
    Bonsoir à tous,

    Quand on n'a pas la fonction kivabien, il faut la construire soi même.
    Un exemple d'appel :
    =GRANDE_VALEUR(10,A6:A9,Feuil2!C12:C15,Feuil3!F6:F9)

    Ici, on recherche la 10ème plus grande valeur de 3 zones réparties sur 3 onglets.
    On met autant de zones qu'on le souhaite, séparées pas des virgules chez moi mais sans doute par des points-virgules chez les gens normaux.
    Voici la macro :
    Function GRANDE_VALEUR(k As Integer, ParamArray args() As Variant)
    Dim tablo()
    n = 0
    For Each vArea In args
    n = n + vArea.Cells.Count
    Next
    ReDim tablo(n)
    Dim i As Integer
    i = 0
    For Each vArea In args
    For Each zone In vArea
    For Each vcell In zone
    tablo(i) = vcell.Value
    i = i + 1
    Next
    Next
    Next
    Call TriDécroissant(tablo(), 0, n - 1)
    GRANDE_VALEUR = tablo(k - 1)
    End Function

    Sub TriDécroissant(a(), gauc, droi) ' Quick sort
    ref = a((gauc + droi) \ 2)
    g = gauc: D = droi
    Do
    Do While a(g) > ref: g = g + 1: Loop
    Do While ref > a(D): D = D - 1: Loop
    If g <= D Then
    temp = a(g): a(g) = a(D): a(D) = temp
    g = g + 1: D = D - 1
    End If
    Loop While g <= D
    If g < droi Then Call TriDécroissant(a, g, droi)
    If gauc < D Then Call TriDécroissant(a, gauc, D)
    End Sub

    cordialement
    0
    1. JvDo Messages postés 1924 Date d'inscription   Statut Membre Dernière intervention   859
       
      on peut simplifier cette fonction en remplaçant les 2 dernières lignes avant "End Function" par un simple
      GRANDE_VALEUR = WorksheetFunction.Large(tablo, k)
      et en supprimant le Sub TriDécr..... End Sub
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. giiggz Messages postés 49 Statut Membre
     
    Bonjour JvDo,

    Merci pour ce super retour.

    Cependant, avec la fonction grande.valeur, je pouvais faire la somme des 5 plus grandes valeurs avec la fonction suivante :
    SOMME(GRANDE.VALEUR(C10:AP10);LIGNE(INDIRECT("1:"&5)))

    Avec la fonction transmise, je n'arrive plus à rajouter la partie LIGNE(...).

    Merci encore.

    Cordialement,

    Guillaume.
    0
  7. Mike-31 Messages postés 18405 Date d'inscription   Statut Contributeur Dernière intervention   5 147
     
    Bonjour le fil,

    Pour rester dans les formules, nomme la plage de données exemple titi et utilise la formule grande valeur sur la feuille de ton choix, exemple pour la troisième valeur

    =GRANDE.VALEUR(titi;3)
    0
    1. JvDo Messages postés 1924 Date d'inscription   Statut Membre Dernière intervention   859
       
      Bonjour Mike-31

      comment fais-tu pour nommer un ensemble de plages "décousues" résidant sur des onglets différents et à des adresses différentes (bref, ça n'est pas une référence 3D)?

      perso, je n'y arrive pas sans macro ou sans Morefunc.

      cdlt
      0
  8. JvDo Messages postés 1924 Date d'inscription   Statut Membre Dernière intervention   859
     
    Bonjour à tous,

    essaye ceci :
    Function GRANDE_VALEUR(vk, ParamArray args() As Variant)
    Dim tablo()
    n = 0
    For Each vArea In args
    n = n + vArea.Cells.Count
    Next
    ReDim tablo(n)
    Dim i As Integer
    i = 0
    For Each vArea In args
    For Each zone In vArea
    For Each vcell In zone
    tablo(i) = vcell.Value
    i = i + 1
    Next
    Next
    Next

    If IsArray(vk) Then
    For k = LBound(vk) To UBound(vk)
    GRANDE_VALEUR = GRANDE_VALEUR + WorksheetFunction.Large(tablo, vk(k, 1))
    Next
    Else
    GRANDE_VALEUR = WorksheetFunction.Large(tablo, vk)
    End If
    End Function

    ***********************************************************

    Function PETITE_VALEUR(vk, ParamArray args() As Variant)
    Dim tablo()
    n = 0
    For Each vArea In args
    n = n + vArea.Cells.Count
    Next
    ReDim tablo(n)
    Dim i As Integer
    i = 0
    For Each vArea In args
    For Each zone In vArea
    For Each vcell In zone
    tablo(i) = vcell.Value
    i = i + 1
    Next
    Next
    Next

    If IsArray(vk) Then
    For k = LBound(vk) To UBound(vk)
    PETITE_VALEUR = PETITE_VALEUR + WorksheetFunction.Small(tablo, vk(k, 1))
    Next
    Else
    PETITE_VALEUR = WorksheetFunction.Small(tablo, vk)
    End If
    End Function

    J'ai mis petite_valeur pour le même prix.

    cordialement
    0
  9. giiggz Messages postés 49 Statut Membre
     
    Encore merci pour ce retour. La fonction fonctionne très bien.

    Je peux continuer sur l'avancement de mon fichier.

    Merci encore.

    Cordialement,

    Guillaume.
    0