Faire des moyennes sur des zones d'une même colonne

Bonjour, Pour des calculs statistiques sur des données fournies par une machine de test, je me retrouve avec une colonne contenant une série de valeurs négatives, puis positives, puis négatives, etc... (données cycliques), le tout dans la même colonne. Je cherche le moyen de pouvoir calculer avec le moins de manipulations possible la moyenne des valeurs négatives, puis des valeurs positives, puis des valeurs négatives suivantes, et ainsi de suite. J'ai déjà isolé dans des colonnes séparées les valeurs positives et négatives par une condition IF, mais il me reste quand même plusieurs groupes de valeurs (négatives dans une colonne, positives dans l'autre), et je dois faire la moyenne de chaque groupe. Pour être clair, ce n'est pas la moyenne de toutes les valeurs négatives et positives (ce serait facile), mais la moyenne de chaque groupe correspondant à un cycle de la machine.

Désolé de la longueur, Merci des infos si c'est possible !

LucM

Bonjour et bienvenu sur le forum,

Un fichier joint serait utile pour mieux cerner ton problème. Peux-tu nous le joindre ?

Je vais essayer. Pour l'instant le fichier est lourd car il contient plein d'autres choses, mais je vais le réduire à la question posée. A bientôt.

LucM

Alors j'ai tout réduit à sa plus simple expression, mais le fichier fait malgré tout 600Ko env., et donc je ne peux pas le joindre, car il faut des fichiers de max. 100Ko, ce qui n'est pas évident à faire avec Excel.

LucM

Voilà ! En fait il vaut mieux créer un nouveau fichier, car Excel semble-t-il garde beaucoup de données, et effacer les lignes ne suffit pas !

Des informations complmentaires sont insérées dans le fichier.

Merci si vous voyez une solution.

Bonjour Luc,

En attendant ton fichier, j'étais parti sur mon idée de solution.

Je viens de l'adapter à ton fichier, dis moi ce que tu en penses ?

https://www.excel-pratique.com/~files/doc/zhkJ0Moyennes.xls

Remarque : ça se passe par VBA.

Il te faut donc autoriser la macro à s'exécuter.

Pour cela Outils/Macros/Sécurité ==> niveau moyen (Avant d'ouvrir le fichier)

Ah ben c'est super cool ça !

Bon j'ai jeté un oeil au contenu de la macro ... hum !

Sais-tu comment je pourrais importer cette macro dans mon fichier originel ?

Y aura sûrement des n° de colonne à ajuster, mais je devrais me débrouiller !

En tout cas merci Sylvain

Bonjour,

Sylvain, tu peux également utiliser la fonction Sgn

If Sgn(cel) <> Sgn(cel.Offset(1, 0)) Then

Amicalement

LucM a écrit :

Sais-tu comment je pourrais importer cette macro dans mon fichier originel ?

Ok... t'es bien assis ?

  • Dans ton classeur Excel tu fais Affichage/Barres d'outils/Boîte à outils contrôle
  • Dans cette barre tu cliques sur l'équerre bleue "Mode Création"
  • Clic droit sur le bouton "Calculer les moyennes" et "Copier"
  • Dans ton classeur originel ==> "Coller"
  • Dans ce classeur aussi tu cliques sur l'équerre bleue "Mode Création"
  • Clic droit sur ton nouveau bouton et "Visualiser le code"
  • Dans la fenêtre qui apparaît, tu colles la partie de mon code entre "Private Sub" et "End Sub"
  • Sous Excel, tu désactives le mode création (équerre bleue toujours)

Tu peux maintenant cliquer sur le bouton pour lancer le code que tu viens de lui attribuer

Il y a plus simple et rapide à faire, mais plus dur à expliquer, avec plus de risques d'erreurs

Si tu rencontres des problèmes d'adaptation on est là.8)

Pour la colonne D c'est assez visible sur le code...

Ce qui met les moyennes en E c'est le .Offset(0,1) => décalé de (0 ligne, 1 colonne)

Félix MERCI ! j'ai un peu cherché, j'avais pas trouvé

Ok, j'ai appliqué à la lettre la procédure de tranfert, et ça marche !!.. cool

Une dernière petite chose (enfin je pense)! Dans mon fichier complet, j'ai une deuxième colonne avec laquelle je dois faire la même opération. Peut-on faire simplement un "save as" du fichier code, et adapter les n° de colonne ?

Merci encore pour les infos jusqu'à présent, c'est la première fois que j'utilise ce type de forum, et toutes mes questions trouvent réponse

Bonjour,

Pour cela il te faut créer un autre bouton (par copier-coller ou glisser-coller)

Par défaut il va s'appeler CommandButton2

Quand tu vas cliquer droit et faire "Visualiser le code", tu vas avoir dans la fenêtre VBE

Private Sub CommandButton2_Click()

End Sub

Et là tu copie le code, en changeant les plages

Avec la ligne de Félix pour simplifier, ça te donne

Private Sub CommandButton2_Click()
Dim cel As Range
Dim derlig As Integer
derlig = Range("D1").End(xlDown).Row
Dim adr As String
adr = "$D$1"
For Each cel In Range("D1:D" & derlig)
If Sgn(cel) <> Sgn(cel.Offset(1, 0)) Then
cel.Offset(0, 1).Formula = "=average(" & adr & ":" & cel.Address & ")"
adr = cel.Offset(1, 0).Address
ElseIf cel.Offset(1, 0) = "" Then
cel.Offset(0, 1).Formula = "=average(" & adr & ":" & cel.Address & ")"
End If
Next cel
End Sub

Remarque : tu peux aussi regrouper les 2 codes sous le même bouton

Private Sub CommandButton1_Click()
Dim cel As Range
Dim derlig As Integer
Dim adr As String

derlig = Range("D1").End(xlDown).Row
adr = "$D$1"
For Each cel In Range("D1:D" & derlig)
If Sgn(cel) <> Sgn(cel.Offset(1, 0)) Then
cel.Offset(0, 1).Formula = "=average(" & adr & ":" & cel.Address & ")"
adr = cel.Offset(1, 0).Address
ElseIf cel.Offset(1, 0) = "" Then
cel.Offset(0, 1).Formula = "=average(" & adr & ":" & cel.Address & ")"
End If
Next cel

derlig = Range("G1").End(xlDown).Row
adr = "$G$1"
For Each cel In Range("G1:G" & derlig)
If Sgn(cel) <> Sgn(cel.Offset(1, 0)) Then
cel.Offset(0, 1).Formula = "=average(" & adr & ":" & cel.Address & ")"
adr = cel.Offset(1, 0).Address
ElseIf cel.Offset(1, 0) = "" Then
cel.Offset(0, 1).Formula = "=average(" & adr & ":" & cel.Address & ")"
End If
Next cel

End Sub

A toi de voir si tu veux tout lancer avec le même bouton, ou si tu préfères avoir 2 boutons séparés

Ah voilà, en fait j'avais essayé, mais je crois j'avais oublié de corriger un champ !

Cool, ça semble bien fonctionner, avec deux boutons en tout cas c'est ok !

Je crois que j'ai tout pour cette manip là !

Maintenant, j'aurais une question plus générique concernant les macros !

.- Pour faire un code comme celui-ci, c'est sur des commandes pré-existantes ? ou bien il faut réellement taper toutes les lignes ? Peux-tu me dire 2 mots sur la création ? également la création "physique" du bouton !.. svp. (faire au plus court, une base sur laquelle je puisse chercher et bidouiller).

Et une question pour le Webmaster de ce forum, ou vous car je ne sais comment le contacter:

.- Est ce que les messages restent en archive quelque part ? si je reviens dans 2 mois avec le même problème que je ne sais plus résoudre, est-ce que je peux retrouver ces échanges constructifs Ou alors j'ai intérêt à prendre des notes ? ..

Si c'est trop complexe à expliquer, laisse tomber, je peux aussi aller fouiller l'aide !

Par contre, pour l'archivage, ça m'intéresse

Merci en tout cas Sylvain et les autres pour votre aide.

LucM

Bon, allez, j'ai encore une question

Est-il possible, dans une condition IF, que l'une des options soit "rien", une case vide, sans que ce soit un "0"

Si cela est possible, quelle commande est-ce ?

J'ai l'impression que j'abuse, mais ...

Merci, A plus

LucM

Luc a écrit :

- Arrow Est ce que les messages restent en archive quelque part ?

Oui les messages sont archivés, et pour faire une recherche suivant des mots clés, tu as l'outil de recherche du forum

Ou bien tu vas voir ton profil, et tu fais afficher tous tes messages

Luc a écrit :

- Arrow Pour faire un code comme celui-ci, il faut réellement taper toutes les lignes ?

Oui oui on tape tout à la main (Enfin y'à quand même une saisie semi-automatique pour les mots clés), mais bon quand t'as pigé le truc, ça va quand même relativement vite. Le tout c'est de savoir où tu veux aller avant de foncer.

Et pour apprendre quoi taper pour les trucs de base; tu peux utiliser l'enregistreur de macro : Outils/Macro/Nouvelle macro ==> tu fais tes trucs puis tu fais "Arrêter l'enregistrement", et tu regardes à quoi ressemble ton code.

L'inconvénient c'est que tu ne peux faire que des trucs de base, avec des adresses de cellules fixes, sans boucle... Mais pour un début pour t'initier c'est très intéressant

Luc a écrit :

également la création "physique" du bouton

Pour faire un bouton 2 possibilités :
  • Insertion/Image/Forme automatique, tu insères une forme, puis clic droit dessus et "Affecter une macro"
  • Affichage/Barres d'outils/Boîte à outils contrôles => Bouton de commande => clic droit dessus (en "mode création") => Visualiser le code
Luc a écrit :

Est-il possible, dans une condition IF, que l'une des options soit "rien", une case vide, sans que ce soit un "0"

Alors là j'ai pas compris la question...

C'est du Excel ou du VBA ?

Un petit exemple ?

Ben, la construction d'une condition IF, c'est

IF(test-logique;valeur si vrai: valeur si faux).

si tu mets IF(G7<0;G7; ) par exemple, la "valeur_si_faux" sera "0"

Moi j'aimerais que ça me laisse une case blanche, vide de toute valeur ou de toute indication "FALSE" ou autre.

PS: j'ai testé en attribuant à "valeur_si_faux" une cellule vide, non utilisée, il te mettra quand même un "0".

Et merci pour les indications de code, ça me rassure, ça veut quand même dire qu'il faut des notions de programmation dès que ça devient des boucles subtiles

LucM

Re,

Pour le IF (pour la plupart d'entre nous c'est SI, d'où mon hésitation... )

La solution classique c'est

IF(G7<0;G7;"")

Donc en fait en gros valeur si faux c'est du texte, mais avec rien dedans.

Ah ben, voilà ! c'était tout bête

J'ai un Excel en anglais, alors ... je converti pas tout

Bon ben merci une fois de plus ! là je crois que je suis ok pour un moment, mais si jamais, je sais que vous êtes là, et bien serviables. 8)

A bientôt

LucM

Rechercher des sujets similaires à "moyennes zones meme colonne"