VBA: moyennes des X meilleures notes

Bonjour

je souhaiterais calculer les moyennes des x meilleures notes d'une plage. (via vba)

Exemple j'ai une liste de 100 notes dont 60 notes filles et 40 notes garçons.

Et je souhaiterais connaitre

1- la moyenne des 12 meilleures notes F

2- LA moyenne des 18 meilleures notes G

sachant que 12 et 18 dans l'exemple sont modifiables.

Je mets un fichier en exemple

merci de votre aide.

Asso132

bonsoir

voici une proposition

Fred

Bonjour

Super ! Merci !

j'ai une 2e demande du même style

Dans la feuille inscrits , j'ai des colonnes (categ, v1,v2,v3,b1,b2)

je souhaiterais avoir la même possibilité pour connaitre les moyennes des X meilleurs

1- pour les catégories différentes

2- pour les 2 sexes

une idée ?

merci

Asso132

Bonsoir le fil, bonsoir le forum,

Une autre proposition (1 post) avec la fonction personnalisée MS (Moyenne par Sexe) ci-dessous :

Public Function MS(NB As Byte, PL As Range, Sexe As String)
'NB = cliquer dans une cellule contenant NomBre de notes prise en compte ou le taper
'PL = sélectionner la PLage contenant les notes (il faut sélectionner les 2 colonnes "notes" et "sexe" uniquement, sans les en-têtes)
'Sexe = sélectionner une cellule contenant le Sexe ou taper {"f", "F", "g" ou "G"}

Dim TD As Variant 'déclare la variable TD (Tableau des Données)
Dim I As Integer 'déclare la variable I (Incrément)
Dim TNS() As Variant 'déclare le tableau TNS (Tableau des notes par Sexe)
Dim J As Integer 'déclare la variable J (Incrément)
Dim TNM() As Double 'décalre la variable TNM (Tableau des notes maximum)
Dim T As Double 'déclare la variable T (Total)

TD = PL 'définit le tableau de données TD
For I = 1 To UBound(TD, 1) 'boucle sur touts les lignes du tableau TB
    If UCase(TD(I, 2)) = UCase(Sexe) Then 'si la valeur en ligne I, colonne 2 du TD est égale à la variable Sexe
        ReDim Preserve TNS(J) 'redimensionne le tableau des notes par sexe TNS
        TNS(J) = CDbl(TD(I, 1)) 'récupère la note
        J = J + 1 'incrémente J
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
ReDim Preserve TNM(1 To NB) 'redimensionne le tableau des notes maximum TNM en fonction du nombre NB de notes prises en compte
For I = 1 To NB 'boucle NB fois
    'attribue à TNM(I) la Ième plus grande valeur de la colonne 0 du tabelau TNS
    TNM(I) = Application.WorksheetFunction.Large(Application.Index(TNS, , 0), I)
    T = T + TNM(I) 'définit le total T
Next I 'prochaine fois de la boucle
MS = Round(T / NB, 2) 'renvoie la moyenne
End Function

À adapter pour ton second problème...

Bonsoir

merci pour cette 2e proposition.

Je vais tenter d'adapter ... pour le 2e problème.

Asso132

Rebonsoir

Pour le 2e problème, j'ai renommé la fonction mcat

et par exemple pour v1 et BF :

=mcat(U6;saisie_résultats!C8:C127;saisie_résultats!K8:K127;statistiques!U7)

ca ne fonctionne pas, est ce un problème de colonne non concomitante ?

voici ce que j'ai modifié dans le code mais j'ai une erreur #valeur

   
Public Function MCAT(NB As Byte, PL As Range, Cat As String)
    'NB = cliquer dans une cellule contenant NomBre de notes prise en compte ou le taper

    'PL = sélectionner la PLage contenant les notes (il faut sélectionner les 2 colonnes "notes" et "sexe" uniquement, sans les en-têtes)

    'Sexe = sélectionner une cellule contenant le Sexe ou taper {"f", "F", "g" ou "G"}

    Dim TD As Variant 'déclare la variable TD (Tableau des Données)
    Dim I As Integer 'déclare la variable I (Incrément)
    Dim TNS() As Variant 'déclare le tableau TNS (Tableau des notes par Sexe)
    Dim J As Integer 'déclare la variable J (Incrément)
    Dim TNM() As Double 'décalre la variable TNM (Tableau des notes maximum)
    Dim T As Double 'déclare la variable T (Total)

    TD = PL 'définit le tableau de données TD
    For I = 1 To UBound(TD, 1) 'boucle sur touts les lignes du tableau TB
       If UCase(TD(I, 2)) = UCase(Cat) Then 'si la valeur en ligne I, colonne 2 du TD est égale à la variable Sexe
           ReDim Preserve TNS(J) 'redimensionne le tableau des notes par sexe TNS
           TNS(J) = CDbl(TD(I, 1)) 'récupère la note
           J = J + 1 'incrémente J
       End If 'fin de la condition
    Next I 'prochaine ligne de la boucle
    ReDim Preserve TNM(1 To NB) 'redimensionne le tableau des notes maximum TNM en fonction du nombre NB de notes prises en compte
    For I = 1 To NB 'boucle NB fois
       'attribue à TNM(I) la Ième plus grande valeur de la colonne 0 du tabelau TNS
       TNM(I) = Application.WorksheetFunction.Large(Application.Index(TNS, , 0), I)
        T = T + TNM(I) 'définit le total T
    Next I 'prochaine fois de la boucle
    MCAT = Round(T / NB, 2) 'renvoie la moyenne
    End Function

merci

asso132

Rechercher des sujets similaires à "vba moyennes meilleures notes"