Bonjour,
J'ai grâce à ce forum une formule qui répond parfaitement a mes besoins mais elle a été conçue pour des cellules adjacentes, dans la formule d'exemple ci-dessous pour les cellules de A1 à A10 (A1:A10).
J'aimerai la meme formule pour des cellules non adjacentes par exemple B1 et B5 et B10. (B1;B5;B10)
J'ai essayé de l'adapter mais ne connaissant pas bien la syntaxe j'arrive a des erreurs.
Voici la formule:
=SIERREUR(MOYENNE.SI(A1:A10;"<>0");0)
Cela ne correspond pas à la formule que j'ai laissée en exemple et qui vérifie qu'au cas ou une (ou des) cellule est a 0 on ne compte pas cette cellule car c'est une mesure qui n'a pas été faite et elle ne rentre donc pas dans la moyenne.
Il faut qu'elle corresponde exactement à l'identique de la formule =SIERREUR(MOYENNE.SI(A1:A10;"<>0");0) mais remaniée pour des cellules non adjacentes..
Il serait bien d'avoir un fichier exemple pour répondre à tes besoins, cela éviterait de tâtonner à chaque fois.
En supposant que tu dois prendre la valeur toutes les 5 lignes (10;15;20 etc..)
A essayer cette formule matricielle
Si tu n'as pas le même nombre de lignes entre chaque valeur (B1;B5;B10) alors là, dis nous ce que tu as entre ces valeurs avec un fichier exemple, on pourra peut être t'aider.
Bon je tente une dernière explication après je ferai un fichier exemple..:
Prenons deux cellules non adjacentes au hasard: B13 et B18
Si je fais =MOYENNE(B13;B18) au cas ou en B13 ou en B18 la cellule affiche 0 (ce qui veut dire que la mesure n'a pas été faite) la moyenne est erronée car elle tient compte d'une cellule dont la valeur est 0 . Donc je cherche la bonne formule pour éviter ce problème.
Est-ce que c'est comprehensible ou sinon en effet je ferai un fichier exemple.
Par avance merci
Re...
Il serait sage AMHA..., afin de ne pas monter une usine à gaz... de disposer ces données de façon à pouvoir les utiliser par une fonction tel que déjà proposé
Function MoyenneSiNonNul(r As Range)
Dim s#, n
For Each r In r
If IsNumeric(CStr(r)) Then _
If r <> 0 Then s = s + r: n = n + 1
Next
MoyenneSiNonNul = s / n
End Function
S'il y a des plages illimitées la fonction précédente prend du temps...
Il vaut donc mieux utiliser :
Code:
Function MoyenneSiNonNul(r As Range)
Dim s#, n
For Each r In Intersect(r, r.Parent.UsedRange)
If IsNumeric(CStr(r)) Then _
If r <> 0 Then s = s + r: n = n + 1
Next
MoyenneSiNonNul = s / n
End Function
WWWWHAOUUUUU.... Vraiment un grand merci pour toutes vos réponses, je ne m'attendais pas a tant... !!
Toutes vos solutions convenaient a mon problème , j'ai pris la solution proposée par JHA parce qu'elle était assez simple a mettre en oeuvre et surtout parce que je comprenais à peu près la syntaxe!! ... je l'ai adaptée à mon utilisation dans une première feuille (il y en aura d'autres..!)
Comme la formule entrainait une erreur au cas ou toutes les cellules incriminées étaient à 0 (dans le cas ou il n'y ai pas eu de mesures ce jour là) et que ce n'est pas très beau comme presentation...! je l'ai accommodé d'un SIERREUR en m'inspirant de la formule que j'avais donné dans le 1er post et qui fonctionne très bien dans le cas de cellules adjacentes..
Voilà donc ma formule finale: =SIERREUR(MOYENNE(SI(P14=0;$D$1;P14);SI(P18=0;$D$1;P18));0) (on peut bien évidemment rajouter d'autres cellules )
Au cas ou vous pensiez que l'on peut faire plus simple n'hésitez pas a proposer ...