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

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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
 
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
 
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
 
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+
 
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".
 
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.
 
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
 
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.
 
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
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour