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.
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 SubBye !
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 SubBye !