Moyenne glissante

Bonjour à tous,

Voici mon problème :

J'ai un tableau de valeurs ( 3000 lignes, 1200 colonnes). Mon objectif est de calculer une moyenne toute les 11 lignes. Je m'explique :

  • 1ere serie de données : C2:C11
  • Calculer la moyenne en C12
  • 2eme serie de données : C13:C22
  • Calculer la moyenne en C23 et ainsi de suite.

Pour que cela soit plus clair, je mets en pièce jointe un cas simplifié.

Je me suis renseigné et il semblerait qu'il faille utiliser un combo entre la fonction moyenne et décaler. J'essaye depuis un petit moment mais sans succès.

Merci d'avance pour votre aide

9test.xlsx (10.33 Ko)

slt,

regarde ici

Bonjour,

Merci pour ta réponse. Je viens de voir mais cela ne correspond pas à ce que j'ai envie de faire.

J'ai peut être abusivement utilisé le terme "moyenne glissante" à tord..

Bonjour,

A moins de passer par macro, tu ne pourras pas utiliser une formule à étendre si elle se situe dans la même colonne que les données sur lesquelles elle se base...

Ta formule de moyenne est simplifiable de cette façon : =MOYENNE.SI(C2:C11;">0")

Tu peux utiliser cette formule pour n'afficher la moyenne qu'une fois toutes les 12 lignes, sur une colonne vide du coup :

=SI(MOD(LIGNE();12)=0;MOYENNE.SI(C2:C11;">0");"")

Bonjour Pedro,

Merci pour ces réponses.

Je pensais pouvoir éviter la macro...

Bonjour Pedro,

Merci pour ces réponses.

Je pensais pouvoir éviter la macro...

Mais tu ne peux pas mettre une formule dans une cellule sans écraser la valeur qu'elle contient.

Sinon, si les lignes dans lesquelles il faut insérer la moyenne sont initialement vides (ou identifiées de manière spécifique), tu peux les filtrer et y coller une formule de moyenne sur les 12 lignes précédentes.

Mais tu ne peux pas mettre une formule dans une cellule sans écraser la valeur qu'elle contient.

Oui Pedro, j'ai bien compris ce que tu me dis.

Je vais essayer de faire un macro. J'imagine qu'avec une boucle for avec un pas de 11 je devrais m'en sortir mais n'ayant que de très faibles connaissances en vba, j'ai peur d'y passer plus de temps que prévu

Puis je me permettre de te demander un exemple de code sur un cas simple que j'adapterai à mes besoins ?

Je t'en serai éternellement reconnaissant.

Cordialement,

A tester :

Sub MoyenneXlignes()

Dim Lig As Long, LigMax As Long, Pas As Integer

With Sheets("MaFeuille") 'Nom de feuille à adapter
    Pas = 12 'Nombre de lignes à intégrer
    LigMax = .Range("A" & .Rows.Count).End(xlUp).Row 'Détermine la dernière ligne non vide en colonne A
    For Lig = Pas + 1 To LigMax Step Pas
        .Range("A", Lig) = Application.AverageIf(.Range(.Range("A" & Lig - Pas), .Range("A" & Lig - 1)), ">0") 'Inscrit le résultat "en dur"
        '.Range("A", Lig).FormulaR1C1 = "=AVERAGEIF(R[-" & Pas & "]C:R[-1]C,"">0"")" 'Inscrire la formule Excel
    Next Lig
End With

End Sub

Il est possible d'ajouter une seconde boucle pour répéter la formule sur différentes colonnes. Auquel cas on peut remplacer .Range("A" & Lig -1) par .Cells(-1, 1) par exemple.

Re le fil,

Je viens d'écrire cette macro qui fonctionne bien

Sub MoyenneSansZero()

For i = 12 To 1000 Step 11
For j = 3 To 1000

Cells(i, j).FormulaR1C1 = "=AVERAGEIF(R[-10]C:R[-1]C,"">0"")"

Next j
Next i

End Sub

Cependant, quand je souhaite l'appliquer a l'intégralité de ma feuille ( 4000 lignes et 1500 colonnes), le temps de calcul est vraiment ( >20 min).. Des idées ou suggestions pour la rendre plus robuste ?

Cordialement,

A tester :

Sub MoyenneXlignes()

Application.ScreenUpdating = False 'Désactive l'affichage le temps de l'éxécution
Application.Calculation = xlCalculationManual 'Désactive l'évaluation auto de toutes les formules à chaque modification (rapidité ++)

'Variables bien déclarées = ressources économisées !
Dim Lig As Long, LigMax As Long
Dim Col As Integer, ColMax As Integer
Dim Pas As Integer 

With Sheets("MaFeuille") 'Nom de feuille à adapter
    Pas = 10 'Nombre de lignes à intégrer
    ColMax = .Cells(1, .Columns.Count).End(xlToLeft).Column 'Détermine la dernière colonne non vide en ligne 1
    LigMax = .Range("A" & .Rows.Count).End(xlUp).Row 'Détermine la dernière ligne non vide en colonne A
    For Col = 1 To ColMax
        For Lig = Pas + 1 To LigMax Step Pas + 1
            .Cells(Lig, Col).FormulaR1C1 = "=AVERAGEIF(R[-" & Pas & "]C:R[-1]C,"">0"")" 'Inscrire la formule Excel
        Next Lig
    Next Col
End With

Applciation.Calculation = xlCalculationAutomatic

End Sub
Rechercher des sujets similaires à "moyenne glissante"