[Excel] Calcul de moyenne automatisé

Calcul de moyenne automatisé [Excel] - VB/VBA/VBS - Programmation

Marsh Posté le 09-07-2009 à 04:43:19    

Bonjour tout le monde, j'expose brièvement mon "problème"
 
Suite à des expériences (mesures de coefficient de frottement) j'ai au final énormément de valeurs (temps, coefficient de frottement), un peu plus d'un million. Le logiciel de mesure me donne ça dans un fichier texte que j'ai pu importer sous Excel sans problèmes et il faut à partir de ces données que je trace un graphe coef=f(temps), un truc tout con donc. Le problème c'est qu'il faut au maximum 32000 entrées pour pouvoir tracer un graphe sous excel :\
 
Ma question est donc assez simple, comment faire une macro qui prend par exemple 40 valeurs successives, en fait la moyenne et met cette valeur dans une autre colonne, ceci pour le temps et le coefficient mesuré et en enchainant toutes les 40 valeurs (une boucle avec un itérateur incrémenté de 40 à chaque passage par exemple). J'imagine que c'est assez simple mais je n'ai aucune notion de VBA et de l'utilisation de macros sous Excel (j'ai des bases en c/c++ donc je pense pouvoir comprendre l'algo).
 
Donc au final le but serait d'obtenir 2 nouvelles colonnes (dans la même feuille ça va très bien) temps_m et coef_m comportant un peu moins de 32000 entrées chacune!
 
PS: j'ai un Excel anglais, je sais pas si ça change quelque chose au niveau des fonctions utilisables pour les macros.
 
PS2: j'envisage l'algo un peu comme ça, je sais pas si c'est le plus efficace mais c'est ce qui m'est venu à l'esprit:
Colonne A: temps, Colonne B: coef, Colonne C: temps_m(oyenné), Colonne D: coef_m(oyenné)
 
int j=1
Pour i=1 à fin(ColonneA)
     t_tmp=moyenne(A(i):A(i+40))
     c_tmp=moyenne(B(i):B(i+40))
     C(j)=t_tmp
     D(j)=c_tmp
     j=j+1
     i=i+41
fin pour
 
Un grand merci d'avance pour vos réponses :)
 
OinJ


Message édité par OinJ le 09-07-2009 à 04:44:02
Reply

Marsh Posté le 09-07-2009 à 04:43:19   

Reply

Marsh Posté le 09-07-2009 à 10:24:40    

Oui je ferais cela de la même manière. C'est la bonne voie.
L'Excel en anglais n'a aucune importance: en Visual Basic, les noms des method et properties est toujours uniquement en anglais.
Moyenne --> Average

Reply

Marsh Posté le 10-07-2009 à 05:09:59    

C'est re-moi, donc j'ai regardé un peu comment fonctionnait VBA et son utilisation avec Excel et j'ai pondu ça:  
 

Code :
  1. Private Sub Calcul_Click()
  2. Dim n1 As Double, n2 As Double, i As Double
  3. '--- Popup pour demander n1 et n2
  4. n1 = InputBox("Premiere ligne " )
  5. n2 = InputBox("Derniere ligne " )
  6. i = n1
  7. Dim j As Integer
  8. j = 2
  9. '--- Boucle while: while i<n2 do ...
  10. While i < n2
  11.     Dim range_tmp As Range, time_m As Double, coef_tmp As Double
  12. '--- Moyenne du temps puis affectation dans moy en Aj
  13.     Set range_tmp = Sheet1.Range(Cells(i, 1), Cells(i + 40, 1))
  14.     time_m = WorksheetFunction.Average(range_tmp)
  15.     Sheet3.Cells(j, 1).Value = time_m
  16. '--- Moyenne du coef puis affectation dans moy en Bj
  17.     Set range_tmp = Sheet1.Range(Cells(i, 4), Cells(i + 40, 4))
  18.     coef_tmp = WorksheetFunction.Average(range_tmp)
  19.     Sheet3.Cells(j, 2).Value = coef_tmp
  20.     j = j + 1
  21.     i = i + 41
  22. Wend
  23. End Sub


 
Donc pour clarifier un peu:
 
La Sheet1 est là où j'ai mes données, le temps en A et le coef en D.
La Sheet2 est la feuille où je veux mettre mes valeurs moyennées, en A le temps et en B le coef.
 
Ca a l'air de plutôt bien fonctionner, pour traiter 1 million de lignes ça met un peu moins de 10 secondes! Est-ce que vous pensez que y a moyen d'améliorer le code pour que ça aille un peu plus vite ou pour la "beauté du code? C'est pas nécessaire mais c'est juste par curiosité ^^
 
Merci d'avance :)

Reply

Marsh Posté le 17-07-2009 à 16:10:45    

Non c'est très bien comme cela, tu sais VBA c'est interprété donc pas rapide...

Reply

Marsh Posté le 21-07-2009 à 15:31:14    

Bonjour
 
Oui tu peux masquer l'execution d'excel pendant ta macro :
 
Application.screenupdating=false
et a la fin de ta macro
Application.screenupdating=true
 
Comme tu vois pas ce que fait excel, tu gagnes quelques secondes (voir minutes pour les gros gros traitements)


---------------
Soyez malin, louez entre voisins !
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed