Simplifier une formule

Résolu/Fermé
marceletienne Messages postés 23 Date d'inscription mardi 7 juillet 2015 Statut Membre Dernière intervention 13 décembre 2020 - 7 août 2015 à 14:05
marceletienne Messages postés 23 Date d'inscription mardi 7 juillet 2015 Statut Membre Dernière intervention 13 décembre 2020 - 12 août 2015 à 16:32
Bonjour,

De nouveau je fais appel aux "cracks" excel et les remercie d'avance.

Voilà, comment simplifier cette formule (ici un tableau b2:k8) qui prend la somme des valeurs moyennes des lignes d'un tableau sans tenir compte des maxi. et mini. qu'elles contiennent:

=((SOMME(B2:K2)-MAX(B2:K2)-MIN(B2:F2))/3)+((SOMME(B3:K3)-MAX(B3:K3)-MIN(B3:F3))/3)+((SOMME(B4:K4)-MAX(B4:K4)-MIN(B4:F4))/3)+((SOMME(B5:K5)-MAX(B5:K5)-MIN(B5:F5))/3)+((SOMME(B6:K6)-MAX(B6:K6)-MIN(B6:F6))/3)+((SOMME(B7:K7)-MAX(B7:K7)-MIN(B7:F7))/3)+((SOMME(B8:K8)-MAX(B8:K8)-MIN(B8:F8))/3) ...

sachant que le tableau est double et variable (nb de lignes et colonnes, exemple: tableau(b2k13;b16:k27), que la formule ne doit pas prendre en compte les cellules vides.

Merci aux cellules pleines, les miennes sont vides sur le sujet.




6 réponses

Raymond PENTIER Messages postés 58678 Date d'inscription lundi 13 août 2007 Statut Contributeur Dernière intervention 3 octobre 2024 17 204
8 août 2015 à 19:14
Bonjour.

Moi non plus, je n'ai pas tout compris !

1) "somme des valeurs moyennes des lignes d'un tableau sans tenir compte des maxi et mini". Or ton fichier-exemple contient 10 colonnes ; donc on ne devrait pas avoir =((SOMME(B2:K2)-MAX(B2:K2)-MIN(B2:F2))/3
mais =((SOMME(B2:K2)-MAX(B2:K2)-MIN(B2:F2))/8, non ?

2) Pourquoi MIN(B2:F2), et non MIN(B2:K2) ?

3) Et à quoi servent les parenthèses avant et après les signes + ?
=(SOMME(B2:K2)-MAX(B2:K2)-MIN(B2:F2))/3+(SOMME(B3:K3)-MAX(B3:K3)-MIN(B3:F3))/3+(SOMME(B4:K4)-MAX(B4:K4)-MIN(B4:F4))/3+(SOMME(B5:K5)-MAX(B5:K5)-MIN(B5:F5))/3+(SOMME(B6:K6)-MAX(B6:K6)-MIN(B6:F6))/3+(SOMME(B7:K7)-MAX(B7:K7)-MIN(B7:F7))/3+(SOMME(B8:K8)-MAX(B8:K8)-MIN(B8:F8))/3 fonctionne très bien ...

4) Le diviseur 3 suppose que ton tableau n'a que 5 colonnes (5-2=3) ; c'est donc la plage B2:F8 qui serait concernée. Puisque tu parles de cellules en colonne K, c'est que ton tableau occupe la plage B2:K8 ! Le diviseur devient 10-2=8. Dans le cas où ton tableau a un nombre quelconque de colonnes, il faut remplacer 7 fois le "3" de ta formule par (NB(Bi:Ki)-2) ce qui donne cette "usine à gaz" :
=(SOMME(B2:K2)-MAX(B2:K2)-MIN(B2:K2))/(NB(B2:K2)-2)+(SOMME(B3:K3)-MAX(B3:K3)-MIN(B3:K3))/(NB(B3:K3)-2)+(SOMME(B4:K4)-MAX(B4:K4)-MIN(B4:K4))/(NB(B4:K4)-2)+(SOMME(B5:K5)-MAX(B5:K5)-MIN(B5:K5))/(NB(B5:K5)-2)+(SOMME(B6:K6)-MAX(B6:K6)-MIN(B6:K6))/(NB(B6:K6)-2)+(SOMME(B7:K7)-MAX(B7:K7)-MIN(B7:K7))/(NB(B7:K7)-2)+(SOMME(B8:K8)-MAX(B8:K8)-MIN(B8:K8))/(NB(B8:K8)-2)
0
Raymond PENTIER Messages postés 58678 Date d'inscription lundi 13 août 2007 Statut Contributeur Dernière intervention 3 octobre 2024 17 204
8 août 2015 à 19:16
Il reste à éclaircir une ambiguïté :
"la formule ne doit pas prendre en compte les cellules vides" ces cellules sont toujours en dernières colonnes ou concerner les dernières lignes, ou peuvent -elles se glisser entre 2 cellules renseignées ?
0
marceletienne Messages postés 23 Date d'inscription mardi 7 juillet 2015 Statut Membre Dernière intervention 13 décembre 2020
9 août 2015 à 08:03
Bonjour et merci pour l'attention,
1) comme expliqué, le contenu du tableau n'est pas figé. actuellement, 5 colonnes et 7 lignes contiennent une valeur. Dans ce cas, la moyenne d'une ligne est bien 5-2(max. et min.)=3
2)actuellement seules les cellules B2:F2 contiennent une valeur. De même que les lignes 2 à 8.
3)effectivement ces parenthèses peuvent être supprimées.
4)La réponse est en 1). Effet, pour la moyenne ou le mini. il faut neutraliser les cellules vides des dernières colonnes.
La formule doit tenir compte de "l'enrichissement progressif" du tableau.

Cordialement.
0
Gyrus Messages postés 3334 Date d'inscription samedi 20 juillet 2013 Statut Membre Dernière intervention 9 décembre 2016 523
9 août 2015 à 10:33
Bonjour marceletienne,
bonjour Raymond,

Si tu n'es pas allergique à VBA, je peux te proposer une fonction personnalisée.
=CalculerSommeMoy(Plage1;Plage2)
A tester ...

https://www.cjoint.com/c/EHjiD4Vnv2X

A+
0
marceletienne Messages postés 23 Date d'inscription mardi 7 juillet 2015 Statut Membre Dernière intervention 13 décembre 2020
10 août 2015 à 10:04
Bonjour Gyrus,

Je ne suis pas à priori allergique à VBA, mais je ne connais pas du tout.
Toutefois ta proposition m'intéresse sous réserve que tu veuilles bien me décomposer la démarche pour l'installer ainsi l'explication de son fonctionnement.
Merci dans tous les cas.
0
Gyrus Messages postés 3334 Date d'inscription samedi 20 juillet 2013 Statut Membre Dernière intervention 9 décembre 2016 523
10 août 2015 à 10:56
Bonjour,

Voici donc quelques explications :

Comme dit précédemment, j'ai utilisé une fonction personnalisée.
Pour la visualiser :
Appuie sur alt +F11 afin d'ouvrir l'éditeur.
Appuie sur ctrl +R afin d'ouvrir l'explorateur de projet.
Tu vois alors le Module1 sous « Modules »
En faisant un double-clic sur ce module, tu vois le code de la fonction CalculerSommeMoy.

Code commenté :
Function CalculerSommeMoy(Plage1 As Range, Optional Plage2 As Range) As Double
Dim UnionPlage As Range, Ligne As Range, Cel As Range, L As Range
Dim Mini As Double, Maxi As Double, Cumul As Double, MoyenneD As Double
Dim N As Integer
'Si la plage2 (optionnelle) existe, on l'intègre à la plage traitée
If Not Plage2 Is Nothing Then
Set UnionPlage = Application.Union(Plage1, Plage2)
Else
Set UnionPlage = Plage1
End If
'On balaye chaque ligne de la plage
For Each Ligne In UnionPlage.Rows
'On définit la partie à traiter
Set L = Range(Ligne.Address)
'On relève la valeur minimum
Mini = Application.Min(L)
'On relève la valeur maximum
Maxi = Application.Max(L)
'On effectue la somme des valeurs
For Each Cel In L
If Cel <> "" Then
Cumul = Cumul + Cel.Value
N = N + 1
End If
Next Cel
'Si le nombre de valeurs est supérieur à 2, on calcule la moyenne _
après avoir soustrait le mini et le maxi.
'Puis on effectue le cumul des moyennes.
If N > 2 Then
MoyenneD = MoyenneD + (Cumul - Mini - Maxi) / (N - 2)
Cumul = 0
N = 0
End If
Next Ligne
'La fonction renvoie le cumul des moyennes
CalculerSommeMoy = MoyenneD
End Function


Si tu ouvres ton classeur et le classeur que je t'ai envoyé, tu verras alors les deux projets dans l'explorateur.
Pour copier le code, il suffit que tu sélectionnes le Module1 et que tu le fasses glisser dans le projet de ton classeur. La fonction est alors disponible.

A+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
marceletienne Messages postés 23 Date d'inscription mardi 7 juillet 2015 Statut Membre Dernière intervention 13 décembre 2020
11 août 2015 à 08:00
Bonjour Gyrus,

Excuses pour la réponse tardive, mais petit fil de 3 ans en pension demande beaucoup de temps.

Merci pour ton explication détaillée, je comprend un peu la démarche (notion de basic), mais quelques petites choses me gênent.

Par exemple comment sont définies les zones de plage de calculs B2:K13;B16:K27 (plage1 et plage2)?

A+
0
Gyrus Messages postés 3334 Date d'inscription samedi 20 juillet 2013 Statut Membre Dernière intervention 9 décembre 2016 523
11 août 2015 à 19:57
Bonjour,


Dans ta demande, tu indiquais que le tableau était double et variable (nb de lignes et colonnes, exemple: tableau(b2k13;b16:k27).

Pour permettre que la fonction prenne en compte ces conditions, j'ai placé les deux plages comme arguments de la fonction.
Si une plage à prendre en compte est modifiée, il suffit de l'indiquer dans la fonction.

Exemple :
=CalculerSommeMoy(b2k132; b160:k270)

A+
0
marceletienne Messages postés 23 Date d'inscription mardi 7 juillet 2015 Statut Membre Dernière intervention 13 décembre 2020
12 août 2015 à 16:32
Bonjour Raymond,
Bonjour Gyrus,

L'installation de la macro dans mon dossier est faite (après quelques petits problèmes dus à l'impasse, à plusieurs reprises, de l'enregistrement proprement dit de cette dernière et non un simple copier/coller), elle fonctionne parfaitement.

C'est effectivement la solution qui permet la souplesse relative à l'évolution continue du tableau. Encore faut-il connaître le VBA bien utile dans ce cas..

Je vous remercie tous deux pour votre aide ainsi qu'à sa promptitude.

A+
0