Calcul moyennes VBA

Bonjour à tous les membres de forum.excel-pratique,

Je viens de commencer à apprendre le VBA et on m'a demandé de résoudre un problème de calcul de moyennes. Seulement, avec mon peu de connaissances et d'expériences, je ne vois pas comment faire. Voici mon problème : J'ai un tableau de 20000 lignes sur Excel composé de blocs périodiques.

Bloc 1 : 25 lignes et 13 colonnes

Bloc 2 : 6 lignes et beaucoup de colonnes

Il y a un bloc 2 tous les 14 (nombre à rentrer par l'utilisateur) blocs 1

Mon but est de calculer les moyennes de certaines des cellules de chaque bloc. Par exemple, la moyenne de chacune des cellules (ligne 1, colonne 1) de chaque bloc 1.

Je joins quelques lignes pour que vous voyez à quoi cela ressemble. (moyenne des nombres en rouge pour mon exemple, lignes à traiter en gris):

J'ai écrit un code en C++ pour le calcul par exemple de la moyenne de toutes les cellules 1 de chaque bloc 1 mais je pense que même ce code n'est pas correct.

int m1=0;                                                 // nombre pour stocker la somme des différentes                          cellules pour faire la moyenne
int Period = 14;
for(int m=0, int c=0; c<=Period-1;;m++,c++)               // (1+m) est le nb total de bloc 2; c est le compteur de blocs 1 entre deux blocs 2
{
    for(int n=0;n<=13;n++) 
    {
    while(Cell(17+l*m+((Period-1)*n),1)<>0)               // Condition d'arrêt : la cellule est vide;    Cell(i,j) : cellule de ligne i et colonne j
    {
    m1+= Cell(17+l*m+((Period-1)*n),1);                  // On incrémente m1; l: nb lignes du bloc2

    }
    }
return (1/(Period*(m+1)))*m1;                            // On divise par le nombre de cellules :             Period*(m+1)
}

Je remercie par avance la personne qui voudra bien m'aider, cela m'aiderait énormément.

Bonsoir,

C'est vraiment très concis le C

Une proposition :

Sub moyenne()
    Dim cell1 As Range, nbBloc1 As Long, tailleBloc1 As Long, tailleBloc2 As Long
    Dim data As Variant, nbVal As Long, moyVal() As Double, nbMoy As Long
    Dim offsetCells As Variant, lig As Long
    Dim i As Long
    Set cell1 = [E17]
    nbBloc1 = 14
    tailleBloc1 = 25
    tailleBloc2 = 6
    ' liste des offsets par rapport à Cell1 des cellules à moyenner
    ' ligne,colonne pour chaque cellule
    ' ex: E17, F17, I22 => (0, 0, 0, 1, 5, 4) si cell1 = [E17]
    offsetCells = Array(0, 0, 0, 1, 5, 4)
    nbMoy = (UBound(offsetCells) + 1) / 2
    ReDim moyVal(1 To nbMoy)
    '
    data = Range(cell1, cell1.SpecialCells(xlLastCell))
    lig = 1
    Do
        nbVal = nbVal + 1
        For i = 1 To nbMoy
            ' additionner valeur
            moyVal(i) = moyVal(i) + data(lig + offsetCells((i - 1) * 2), offsetCells((i - 1) * 2 + 1) + 1)
        Next i
        lig = lig + tailleBloc1 - (nbVal Mod nbBloc1 = 0) * tailleBloc2 ' ligne1 bloc suivant, si nbBloc1 atteint on ajoute tailleBloc2
    Loop Until lig > UBound(data)
    For i = 1 To nbMoy
        moyVal(i) = moyVal(i) / nbVal
    Next i
    Feuil2.[B:B].ClearContents
    Feuil2.[B2].Resize(nbMoy) = Application.Transpose(moyVal)
End Sub

Pour ce qui est de la taille des blocs j'ai mis en dur pour les tests. Il faudra ajouter cette partie interrogation de l'utilisateur.

Tu as aussi la 1ère cellule à renseigner (E17), si c'est variable il faudra aussi interroger l'utilisateur.

Et tu as également offsetCells à renseigner : c'est la liste des cellules dont tu veux la moyenne. Il faut indiquer l'offset ligne, colonne par rapport à Cell1. Si ce n'est pas clair je développerai.

(tu as dit "de certaines des cellules de chaque bloc"..., tu n'as pas été précis. J'espère pour toi que tu n'en as pas 50, j'aurais fait autrement sinon)

Je suis parti du principe que toutes les cellules à moyenner étaient renseignées et qu'il n'y avait pas de tests à faire dessus.

Et qu'il n'y a pas de lignes inutiles en fin de tableau. Si c'est le cas il faudra retailler data = Range(cell1, cell1.SpecialCells(xlLastCell))

Je n'ai fait aucun contrôle à part m'assurer que je récupérai bien les bonnes cellules sur le bloc1, et que mes lignes 1 de chaque bloc étaient correctes, y compris après le passage du 14ème bloc.

Je te laisse contrôler les résultats...

eric

PS: en regardant de plus près ta colonne A il aurait mieux valu partir du fait que chaque bloc commence a Profiles_Velocity_X (ou n'importe quelle chaine constante). Tu n'avais rien à demander à l'utilisateur...

26exemple.zip (52.16 Ko)

Bonjour,

Je vous remercie pour votre réponse. En fait, je pense ne pas avoir été assez clair.

Le but est de calculer la moyenne par exemple de E17, E42, E67, E92, ... jusqu'à la fin. Cela constituera la première case du tableau-moyenne du bloc 1. Ensuite, la deuxième case est la moyenne de F17, F42, F67, F92... et ainsi de suite pour les 5 lignes grisées du bloc 1. Cela représente 13*4 moyennes. Le tableau-moyenne du bloc 1 sera donc constitué de 4*13 cases (lignes X,Y,Z1,Z2) + 1 case (Time_Stamp)

Et puis, il y a la même chose avec les lignes grisées du bloc 2 : moyenne de E370, E748, E1126, E1504,...

Cela constituera la première case du tableau-moyenne du bloc 2. (tableau de 2 cases seulement, la deuxième étant la moyenne de E371, E749, E1127, E1505, ...). Les valeurs de E11 et E12 pourront être ajoutées à ce tableau car constantes (pas de moyenne à calculer)

Je précise que mon tableau brut avec tous les blocs (1 et 2) fait dans les 23000 lignes et que le résultat sera donc deux tableaux-moyenne respectivement pour le bloc 1 (4*13 +1 cases) et le bloc 2 (2+2 cases).

J'espère avoir été clair et vous remercie de l'attention que vous portez à mon problème.

Bonjour,

Donc ce n'est pas calculer les moyennes de certaines des cellules de chaque bloc., mais pour toutes les cellules de certaines lignes.

1h de boulot pour rien, bref...

Aucune réaction sur mon PS.

Si en Feuil2 tu mets une liste comme :

Profiles_Velocity_X

Profiles_Velocity_Y

Profiles_Velocity_Z1

le programme balaierait toutes les lignes avec Profiles_Velocity_X pour en faire la moyenne colonne par colonne.

Idem pour chaque libellé.

Ce ne serait pas mieux comme fonctionnement ? Plus besoin de demander quoique ce soit à l'utilisateur.

Et est-ce que les valeurs démarrent toujours en E, sont toujours toutes numériques et ont toujours un ] final ?

eric

Bonjour,

Je suis vraiment désolé de m'être mal exprimé et de vous avoir fait perdre 1h de votre temps à cause de ça. Je m'en excuse.

Mais vous avez raison, les valeurs démarrent toujours en colonne E, sont toutes numériques et ont toujours un crochet à la fin.

Effectivement, cela simplifie le problème en parcourant les lignes en fonction de leurs noms, c'est astucieux. Si j'ai bien compris, il faudrait faire un tableau intermédiaire trié pour chacune des lignes intéressantes ? Mais je n'ai pas les outils pour le faire, pourriez-vous développer ?

"Aucune réaction sur mon PS" : je n'ai pas compris ce que vous vouliez me dire.

Peut-être vouliez-vous me dire que je n'ai pas commenté votre code. En fait, je l'ai étudié mais certains passages me sont encore obscurs, comme le fait d'utiliser offsetCells = Array(0, 0, 0, 1, 5, 4).

Je m'excuse encore de mon manque de précision et vous remercie de l'attention que vous portez à ce problème.

Si j'ai bien compris, il faudrait faire un tableau intermédiaire trié pour chacune des lignes intéressantes ?

Juste copier-coller les libellés qui t'interessent en colonne A, c'est tout.

Mais pas sûr de le faire ce soir

eric

Bonsoir,

Vous n'avez pas besoin de répondre aujourd'hui si vous n'avez pas le temps.

Juste copier-coller les libellés qui t'intéressent en colonne A, c'est tout.

Je n'ai pas trop compris, je pensais qu'il fallait stocker les valeurs dans un tableau intermédiaire pour chaque ligne (X,Y,...) avant de faire la moyenne par colonne. Par exemple pour X, un tableau intermédiaire de 13*(nb de blocs 1) cellules. J'attends de voir votre méthode car elle semble astucieuse.

Je vous souhaite une bonne soirée par ailleurs.

Re,

et ont toujours un crochet à la fin.

Pas les lignes 367 et suivantes.

C'est un accident et elles y sont sur les vrais fichiers ?

eric

Re,

Pour les lignes 367 et suivantes, c'est un bloc 2 qui a un très grand nombre de colonnes. Je ne les ai pas toutes mises mais à la fin, les lignes se finissent par un crochet. Mais ces lignes ne sont pas intéressantes (non grisées) de toute façon. Dans le bloc 2, il faut seulement faire les moyennes de 2 cellules : Timestamp et Bottomdis (grisées).

J'espère avoir été clair. Dites-le moi dans le cas contraire.

J'ai rajouté les ]

Si c'est sur une ligne qui t’intéresse il faut absolument qu'il soit présent sinon tu perds la dernière moyenne.

Tu as juste à copier-coller les libellés (il faut qu'ils soient identiques) à partir de Feuil2!A2 et cliquer sur le bouton.

J'ai laissé 3 colonnes vides à ta disposition, et comme ça on est aligné sur les colonnes de données

J'ai ajouté aussi le nombre de valeurs prises en compte pour chaque moyenne, ça permet un contrôle sommaire.

Tu peux avoir une ligne de titre à condition que A1 ne corresponde pas à un libellé voulu (si ce sont des données en ligne 1 pas de problème).

Regarde si ça te va.

eric

PS: une ligne de code réclame ton attention :

Exit For ' ligne à enlever si il peut y avoir une absence complète de valeur au milieu d'une ligne

Ca accélère un peu le traitement mais à enlever si tu peux avoir des cellules vides au milieu.

34exemple-2.zip (56.41 Ko)

Re,

Je n'ai pas compris où coller les libellés car ils sont déjà présents en Feuille 2. Excel me signale "objet requis" après exécution. Je n'ai pas vraiment compris, pourriez-vous être plus précis ?

Je vous remercie par avance.

Bonjour,

Merci beaucoup !

J'ai finalement essayé sur mon fichier en xlsx et ai exécuté le code. Cela a cette fois-ci fonctionné sans erreur.

Je vais étudier le code demain après-midi. Ne serait-il pas possible d'automatiser le copier-coller ?

Encore merci pour votre aide.

Automatiser quel copié-collé ?

Tu fais ta liste une fois, et tant que ton besoin n'évolue pas tu n'y touches plus.

Le jour où tu as besoin d'une nouvelle moyenne tu as juste à ajouter le nouveau libellé à prendre en compte.

eric

Rechercher des sujets similaires à "calcul moyennes vba"