Macro calcul de Moyenne selon coefficient

carlos

XLDnaute Impliqué
Supporter XLD
Bonjour

je recherche une macro qui me calcule la moyenne pour chaque élève selon le coefficient correspondant en $C$4:$E$4 .

La difficulté reside dans le fait que je peux avoir du texte dans les cellules ou bien des cellules vides (qui ne valent pas 0).....


Merci de m'aider

Pj : Voir fichier

Carlos [file name=MoyenneSelonCoef.zip size=7906]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/MoyenneSelonCoef.zip[/file]
 

Pièces jointes

  • MoyenneSelonCoef.zip
    7.7 KB · Affichages: 96

carlos

XLDnaute Impliqué
Supporter XLD
Bonjour
g un peu avancé et voici le code Maj dans le nouveau fichier .
si je met for i = 6 to 6 le calcul de la moyenne est bon en f6
Mais si je met for i = 5 to 6 alors le coef3=1 et ca marche plus car le resultat est egal à 2au lieu de 3.

Public Sub moyenne1()
Dim somme As Byte
Dim c1 As Variant
Dim c2 As Variant
Dim c3 As Variant
Dim myRange As Variant
Dim sommecoef As Byte
Dim coef1 As Byte
Dim coef2 As Byte
Dim coef3 As Byte
Dim i As Byte
For i = 5 To 6
c1 = Range('c' & i).Value 'c1 = Range('c6').Value
c2 = Range('d' & i).Value 'c2 = Range('d6').Value
c3 = Range('e' & i).Value 'c3 = Range('e6').Value

If IsNumeric(c1) And c1 <> '' Then coef1 = Range('c4').Value Else
If Not IsNumeric(c1) Then c1 = 0 And coef1 = 0
If IsNumeric(c2) And c2 <> '' Then coef2 = Range('d4').Value Else
If Not IsNumeric(c2) = True Then c2 = 0 And coef2 = 0
If IsNumeric(c3) And c3 <> '' Then coef3 = Range('e4').Value Else
If Not IsNumeric(c3) Then c3 = 0 And coef3 = 0

sommecoef = coef1 + coef2 + coef3
somme = c1 * coef1 + c2 * coef2 + c3 * coef3
Range('f' & i) = somme / sommecoef
'MsgBox somme / nbval
Next i
End Sub

Merci [file name=MoyenneSelonCoef_20050908144542.zip size=9996]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/MoyenneSelonCoef_20050908144542.zip[/file]
 

Pièces jointes

  • MoyenneSelonCoef_20050908144542.zip
    9.8 KB · Affichages: 55

myDearFriend!

XLDnaute Barbatruc
Bonjour carlos, sousou,

Ci-joint, peut-être une autre façon de faire (à vérifier)...

J'ai utilisé la procédure suivante :
Sub Traitement()
Dim TabTemp As Variant
Dim
L As Long
Dim
C As Byte
      Application.ScreenUpdating = False
      With Sheets('Feuil1')
            L = .Range('C65536').End(xlUp).Row
            'Efface anciennes moyennes
            Range(Cells(5, 6), Cells(L, 6)).ClearContents
            'Charge les données dans un tableau variant temporaire
            TabTemp = .Range(.Cells(5, 3), .Cells(L, 6)).Value
      End With
      'Pour chaque ligne
      For L = 1 To UBound(TabTemp, 1)
            'Pour chaque note
            For C = 1 To 3
                  If TabTemp(L, C) <> '' Then
                        'On se sert de la 4ème colonne pour cumuler et mémoriser les
                        'coefficients 'valides'
                        TabTemp(L, 4) = TabTemp(L, 4) + IIf(IsNumeric(TabTemp(L, C)), _
                                                Choose(C, 1, 3, 2), 0)
                        'On remplace chaque note par son équivalent 'coefficienté'
                        TabTemp(L, C) = IIf(IsNumeric(TabTemp(L, C)), TabTemp(L, C), 0)
                        TabTemp(L, C) = TabTemp(L, C) * Choose(C, 1, 3, 2)
                  End If
            Next C
            'MAJ des moyennes
            If TabTemp(L, 4) > 0 Then
                  Cells(L + 4, 6).Value = (TabTemp(L, 1) + TabTemp(L, 2) + TabTemp(L, 3)) / _
                                                  TabTemp(L, 4)
            Else
                  Cells(L + 4, 6).Value = ''
            End If
      Next L
      Application.ScreenUpdating = True
End Sub
Cordialement, [file name=PourCarlos.zip size=14250]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/PourCarlos.zip[/file]
 

Pièces jointes

  • PourCarlos.zip
    13.9 KB · Affichages: 57

carlos

XLDnaute Impliqué
Supporter XLD
Bonjour MyDearFriend

tu es deconcertant tant par la rapidité de ta réponse que sa qualité ..

Ta proposition fonctionne à merveille ET avant de la decortiquer pour la comprendre peux tu m'expliquer pourquoi la mienne ne marche pas Sniff.

Faut il passer par un tableau temporaire ?


Merci encore mille fois

Carlos
 

sousou

XLDnaute Barbatruc
Salut à tous

Une fonction cela devrait te plaire [file name=MoyenneSelonCoef_20050908152811.zip size=9201]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/MoyenneSelonCoef_20050908152811.zip[/file]
 

Pièces jointes

  • MoyenneSelonCoef_20050908152811.zip
    9 KB · Affichages: 50

Monique

Nous a quitté
Repose en paix
Bonjour,

Avec formule
En F5 :
=SI(NB(C5:E5)=0;'';SOMMEPROD(SI(ESTNUM(C5:E5);C5:E5*C$4:E$4))/NB(C5:E5))

Formule matricielle, à valider par ctrl, maj et entrée

Edit
J'ai oublié un morceau et pas besoin du 'Prod'
En F5
=SI(NB(C5:E5)=0;'';SOMME(SI(ESTNUM(C5:E5);C5:E5*C$4:E$4))/SOMME(SI(ESTNUM(C5:E5);C$4:E$4)))
à valider par ctrl, maj et entrée

Message édité par: Monique, à: 08/09/2005 15:58
 

carlos

XLDnaute Impliqué
Supporter XLD
Re bonjour MyDearFriend! , Sousou et Monique

Concernant la macro de MyDearFriend!

J'aurais dû te dire que je voulais aussi modifier les coefficients ..

G essayé du genre : Voir fichier joint

Sub Traitement()
Dim TabTemp As Variant
Dim L As Long
Dim C As Byte

Dim coef1 As Byte
Dim coef1 As Byte
Dim coef1 As Byte


Application.ScreenUpdating = False


coef1 = Cells(4, 3).Value
coef2 = Cells(4, 4).Value
coef3 = Cells(4, 5).Value


With Sheets('Feuil1')
L = .Range('C65536').End(xlUp).Row
'Efface anciennes moyennes
Range(Cells(5, 6), Cells(L, 6)).ClearContents
'Charge les données dans un tableau variant temporaire
TabTemp = .Range(.Cells(5, 3), .Cells(L, 6)).Value
End With
'Pour chaque ligne
For L = 1 To UBound(TabTemp, 1)
'Pour chaque note
For C = 1 To 3
If TabTemp(L, C) <> '' Then
'On se sert de la 4ème colonne pour cumuler et mémoriser les coefficients 'valides'
TabTemp(L, 4) = TabTemp(L, 4) + IIf(IsNumeric(TabTemp(L, C)), Choose(C, coef1, coef2, coef3), 0)
'On remplace chaque note par son équivalent 'coefficienté'
TabTemp(L, C) = IIf(IsNumeric(TabTemp(L, C)), TabTemp(L, C), 0)
TabTemp(L, C) = TabTemp(L, C) * Choose(C, coef1, coef2, coef3)
End If
Next C
'MAJ des moyennes
If TabTemp(L, 4) > 0 Then
Cells(L + 4, 6).Value = (TabTemp(L, 1) + TabTemp(L, 2) + TabTemp(L, 3)) / TabTemp(L, 4)
Else
Cells(L + 4, 6).Value = ''
End If
Next L
Application.ScreenUpdating = True
End Sub

Merci [file name=PourCarlos_20050908160515.zip size=13355]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/PourCarlos_20050908160515.zip[/file]
 

Pièces jointes

  • PourCarlos_20050908160515.zip
    13 KB · Affichages: 35

myDearFriend!

XLDnaute Barbatruc
Bonjour Monique (tes formules m'étonneront toujours et j'espère qu'un jour j'arriverais à les comprendre...),
Re sousou, carlos,

Carlos, la modification que tu apportes au fichier fonctionne correctement dès lors que tu remplaces :
Dim coef1 As Byte
Dim coef1 As Byte
Dim coef1 As Byte
Par ça ;) :
Dim coef1 As Byte
Dim coef2 As Byte
Dim coef3 As Byte
Tu n'as pas un peu l'impression de t'être précipité un peu là Carlos ?
:)

Cela dit, pour ton code plus haut qui ne fonctionnait pas (celui de ton post de 14:45), je t'informe que cela est notamment du à une mauvaise syntaxe de tes tests conditionnels   (j'avoue que ta façon de faire les 'If... Then... Else...' me laisse perplexe...).

Par ailleurs, quand tu fais :

      If Not IsNumeric(c1) Then c1 = 0 And coef1 = 0

je suppose que ton intention était plutôt d'obtenir quelque chose comme ça :

      If Not IsNumeric(c1) Then
            c1 = 0
            Coef1 = 0

      End If

Attention, AND est un opérateur logique pour VBA (voir l'aide)...

Cordialement,
 

carlos

XLDnaute Impliqué
Supporter XLD
Re bonjour MydearFriend! Monique et sousou

c vrai g manqué de vigilance mais c'etait plutot du fremissement à l'idée d'aboutir

Alors là FELICITATION car vous etes au top.

merci pour tes conseils MonCherAmi! , j'adore ta grimace ....

Et ta formule Monique m'interesse aussi beaucoup car si je veux extraire par exemple la moyenne des 2 meilleurs notes avec coefficient je saurais à qui m'adresser par exemple ....

:whistle:

Si quelqu'un à une idée


Merci
 

Discussions similaires

Statistiques des forums

Discussions
312 970
Messages
2 094 044
Membres
105 926
dernier inscrit
Odyssea