Moyenne en VBA différente de Excel

Bonjour à tous,

J'essaie de trouver la bonne macro qui fasse le même résultat qu'une moyenne excel =MOYENNE(I2:I8), mais j'ai un écart

image

pour la macro :

        ws3.Cells(j + 1, 10) = Round(Application.Average(ws3.Cells(2, 10), ws3.Cells(j - 1, 10)), 2)

Merci de votre aide.

13ecole.xlsm (134.94 Ko)

Bonjour à tous,

je ne sais pas d'ou tu sort ton 8, mais ta macro donne le bon resultat !

Crdlmt

Bonjour

il faut remplacer la formule

    ws3.Cells(j + 1, 10) = Round(Application.Average(ws3.Cells(2, 10), ws3.Cells(j - 1, 10)), 2)

par

    ws3.Cells(j + 1, 10) = Round(Application.Average(range(ws3.Cells(2, 10), ws3.Cells(j - 1, 10))), 2)

j'ai fait un test avec cette formule :

Round(Application.Average(Range(Cells(2, 9), Cells(8, 9))), 2)

et c'est bon... reste a savoir ensuite si dans les boucles c'est bon...

Fred

Salut DjiDji59430

Non cela ne donne pas le bon resultat... car la formule

Application.Average(ws3.Cells(2, 9), ws3.Cells(8, 9))

prend uniquement que la cellule de la ligne 2 et 8 et fait la moyenne... (en l'occurrence 8 +8 / 2 = 8 pour la première colonne, pour la 2e (12+2) /2 = 7,....)

il faut donner un Range pour prendre les lignes de 2 à 8...

Fred

bonjour à tous,

une proposition de correction et de simplification du code.

   If ComboBox3 = "Bulletin de notes" Then
        j = 2
        For i = 2 To drn2
            If ws2.Range("F" & i) = ComboBox2 Then  'si même matiere onglet notes
                ws3.Range("H" & j) = ws2.Range("F" & i) 'matiere
                ws3.Range("I" & j) = ws2.Range("G" & i) 'note sept
                ws3.Range("J" & j) = ws2.Range("H" & i) 'note oct
                ws3.Range("K" & j) = ws2.Range("I" & i) 'note nov
                ws3.Range("L" & j) = ws2.Range("J" & i) 'note dec
                ws3.Range("M" & j) = ws2.Range("K" & i) 'note jvier
                ws3.Range("N" & j) = ws2.Range("L" & i) 'note fevr
                ws3.Range("O" & j) = ws2.Range("M" & i) 'note mar
                ws3.Range("P" & j) = ws2.Range("N" & i) 'note avr
                ws3.Range("Q" & j) = ws2.Range("O" & i) 'note mai
                j = j + 1
            End If
        Next i
        ws3.Range("F" & j + 1) = "Moyenne de la classe"
        For k = 9 To 17
            ws3.Cells(j + 1, k) = Round(Application.Average(ws3.Cells(2, k).Resize(j - 1, 1)), 2)
        Next k
    End If

Bonjour à tous,

Et merci pour vos réponses.

@djidi59430 (un chti ) désolé les titres des lignes macro/excel étaient inversés. Voilà le bon ordre.

image

@fred, bien vu pour la remarque de prendre les limites au lieu de la totalité.

mais il me reste un probléme on va dire d'arrondi, sauf pour octobre

@h2s04

trés bien la boucle pour les moyennes, cependant çà bug sur ta formule, même en remplaçant 1 par k. le resize c'est nouveau pour moi aussi.

Merci

3ecole2.xlsm (135.15 Ko)

Re... si je peux me permettre... h2so4 a donné le code :

 For k = 9 To 17
            ws3.Cells(j + 1, k) = Round(Application.Average(ws3.Cells(2, k).Resize(j - 1, 1)), 2)
        Next k

et toi tu as mis dans ton fichier :

        For k = 2 To drn2
            ws3.Cells(j + 1, k) = Round(Application.Average(ws3.Cells(2, k).Resize(j - 1, k)), 2)
        Next k

l'erreur vient de là... k représente le numéro de colonne.... pas de ligne.... et fait le calcul de la moyenne de la colonne 9 (I) à la colonne 17 (Q)

en isolant la partie qui fait la moyenne dans une sub de test :

Sub test()
Set ws3 = ActiveSheet
j = 9
For k = 9 To 17
    ws3.Cells(j + 1, k) = Round(Application.Average(ws3.Cells(2, k).Resize(j - 1, 1)), 2)
Next k
End Sub

cela donne le bon résultat

image

Fred

Bravo Fred et h2so4, çà buggait à cause de drn2, qui est à la verticale alors que la boucle est à l'horizontale.

Mais je comprends pas le resize sur 1, la 1ere ligne c'est le titre et la 1ere colonne est le matricule

image

bonjour,

resize permet de définir une plage à partir d'une cellule de départ. exemple range("F2").resize(10,1), définit une plage de 10 lignes et 1 colonne à partir de la cellule F2 (donc la plage F2:F11) range("F2").resize(9,4) -> la plage F2:I10

Re

pour le resize :

https://docs.microsoft.com/fr-fr/office/vba/api/excel.range.resize

image

le 1 veut indiqué que l'on reste sur une seule colonne... on ne redimensionne que le nombre de ligne pour faire la moyenne colonne par colonne...

Fred

Merci pour vos explications, et j'ai bien compris avec celle de hs2o4

Rechercher des sujets similaires à "moyenne vba differente"