Ecrire une boucle pour sélectionner et moyenner des données précises

Bonjour,

Je débute sur VBA et sur la programmation de manière générale. J'ai un gros fichier contenant énormément de données desquelles j'aimerais pouvoir sortir des moyennes. Je voudrais faire apparaître la moyenne (sur la colonne F) des données (R-R interval sur la colonne D) en fonction de la plage horaire à laquelle elles ont été enregistrées (date + heure dans la colonne A), et vu la taille du fichier il est impensable de le faire à la main. Je pense qu'il faudrait écrire une boucle permettant de sélectionner et de moyenner les données en fonction de la colonne A, mais je ne sais pas l'écrire. Je vous joins une partie du fichier, si vous avez des pistes je suis preneuse.

9aide-moyennes.csv (18.47 Ko)

Merci d'avance !

Bonjour et bienvenue sur le forum

Un essai à tester, si j'ai bien compris. Te convient-il ?

Option Explicit

Dim tablo, dico As Object
Dim i&

Sub Moyennes()

    tablo = Range("A5:D" & Range("A" & Rows.Count).End(xlUp).Row)
    Set dico = CreateObject("Scripting.Dictionary")

    For i = 1 To UBound(tablo, 1) Step 2
        If dico.exists(tablo(i, 1)) Then
            dico(tablo(i, 1)) = (dico(tablo(i, 1)) * dico.Count + tablo(i, 4)) / (dico.Count + 1)
        Else
            dico(tablo(i, 1)) = tablo(i, 4)
        End If
    Next i

    Range("F5").Resize(dico.Count, 1) = Application.Transpose(dico.keys)
    Range("G5").Resize(dico.Count, 1) = Application.Transpose(dico.items)
End Sub

Bye !

Wow c'est super, je te remercie mille fois ! Ca va me faire gagner énormément de temps.

Si jamais tu as un peu de temps (et surtout la patience) de m'expliquer un peu comment tu as procédé, ce serait super pour que j'apprenne à voler de mes propres ailes. Merci encore !

Bonjour

...de m'expliquer un peu comment tu as procédé

Option Explicit

Dim tablo, dicoN As Object, dicoV As Object
Dim i&

Sub Moyennes()

    tablo = Range("A5:D" & Range("A" & Rows.Count).End(xlUp).Row)   'Om met les données du tableau dans une variable
                                                                    'tableau, ce qui permettra à la macro de fonctionner
                                                                    'beaucoup plus vite

    Set dicoN = CreateObject("Scripting.Dictionary")            'On crée un dictionnaire qui permettra d'avoir une liste
                                                                'une liste sans doublon des des données qu'on y met

    Set dicoV = CreateObject("Scripting.Dictionary")            'idem pour un autre dictionnaire

    For i = 1 To UBound(tablo, 1) Step 2                        'on passe toutes les lisgne non vides du tableau

        If dicoN.exists(tablo(i, 1)) Then                       'si la valeur de la colonne A de la ligne existe dans
                                                                'dans le dictionnaire V, alors

                                    'On lui affecte la valeur de la nouvelle moyenne : ancienne moyenne x ancien nombre
                                    'de valeurs qui composaient cette moyenne + valeur de la colonne A sur la ligne
                                    'considérée et le tout divisé par le nouveau nombre (un de plus) de valeur de la
                                    'ligne A
            dicoV(tablo(i, 1)) = (dicoV(tablo(i, 1)) * dicoN(tablo(i, 1)) + tablo(i, 4)) / (dicoN(tablo(i, 1)) + 1)
                                    'et on incrémente de 1 la valeur dicoV affectée à la valeur de la colonne 1
            dicoN(tablo(i, 1)) = dicoN(tablo(i, 1)) + 1

        Else        'sinon (si dicoN n'existe pas encore) :
            dicoV(tablo(i, 1)) = tablo(i, 4)                'On met la valeur de la première colonne dans dicoV
                                                            'et on lui affecte cette valeur
            dicoN(tablo(i, 1)) = 1                          'On met la valeur de la première colonne dans dicoV
                                                            'et on lui affecte la valeur 1
        End If
    Next i

    Range("F5").CurrentRegion.ClearContents     'on efface la plage qui va recevoir le résultat sur la feuille de calcul
    Range("F5").Resize(dicoN.Count, 1) = Application.Transpose(dicoN.keys)  'on écrit la liste des horodates
    Range("G5").Resize(dicoV.Count, 1) = Application.Transpose(dicoV.items) 'on écrit la liste des moyennes
End Sub

Bye !

Rechercher des sujets similaires à "ecrire boucle selectionner moyenner donnees precises"