VBA - calcul une moyenne

Bonjour,

J'ai une colonne qui a des données manquantes.

Je fais un code pour calculer une moyenne entre 2 cellules non vides et je recupere cette moyenne pour la mettre dans les cellules vides. A la fin, il ne reste plus aucune cellule vide.

Peut on m'aider svp? je sais faire un code qui me met la moyenne de toute une plage (car ma colonne est separee en plages distinctes).

For index = 1 To 10 ' nb de plages

i = ActiveCell.Row

premiere = i
derniere = i + 1


Do While Range("a" & derniere) = Range("a" & premiere)
derniere = derniere + 1
Loop

Range(Cells(premiere, 2), Cells(derniere - 1, 2)).Select
Set maplage = Selection

For Each Cell In maplage

If Cell <> "" Then

WorksheetFunction.Average (maplage) ' la on calcule la moyenne de la plage ALORS QUE MOI je veux calculer celle entre 2 cellules séparees par des cellules vides.

Else

maplage.SpecialCells(xlCellTypeBlanks).FormulaR1C1 = WorksheetFunction.Average(maplage)

End If

Next Cell
Cells(derniere, 2).Select

Next



End Sub

Bonsoir

Fred

74classeur1.xlsx (9.09 Ko)

Bonsoir

Ci-joint une proposition

Fred

208supermarco.xlsm (17.26 Ko)

Bonsoir Fred,

Merci beaucoup ! Le résultat est parfait.

J'ai une question: j'ai remplacé la petite série par une grande séries (>40000 lignes) et la le code bug (je n'ai pas bien compris comment il est organisé mais je pense que c'est pas grand chose, peut etre xldown ...). As tu une opinion?

Merci encore !

48supermarco2.zip (437.45 Ko)

Bonsoir

Je regarderais cela demain... je penses plutôt un dépassement de capacité des variables déclarées.

Bonne nuit

Fred

Bonjour

je viens de faire un essai avec le fichier fournit... j'ai changé la déclaration des variables... car j'avais déclarer des "integer" limiter à 65536... mais le problème ne vient pas de là....

si tu regarde dans ton fichier ligne 26491 et suivantes... jusqu’à ligne 26684 tu as des #REF! dans les cellules.... donc difficile de récupérer une valeur dans ces conditions.... le problème vient de là....

c'est une erreur de copier coller ?? ou faut-il essayé de prendre cela en compte ??

Fred

Bonjour,

Merci beaucoup et vraiment désolé, c'était mon code qui avait généré les erreurs et je ne les avais pas vu.

Donc je les ai effacé et le code fonctionne très bien jusqu'à la 30000eme environ, après il me met une erreur de "depassement de capacité".

Je pense qu'il doit y avoir un pb de format d'une donnée qui bloque le calcul, je le recherche...

Cordialement

tu as aussi des #ref plus bas vers les 31000

20supermarco2.zip (430.41 Ko)

Fred

Oui tout à fait, merci.

En fait j'ai effacé tous les REF et j'ai laissé les cellules vides pour relancer le code; et ca bloque apres 32500 environ donc je pense qu'il doit y avoir un souci sur une donnée mal formatée qui bloque l'execution du code. Je la recherche parce qu'apres je vais integrer le code dans un code plus grand et il faut que cela tienne sur plusieurs milliers de donnéées. Encore merci.

Marco

quand ca bloque... tu fais débogage...

tu vas dans l’éditeur de macro... et tu met ta souris sur i (le compteur de ligne) sur la ligne bloquée et excel te donnera la valeur actuelle..

c'est cette ligne qu'il faut aller voir ensuite...

Fred

18supermarco2.zip (432.61 Ko)

Merci ! j'ai fait ce que tu m'as dit et il indique 33208, soit la dernière cellule de la colonne et je ne vois pas d'erreur, peut etre le code veut continuer après cette ligne?

J'ai bien aimé ta declaration des variable x et y qui ressemeblent aux bornes pour calculer la moyenne, c'est subtil et pas simple à coder je trouve.

Supprime les as integer dans la déclaration des variables :

Dim i
Dim j
Dim x
Dim y

Fred

Super ca marche parfaitement. Merci beaucoup Fred !

Je suis surpris que les declarer comme integer bloque à partir d'un gd nb de ligne...En tout cas je n'aurai pas su le faire seul.

Je vais poursuivre à construire mon code.

Declarer en Integer revient a typer la variable et limite le contenu à quelque chose de compris entre -32768 et 32767....

donc si tu utilise une variable pour compter le nombre de ligne... définit en integer si tu dépasse 32767 => dépassement de capacité

pour plus d'info :

https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/data-type-summary

Fred

Merci beaucoup ! je ne savais pas qu'INTEGER était limité à 32XXX lignes ! ! !

C'est pas en ligne mais en valeur... mais quand on l'utilise en compteur de ligne... cela revient au même

n'oublie pas

Fred

Rebonsoir, Je reviens sur un point si possible. Je ne l'ai pas abordé sur le xls. Si on veut que le calcul de la moyenne se fasse dans des sous groupes et pas entre les sous groupes; il y a une contrainte supplémentaire.Cette contrainte est importante car on ne peut pas faire la moyenne entre deux sous groupes mais juste à l'intérieur d'un sous groupe.

Je me rends compte qu'on combinant ton code dans le mien, cela ne permet pas de le faire. Je joins le même xls mais avec la contrainte des sous groupes. Merci beaucoup !

13supermarco3.xlsm (25.88 Ko)

Oulala... c'est plus tout à fait la demande de départ.... il aurait été souhaitable de donner cette information dès le départ....

donc si je comprend bien... mon code ne doit fonctionner que pour les vides a l'intérieur d'un même groupe... je peux certainement adapter la chose pour que cela se fasse uniquement comme cela... mais là j'ai pas la tête a cela.... je regarderais demain

par contre toi tu as réussit a faire quand les vides sont en début ou fin de groupe ???

Fred

Rechercher des sujets similaires à "vba calcul moyenne"