Fonction grande.valeur

Résolu/Fermé
giiggz Messages postés 49 Date d'inscription vendredi 17 janvier 2014 Statut Membre Dernière intervention 11 août 2015 - 28 déc. 2014 à 00:08
giiggz Messages postés 49 Date d'inscription vendredi 17 janvier 2014 Statut Membre Dernière intervention 11 août 2015 - 7 janv. 2015 à 16:42
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

Hillian Fellers Messages postés 79 Date d'inscription mardi 22 octobre 2013 Statut Membre Dernière intervention 24 mai 2022 12
28 déc. 2014 à 01:49
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
Vaucluse Messages postés 26496 Date d'inscription lundi 23 juillet 2007 Statut Contributeur Dernière intervention 1 avril 2022 6 419
28 déc. 2014 à 08:12
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
giiggz Messages postés 49 Date d'inscription vendredi 17 janvier 2014 Statut Membre Dernière intervention 11 août 2015
Modifié par giiggz le 28/12/2014 à 11:13
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
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 858
28 déc. 2014 à 18:24
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
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 858
29 déc. 2014 à 18:26
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
giiggz Messages postés 49 Date d'inscription vendredi 17 janvier 2014 Statut Membre Dernière intervention 11 août 2015
7 janv. 2015 à 11:27
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
Mike-31 Messages postés 18354 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 1 janvier 2025 5 110
7 janv. 2015 à 11:45
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
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 858
7 janv. 2015 à 14:43
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
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 858
7 janv. 2015 à 14:40
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
giiggz Messages postés 49 Date d'inscription vendredi 17 janvier 2014 Statut Membre Dernière intervention 11 août 2015
7 janv. 2015 à 16:42
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