Simplifier une formule

Résolu
marceletienne Messages postés 23 Statut Membre -  
marceletienne Messages postés 23 Statut Membre -
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

  1. Raymond PENTIER Messages postés 58213 Date d'inscription   Statut Contributeur Dernière intervention   17 482
     
    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
    1. Raymond PENTIER Messages postés 58213 Date d'inscription   Statut Contributeur Dernière intervention   17 482
       
      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
    2. marceletienne Messages postés 23 Statut Membre
       
      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
  2. Gyrus Messages postés 3360 Statut Membre 526
     
    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
  3. marceletienne Messages postés 23 Statut Membre
     
    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
  4. Gyrus Messages postés 3360 Statut Membre 526
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. marceletienne Messages postés 23 Statut Membre
     
    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
  7. Gyrus Messages postés 3360 Statut Membre 526
     
    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
    1. marceletienne Messages postés 23 Statut Membre
       
      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