Calcul de moyenne et écart type VBA vs Excel
Bonjour,
Je vous contacte car j'aurais besoin de vos lumières, je cherche à calculer les moyennes et l'écarts type de lignes comptant environ 1500 données.
Je souhaite utiliser VBA pour cela j'ai donc fait appel à la fonction Application.Average(ligne) avec ligne un "tableau" d'une ligne et j'obtiens un certain résultat. Sauf que lorsque j'utilise simplement la fonction "moyenne" dans excel j'obtiens un autre résultat que je retrouve lorsque je fais une moyenne arithmétique "à la main" dans VBA (avec la somme...).
J'observe la même chose pour l'écart type.
Savez-vous pourquoi cette différence ? S'agit il de définition différente de moyenne et d'écart type ?
Je vous remercie par avance de votre réponse.
Bonne journée
Bonjour,
peux-tu mettre ton classeur avec ton code et des données exemples qui permettent de reproduire ton problème ?
Bonjour,
Je vous remercie de votre retour, je suis tout à fait d'accord pour vous partager mes données mais c'est un peu le bazar... Je vous transmets les codes si dessous mais n'hésitez pas à me redemander les données.
Pour le calcul avec les fonctions de VBA
Sub Normalisation()
'Soit ligne le tableau représentant la ligne pour le calcul de la moyenne et de l'écart type
'Soit avg et dev les colonnes avec les moyennes et écarts type de chaque ligne
' le calcul des valeur centrée réduites et t les valeurs brutes
Dim ligne()
Dim avg()
Dim dev()
Dim x()
Dim t()
Dim i As Long, j As Long
Dim d As Long, F As Long, k As Long, l As Long
d = Sheets("test").Range("E2").Value
F = Sheets("test").Range("E3").Value
k = Sheets("test").Range("G2").Value
l = Sheets("test").Range("G3").Value
ReDim avg(k To l, 1)
ReDim dev(l, 1)
ReDim t(k To l, d To F)
ReDim x(k To l, d To F)
'Pour chaque ligne calcul des moyenne et écrats types
For i = k To l
ligne = Worksheets("test").Rows(i).Value
avg(i, 1) = Application.Average(ligne)
dev(i, 1) = Application.StDev(ligne)
Next
'Pour chaque valeur calcul de la valeur centrée réduite
For i = k To l
For j = d To F
t(i, j) = Sheets("test").Cells(i, j).Value
x(i, j) = (t(i, j) - avg(i, 1)) / dev(i, 1)
Next
'Restitution des avg et dev sur la dernière colonne
Sheets("Norme").Cells(i, 1667) = dev(i, 1)
Sheets("Norme").Cells(i, 1668) = avg(i, 1)
Next
MsgBox ("sortie de boucle")
'Restitution des valeurs calculées centrée réduites
Sheets("Norme").Cells(k, d).Resize(l - k + 1, F - d + 1) = x
MsgBox ("Normalisation centrée-réduite")
End Sub
Pour le calcul "à la main" :
Dim S As Long
Dim moy()
Dim t()
ReDim moy(l, 1)
ReDim t(k To l, d To F)
For i = k To l
S = 0
For j = d To F
t(i, j) = Sheets("test").Cells(i, j).Value
S = S + t(i, j)
Next
'moy(i, 1) = S / (F - d + 1)
'Sheets("Norme").Cells(i, 1666) = moy(i, 1)
Next
Je ne comprends pas pourquoi les résultats sont différents sachant que le même résultat est trouvée par la fonction "moyenne" dans les cellules excel que dans le calcul "à la main".
Je vous remercie encore de votre aide.
Bonne journée :)
bonjour,
d'après ton code de calcul manuel, tu veux calculer la moyenne et l'écart type des données qui se trouvent entre les colonnes d et F. Dans ton code avec les fonctions excel, tu fais le calcul avec toutes les données de la ligne. Y a-t-il des données en dehors de ces colonnes sur la même ligne ?
Bonjour,
En effet, c'était bien une erreur bête... le nombre de colonne !
Merci beaucoup !
Bon weekend à vous !