OVH Cloud OVH Cloud

Somme conditionnelle

7 réponses
Avatar
emmanuel.guyonneau
Bonjour à tous

Comment puis-je facilement (cad sans macro) faire la somme
des 3 dernières cellules non vides d'une plage (en partant de la dernière
et en remontant) ?

Merci de votre aide

7 réponses

Avatar
Daniel.M
Salut Emmanuel,

La formule MATRICIELLE suivante (saisir avec Ctrl-Maj-Entrée):

=SOMME(N(DECALER(Plage;GRANDE.VALEUR(SI(Plage<>"";
LIGNE(Plage));{1;2;3})-1;;;)))

Salutations,

Daniel M.

"emmanuel.guyonneau" wrote in message
news:big6t4$c73$
Bonjour à tous

Comment puis-je facilement (cad sans macro) faire la somme
des 3 dernières cellules non vides d'une plage (en partant de la dernière
et en remontant) ?

Merci de votre aide




Avatar
Le num
Super ça marche au poil !!
J'étais pas prêt de trouver une formule comme ça tout seul ...

Merci

"Daniel.M" a écrit dans le message news:

Salut Emmanuel,

La formule MATRICIELLE suivante (saisir avec Ctrl-Maj-Entrée):

=SOMME(N(DECALER(Plage;GRANDE.VALEUR(SI(Plage<>"";
LIGNE(Plage));{1;2;3})-1;;;)))

Salutations,

Daniel M.

"emmanuel.guyonneau" wrote in message
news:big6t4$c73$
Bonjour à tous

Comment puis-je facilement (cad sans macro) faire la somme
des 3 dernières cellules non vides d'une plage (en partant de la
dernière


et en remontant) ?

Merci de votre aide







Avatar
Jacky
Salut Daniel

=SOMME(N(DECALER(Plage;GRANDE.VALEUR(SI(Plage<>"";
LIGNE(Plage));{1;2;3})-1;;;)))


Pourrais-tu expliquer cette formule SVP ??
Merci
JJ


"Daniel.M" a écrit dans le message news:

Salut Emmanuel,

La formule MATRICIELLE suivante (saisir avec Ctrl-Maj-Entrée):

=SOMME(N(DECALER(Plage;GRANDE.VALEUR(SI(Plage<>"";
LIGNE(Plage));{1;2;3})-1;;;)))

Salutations,

Daniel M.

"emmanuel.guyonneau" wrote in message
news:big6t4$c73$
Bonjour à tous

Comment puis-je facilement (cad sans macro) faire la somme
des 3 dernières cellules non vides d'une plage (en partant de la
dernière


et en remontant) ?

Merci de votre aide







Avatar
Bernard MAZAS
Salut Jacky

"Jacky" a écrit dans le message news:

Salut Daniel

=SOMME(N(DECALER(Plage;GRANDE.VALEUR(SI(Plage<>"";
LIGNE(Plage));{1;2;3})-1;;;)))


Pourrais-tu expliquer cette formule SVP ??
Merci


Tu en poses des questions :-))))

A vrai dire, la formule de Daniel ne fonctionne que si 'Plage' est en
colonne et débute en ligne 1. Dans un cas plus général, il faudrait prendre
la formule, également matricielle :
=SOMME(N(DECALER(plage;GRANDE.VALEUR(SI(plage<>"";LIGNE(INDIRECT("1:"&LIGNES
(plage))));{1;2;3})-1;;;)))

C'est cette dernière formule que je vais essayer de commenter.

NB :
a) dans ce qui suit, 'Plage' ne contient que des valeurs numériques, ou bien
des cellules vides.
b) prenons l'exemple où 'Plage' est composée des 7 cellules :

<vide>
20
30
<vide>
10
50
<vide>

Dans ce cas, la formule souhaitée doit renvoyer 30+10+50, somme des trois
dernières cellules non vides de 'plage'.

1) Il faut commencer par chercher la position de toutes les valeurs non
vides
de la plage 'Plage' :
=SI(Plage<>"";{1;2;3;4;5;6;7})
Attention : comme il s'agit d'une formule matricielle, les arguments de la
fonction SI sont matriciels. cela signifie que :
l'expression Plage<>"" est une matrice logique, de même dimension que
'Plage', et qui, dans notre exemple, vaut
FAUX
VRAI
VRAI
FAUX
VRAI
VRAI
FAUX

2) La constante matricielle {1;2;3;4;5;6;7} doit être calculée en fonction
du nombre d'éléments de 'plage'. Il s'agit d'une astuce classique. Pour
cela, on commence par former la chaîne de caractères :
"1:"&LIGNES(plage)
Dans notre exemple, cette chaîne vaut :
"1:7"
Ensuite, il faut transformer cette chaîne en référence de plage :
INDIRECT("1:"&LIGNES(plage))
Dans notre exemple, cette référence est celle des 7 premières lignes :
1:7
Il suffit alors de former la matrice souhaitée par :
LIGNE(INDIRECT("1:"&LIGNES(plage)))

3) L'expression
SI(plage<>"";LIGNE(INDIRECT("1:"&LIGNES(plage))))
renvoie donc soit la position de la valeur numérique si la cellule n'est pas
vide
et sinon la valeur logique FAUX, soit dans notre cas :
FAUX
2
3
FAUX
5
6
FAUX

4) Donc si tu suis bien, on se trouve avec une formule qui est maintenant,
dans notre cas :
=SOMME(N(DECALER(plage;GRANDE.VALEUR({FAUX;2;3;FAUX;5;6;FAUX};{1;2;3})-1;;;)
))

Il faut maintenant isoler la position des trois dernières valeurs numériques
:
GRANDE.VALEUR({FAUX;2;3;FAUX;5;6;FAUX};1) renvoie 6, position de la dernière
valeur non vide
GRANDE.VALEUR({FAUX;2;3;FAUX;5;6;FAUX};2) renvoie 5, position de l'avant
dernière valeur non vide
etc, et donc, sous forme matricielle :
GRANDE.VALEUR({FAUX;2;3;FAUX;5;6;FAUX};{1;2;3} renvoie la matrice {6;5;3},
position des trois dernières valeurs non vides

5) Il faut récupérer maintenant les valeurs elles mêmes (et non leur
position). C'est le rôle de DECALER :
DECALER(plage;{6;5;3}-1;;;)))
renvoie une matrice de trois valeurs {50;10;30} qu'il faut sommer. Ouf !

Bernard

NB :
L'expression LIGNE(Plage) de la formule originale de Daniel renvoie les
numéros de lignes (et non les positions) des cellules de 'Plage', ce qui ne
revient au même que si 'Plage' débute en ligne 1...
2) le rôle de la fonction N() est plus difficile à expliquer. Disons qu'on
l'emploie pour pallier certains 'défauts' des fonctions SOMME et SOMMEPROD


Avatar
Daniel.M
Salut Bernard (heureux de voir que tu reviens, on en profitera!),

Je salue ta générosité.

A vrai dire, la formule de Daniel ne fonctionne que si 'Plage' est en
colonne et débute en ligne 1.
...
NB :
L'expression LIGNE(Plage) de la formule originale de Daniel renvoie les
numéros de lignes (et non les positions) des cellules de 'Plage', ce qui
ne

revient au même que si 'Plage' débute en ligne 1...


Exact. Merci de préciser.

... Dans un cas plus général, il faudrait prendre
la formule, également matricielle :

=SOMME(N(DECALER(plage;GRANDE.VALEUR(SI(plage<>"";LIGNE(INDIRECT("1:"&LIGNES

(plage))));{1;2;3})-1;;;)))


Ou
=SOMME(N(DECALER(Plage;GRANDE.VALEUR(SI(Plage<>"";LIGNE(Plage));{1;2;3})
-LIGNE(XX);;;)))
' Ici XX => Première cellule de la plage.

Ou
=SOMME(N(DECALER(Plage;GRANDE.VALEUR(SI(Plage<>"";LIGNE(Plage));{1;2;3})
-CELLULE("ligne";Plage);;;)))



2) le rôle de la fonction N() est plus difficile à expliquer. Disons qu'on
l'emploie pour pallier certains 'défauts' des fonctions SOMME et SOMMEPROD



C'est surtout le problème de DECALER() qui ne retourne pas toujours de
matrice alors que N(DECALER()) l'oblige. Une incongruité, comme d'autres tel
le traitement des matrices dans RANG/ SOMME.SI/ NB.SI, qui démontre bien que
certaines fonctions XL ont bénéficié de 'meilleurs concepteurs' que
d'autres.

Salutations amicales,

Daniel M.

Avatar
Jacky
Merci pour toutes ces explications, je vais essayer de décortiquer cela
demain matin, car la fatigue du soir ne me permet plus de me concentrer sur
une formule aussi complexe(pour moi)
Merci à tous de votre patience

"Jacky" a écrit dans le message news:

Salut Daniel

=SOMME(N(DECALER(Plage;GRANDE.VALEUR(SI(Plage<>"";
LIGNE(Plage));{1;2;3})-1;;;)))


Pourrais-tu expliquer cette formule SVP ??
Merci
JJ


"Daniel.M" a écrit dans le message news:

Salut Emmanuel,

La formule MATRICIELLE suivante (saisir avec Ctrl-Maj-Entrée):

=SOMME(N(DECALER(Plage;GRANDE.VALEUR(SI(Plage<>"";
LIGNE(Plage));{1;2;3})-1;;;)))

Salutations,

Daniel M.

"emmanuel.guyonneau" wrote in message
news:big6t4$c73$
Bonjour à tous

Comment puis-je facilement (cad sans macro) faire la somme
des 3 dernières cellules non vides d'une plage (en partant de la
dernière


et en remontant) ?

Merci de votre aide











Avatar
Daniel.M
Salut Bernard,

C'est surtout le problème de DECALER() qui ne retourne pas toujours de
matrice alors que N(DECALER()) l'oblige.


Merci pour cette précision. N() n'a donc pas qu'un rôle de "brosse à
numériser". Mais bizarrement, dans le cas présent, on tombe bien sur la
bonne matrice quand on évalue DECALER(...) :-o


Oui mais cela est le résultat de la 'méthode F9', i.e. utilisation de F9
pour générer des résultats intermédiaires dans la ligne de formule. Or, il
ne faut pas toujours s'y fier.
Si Excel utilisait toujours une méthode standard de résolution des
expressions ('parsing' en anglais, avec BNF ou Infix ou autre), on pourrait
être assuré que ce qu'on VOIT après évaluation intermédiaire (par F9) est
bel et bien ce qu'Excel voit quand il traite la formule.
Malheureusement, cette cohérence n'existe pas toujours. D'autres critères
(difficiles à saisir quand on ne voit pas le code C de l'implantation
concrète) entrent en ligne de compte.

C'est pourquoi DECALER() ne réagit pas correctement en certaines occasions.
C'est pourquoi RECHERCHEV() ne retourne pas toujours des matrices.
C'est pourquoi une formule fondamentalement matricielle, comme
=SOMME(NB.SI($A$1:$A$10;$C$1:$C$3)), mais saisie de façon NORMALE (Entrée
seulement) donnera un résultat différent dépendant de la ligne sur laquelle
on l'inscrit. Ici, par exemple, je plaiderais fortement pour une évaluation
indépendante de la ligne (i.e. qui retourne toujours le premier terme de la
matrice) mais ce n'est pas le choix MS (qui aligne les termes retournés sur
la ligne de la formule!). C'est une option qui se défend : elle permet plus
facilement l'erreur de l'usager qui aurait oublié la saisie en matricielle
mais ce faisant, elle met à mal la cohérence dans l'évaluation des
expressions d'une formule (même chose pour RECHERCHEV avec une matrice comme
premier argument).

Bon, c'est l'heure tardive et je me trouve 'heavy'. Alors, salutations et
dodo,

Daniel M.