Microsoft 365 comment faire une moyenne de valeurs contenu dans un tableau variant

Coco_lac

XLDnaute Nouveau
Bonjour,
SMA5 = Application.WorksheetFunction.Average(tab_calcul(o, 16), tab_calcul(o + IndA, 16))
Cette ligne vba ne marche pas ! Comment l'écrire svp, vous avez une idée ?
Merci pour votre aide
 

Coco_lac

XLDnaute Nouveau
Petite précision, IndA = 4
Le résultat obtenu avec la ligne average tel qu'elle est écrite additionne 2 valeurs :
tab_calcul(o, 16) + tab_calcul(o + IndA, 16) / 2
Ce que je voudrais c'est qu'elle additionne 4 valeurs :
tab_calcul(o, 16) + tab_calcul(o + 1, 16) + tab_calcul(o + 2, 16) + tab_calcul(o + 3, 16) + tab_calcul(o + 4, 16) / 4
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Coco_lac,
Un petit fichier exemple eut été bien utile.
Je ne connais pas de moyen VBA permettant de faire directement la moyenne d'un array.
Une méthode possible est de parcourir le tableau :
VB:
Sub CalculMoyenne()
    Dim tab_calcul(3, 16), i%, o%, Moyenne
' Juste pour le test, remplit le tableau avec des valeurs aléatoires
    For i = 0 To 3
        tab_calcul(i, 16) = Int(1000 * Rnd)
    Next i

'----------------------------------------------
' Calcul moyenne
    For o = 0 To UBound(tab_calcul)
        Moyenne = Moyenne + tab_calcul(o, 16)
    Next o
    Moyenne = Moyenne / (1 + UBound(tab_calcul))
'----------------------------------------------

End Sub
 

job75

XLDnaute Barbatruc
Bonjour Coco_lac, sylvanu,
SMA5 = Application.WorksheetFunction.Average(tab_calcul(o, 16), tab_calcul(o + IndA, 16))
Cette ligne vba ne marche pas ! Comment l'écrire svp, vous avez une idée ?
Cette ligne marche très bien si les variables et le tableau sont initialisés correctement :
VB:
Sub Test()
Dim o, IndA, tab_calcul(), SMA5

o = 1
IndA = 4
ReDim tab_calcul(o + IndA, 16)

tab_calcul(o, 16) = 100
tab_calcul(o + IndA, 16) = 200

SMA5 = Application.WorksheetFunction.Average(tab_calcul(o, 16), tab_calcul(o + IndA, 16))
MsgBox SMA5

End Sub
On obtient 150, moyenne de 100 et 200.

Par contre avec tab_calcul(o + IndA, 16) = Empty on obtient 50 ce qui n'est pas correct.

Et avec tab_calcul(o + IndA, 16) = "aaa" il y a bug...

A+
 

job75

XLDnaute Barbatruc
Pour obtenir le bon résultat il faut entrer les valeurs du tableau dans des cellules :
Code:
Sub Test1()
Dim o, IndA, tab_calcul(), SMA5

o = 1
IndA = 4
ReDim tab_calcul(o + IndA, 16)

tab_calcul(o, 16) = 100: [Z1] = tab_calcul(o, 16)
tab_calcul(o + IndA, 16) = Empty: [Z2] = tab_calcul(o + IndA, 16)
'tab_calcul(o + IndA, 16) = "aaa": [Z2] = tab_calcul(o + IndA, 16)

SMA5 = Application.WorksheetFunction.Average([Z1:Z2])
MsgBox SMA5

End Sub
On obtient bien 100 avec Empty ou "aaa".
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Coco_lac, Job,

La macro du post #5 est erronée, elle ne fait la moyenne que des deux éléments début et fin de l'array.
Dans ce cas on est obligé de passer par des cellules comme la macro du post #6.

Mais si on veut faire la moyenne directement à partir d'un array, sans passer par des cellules, alors je ne connais pas de moyen VBA de le faire, sauf à passer par une boucle comme indiqué au post #3.
 

job75

XLDnaute Barbatruc
Evidemment s'il y a beaucoup d'éléments à traiter on utilisera une boucle.

Mais en ne retenant que les valeurs numériques et en les entrant dans un tableau auxiliaire :
VB:
Sub Test2()
Dim o&, IndA&, tab_calcul(), i&, aux(), n&, SMA5

o = 1
IndA = 4
ReDim tab_calcul(o + IndA, 16)

tab_calcul(o, 16) = 100
tab_calcul(o + 1, 16) = 200
tab_calcul(o + 2, 16) = 300
tab_calcul(o + 3, 16) = 400
tab_calcul(o + 4, 16) = Empty '"aaa"


For i = LBound(tab_calcul, 1) To UBound(tab_calcul, 1)
    If IsNumeric(tab_calcul(i, 16)) Then
        ReDim Preserve aux(n) 'tableau auxiliaire base 0
        aux(n) = tab_calcul(i, 16)
        n = n + 1
    End If
Next

SMA5 = Application.WorksheetFunction.Average(aux)
MsgBox SMA5

End Sub
 

job75

XLDnaute Barbatruc
Une chose importante à bien comprendre avec la macro précédente.

Empty est considéré en VBA comme numérique et la dernière valeur est donc récupérée.

Mais comme elle se trouve dans un tableau (auxiliaire) elle n'est pas traitée dans la moyenne.

Contrairement à ce qui est observé au post #5.
 

Coco_lac

XLDnaute Nouveau
Bonjour à tous,
Merci pour toutes vos idées qui chaque fois me font progresser!
J'ai remédier au problème en créant une macro que j'ai appelé "Sub Moyenne"!
J'ai dans ma macro principale plusieurs moyennes à faire, j'initialise les variables puis j'appelle "Sub Moyenne", aprés avoir initialisé les variables :
(Exemple pour cette ligne:
SMA5 = Application.WorksheetFunction.Average(tab_calcul(o, 16), tab_calcul(o + IndA, 16))

Colum = 16
Delta = IndA
Depart = o

Call Moyenne
|
|
V
Sub Moyenne()
somme = 0
iii = 0
For a = 0 To Delta
somme = somme + tab_calcul(Depart + iii, Colum)
iii = iii + 1
Next a
Somme_Moy = somme / (Delta + 1)
End Sub
|
|
V
SMA5 = Somme_Moy
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 925
Membres
101 841
dernier inscrit
ferid87