OVH Cloud OVH Cloud

Sommeprod

25 réponses
Avatar
Pierre.M
Salut à tous,

En colonnes AA, BB, et CC de ma Feuil1 j'ai 3 listes nommees.
En A1 de la Feuil2 j'ai une valeur de la liste AA, en B1 une valeur de
la liste BB et en C1 la formule =SOMMEPROD((AA=A1)*(BB=B1)*CC) et
j'obtiens #VALEURS! au lieu de la valeur attendue de la liste CC.
Je travaille encore sur excel97.
Ma formule contient-elle une erreur ou ce truc ne fonctionne-t-il pas
sous Excel 97?

Merci a ceux qui sauront m'eclairer.

Pierre

10 réponses

1 2 3
Avatar
Jacquouille
Bonsoir
Comme me l'avait expliqué l'Eve de ce forum (je crois, en effet, qu'elle y
était la première femme), SommeProd n'accepte pas les colonnes entières, ce
qui me fut confirmé par AV, Président de la SPA.
Donc A:A ne convient pas pour définir une plage de calcul. Mettez A1:A100
ou A16000 et essayez.
Il est évident que cela est valable aussi pour B:B ....
Dans votre cas, les plages nommées seront rabotées d'une ligne.
De plus, les colonnes auxquelles vous faites référence n'appartiennent pas à
la feuille sur laquelle SommeProd effectue son calcul.
AA, BB, et CC de ma Feuil1 A1 de la Feuil2 ....et en C1 la formule
=SOMMEPROD((AA¡)*(BB±)*CC)
Il vous suffira donc de remplacer AA par son nom de baptême car les noms de



plage sont valables pour toutes les feuilles.
=Sommeprod((article="marteau")*(couleur="rouge")*prix)
Bonne chance

--
Bien amicalmement,
Vivement conseillés:
http://www.excelabo.net
http://jacxl.free.fr/mpfe/trombino.html
http://dj.joss.free.fr/netiquet.htm
http://frederic.sigonneau.free.fr/

Jacquouille.

"Pierre.M" a écrit dans le message de news:
456756a3$0$5102$
Salut à tous,

En colonnes AA, BB, et CC de ma Feuil1 j'ai 3 listes nommees.
En A1 de la Feuil2 j'ai une valeur de la liste AA, en B1 une valeur de la
liste BB et en C1 la formule =SOMMEPROD((AA¡)*(BB±)*CC) et j'obtiens
#VALEURS! au lieu de la valeur attendue de la liste CC.
Je travaille encore sur excel97.
Ma formule contient-elle une erreur ou ce truc ne fonctionne-t-il pas sous
Excel 97?

Merci a ceux qui sauront m'eclairer.

Pierre





Avatar
Pierre.M
Merci beaucoup pour ton intervention.
Helas c'est moi qui est fait une enorme erreur, et je m'en excuse. En
fait mes 3 colonnes ne contiennent que des valeurs texte et naivement
je pensais que cette formule me permettrait un choix "multicritere", ce
qui fonctionne quand CC contient des nombres.
Je cherche la valeur en CC quand en AA j'ai la valeur A1 et en BB la
valeur B1...
Pardon encore pour mon erreur.
Maintenant s'il y avait une autre solution a mon probleme ca
m'arrangerait bien, faut dire ;-)

Merci et très belle soiree.

Pierre



On 2006-11-24 22:07:28 +0100, "Jacquouille"
said:

Bonsoir
Comme me l'avait expliqué l'Eve de ce forum (je crois, en effet,
qu'elle y était la première femme), SommeProd n'accepte pas les
colonnes entières, ce qui me fut confirmé par AV, Président de la SPA.
Donc A:A ne convient pas pour définir une plage de calcul. Mettez
A1:A100 ou A16000 et essayez.
Il est évident que cela est valable aussi pour B:B ....
Dans votre cas, les plages nommées seront rabotées d'une ligne.
De plus, les colonnes auxquelles vous faites référence n'appartiennent
pas à la feuille sur laquelle SommeProd effectue son calcul.
AA, BB, et CC de ma Feuil1 A1 de la Feuil2 ....et en C1 la formule
=SOMMEPROD((AA¡)*(BB±)*CC)
Il vous suffira donc de remplacer AA par son nom de baptême car les



noms de plage sont valables pour toutes les feuilles.
=Sommeprod((article="marteau")*(couleur="rouge")*prix)
Bonne chance





Avatar
Jacquouille
Bonsoir
Sommeprod est femme, mais guère capricieuse.
Pour un critère texte, on met des ", soit outil="marteau"
Pour du nombre, pas besoin, soit prix
Mais, on peut aussi en mettre et Excel considèrera 15 comme un texte, soit
prix="15".
Pas de caractère jokker, mais un truc du style =gauche(a5;3)="abc" donnera
le nb de truc qui commencent par abc.
Re bonne chance
Si pas bon, mettre un fichier exemple sur CJoint avec une bonne explication.
Jacques.
--
Bien amicalmement,
Vivement conseillés:
http://www.excelabo.net
http://jacxl.free.fr/mpfe/trombino.html
http://dj.joss.free.fr/netiquet.htm
http://frederic.sigonneau.free.fr/

Jacquouille.

"Pierre.M" a écrit dans le message de news:
45676400$0$25935$
Merci beaucoup pour ton intervention.
Helas c'est moi qui est fait une enorme erreur, et je m'en excuse. En fait
mes 3 colonnes ne contiennent que des valeurs texte et naivement je
pensais que cette formule me permettrait un choix "multicritere", ce qui
fonctionne quand CC contient des nombres.
Je cherche la valeur en CC quand en AA j'ai la valeur A1 et en BB la
valeur B1...
Pardon encore pour mon erreur.
Maintenant s'il y avait une autre solution a mon probleme ca m'arrangerait
bien, faut dire ;-)

Merci et très belle soiree.

Pierre



On 2006-11-24 22:07:28 +0100, "Jacquouille"
said:

Bonsoir
Comme me l'avait expliqué l'Eve de ce forum (je crois, en effet, qu'elle
y était la première femme), SommeProd n'accepte pas les colonnes
entières, ce qui me fut confirmé par AV, Président de la SPA.
Donc A:A ne convient pas pour définir une plage de calcul. Mettez
A1:A100 ou A16000 et essayez.
Il est évident que cela est valable aussi pour B:B ....
Dans votre cas, les plages nommées seront rabotées d'une ligne.
De plus, les colonnes auxquelles vous faites référence n'appartiennent
pas à la feuille sur laquelle SommeProd effectue son calcul.
AA, BB, et CC de ma Feuil1 A1 de la Feuil2 ....et en C1 la formule
=SOMMEPROD((AA¡)*(BB±)*CC)
Il vous suffira donc de remplacer AA par son nom de baptême car les noms



de plage sont valables pour toutes les feuilles.
=Sommeprod((article="marteau")*(couleur="rouge")*prix)
Bonne chance









Avatar
Jacquouille
Re
Si la plage nommée AA (pourquoi ne pas mettre un nom plus parlant, comme
prix, légume ou prénom?) doit être égale à la valeur A&, je m ettrais
celle-ci entre guillemets.
Soit (AA="A1")
Re bonne chance
--
Bien amicalmement,
Vivement conseillés:
http://www.excelabo.net
http://jacxl.free.fr/mpfe/trombino.html
http://dj.joss.free.fr/netiquet.htm
http://frederic.sigonneau.free.fr/

Jacquouille.

"Pierre.M" a écrit dans le message de news:
45676400$0$25935$
Merci beaucoup pour ton intervention.
Helas c'est moi qui est fait une enorme erreur, et je m'en excuse. En fait
mes 3 colonnes ne contiennent que des valeurs texte et naivement je
pensais que cette formule me permettrait un choix "multicritere", ce qui
fonctionne quand CC contient des nombres.
Je cherche la valeur en CC quand en AA j'ai la valeur A1 et en BB la
valeur B1...
Pardon encore pour mon erreur.
Maintenant s'il y avait une autre solution a mon probleme ca m'arrangerait
bien, faut dire ;-)

Merci et très belle soiree.

Pierre



On 2006-11-24 22:07:28 +0100, "Jacquouille"
said:

Bonsoir
Comme me l'avait expliqué l'Eve de ce forum (je crois, en effet, qu'elle
y était la première femme), SommeProd n'accepte pas les colonnes
entières, ce qui me fut confirmé par AV, Président de la SPA.
Donc A:A ne convient pas pour définir une plage de calcul. Mettez
A1:A100 ou A16000 et essayez.
Il est évident que cela est valable aussi pour B:B ....
Dans votre cas, les plages nommées seront rabotées d'une ligne.
De plus, les colonnes auxquelles vous faites référence n'appartiennent
pas à la feuille sur laquelle SommeProd effectue son calcul.
AA, BB, et CC de ma Feuil1 A1 de la Feuil2 ....et en C1 la formule
=SOMMEPROD((AA¡)*(BB±)*CC)
Il vous suffira donc de remplacer AA par son nom de baptême car les noms



de plage sont valables pour toutes les feuilles.
=Sommeprod((article="marteau")*(couleur="rouge")*prix)
Bonne chance









Avatar
Pierre.M
J'ai essaye avec et sans les "", ca ne donne rien...

http://cjoint.com/?lyxsGuQE7a

Je joint un exemple de ma recherche a toute fin utile. Il y a sans
doute un autre moyen d'y arriver. Moi je sais faire seulement avec un
critere.
Merci.

Pierre


On 2006-11-24 22:39:15 +0100, "Jacquouille"
said:

Re
Si la plage nommée AA (pourquoi ne pas mettre un nom plus parlant,
comme prix, légume ou prénom?) doit être égale à la valeur A&, je m
ettrais celle-ci entre guillemets.
Soit (AA="A1")
Re bonne chance


Avatar
daniel
bonjour,
trouvé dans un message de Sept 2005 (sans matricielle).
=INDEX($C$2:$C$11;SOMMEPROD(($A$2:$A$11á)*($B$2:$B$11ñ)*LIGNE(INDIRECT("1:"&LIGNES($A$2:$A$11)))))
mais je ne saurais l'expliquer pour "ligne(indirect(....", si un crack peut
éclairer nos lanternes.....
Avatar
Pierre.M
Super, merci!
Moi non plus je ne comprends pas la formule, mais ca marche.
Bonne journee.

Pierre


On 2006-11-25 07:02:56 +0100, "daniel" said:

bonjour,
trouvé dans un message de Sept 2005 (sans matricielle).
=INDEX($C$2:$C$11;SOMMEPROD(($A$2:$A$11á)*($B$2:$B$11ñ)*LIGNE(INDIRECT("1:"&LIGNES($A$2:$A$11)))))
mais


je ne saurais l'expliquer pour "ligne(indirect(....", si un crack peut
éclairer nos lanternes.....


Avatar
MichDenis
| =INDEX($C$2:$C$11;SOMMEPROD(($A$2:$A$11á)*($B$2:$B$11ñ)*LIGNE(INDIRECT| |
("1:"&LIGNES($A$2:$A$11)))))

Habituellement, si on avait seulement un critère, on utiliserait, une formule
de ce genre : Exemple :
=INDEX(Code;EQUIV(F1;Nom;0))
Dans cette formule, on a remplacé Equiv() par une formule
matricielle Sommeprod() pour déterminer la ligne où les
2 condtions étaient vrai. Dans le tableau, une seule entrée
répond aux 2 critères.

Avec 2 critères le sommeprod() va donner un tableau de vrai / faux pour chacune des entrées du
tableau qui va tester

$A$2:$A$11á) * ($B$2:$B$11ñ)
Faux Faux = 0
Faux vrai = 0
Vrai Faux = 0
Vrai Vrai =1
Etc etc... pour chacune des lignes

Comme la valeur numérique de faux dans excel est 0
et la valeur numérique de Vrai est 1 , seules les entrées
dont les 2 colonnes égales vrai vont donner 1

Cette section de la formule :LIGNE(INDIRECT("1:"&LIGNES($A$2:$A$11)))
retourne un tableau de numéro des lignes indiquées dans la plage
la premiière ligne est 1 et la dernière ligne est 10 (LIGNES($A$2:$A$11))
Pour tester cela, sélectionne 10 lignes dans une même colonne, entre la formule
et valide par Ctrl + Maj + Enter ... chacune des cellules indiquera un chiffre de
1 à 10. (la plage à 10 lignes)

Si je multiplie le résultat obtenu par la première partie de la formule par le
numéro de la ligne, j'obtiens :
0 * 1 = 0
0 * 2 = 0
0 * 3 = 0
1 * 4 = 4

Le chiffre 4 devient la valeur retournée par sommeprod() qui est en fait le deuxième
argument de la fonction Index(Tableau,Ligne,Colonne). La ligne 4 est par conséquent
la ligne où les 2 conditions sont vrais. On connaît le tableau où chercher la valeur, on
vient d'évaluer la ligne = 4 et on la colonne est 1 (si non mentionnée) , on est donc
capable d'extraire la valeur recherchée.



"daniel" a écrit dans le message de news:
bonjour,
trouvé dans un message de Sept 2005 (sans matricielle).
=INDEX($C$2:$C$11;SOMMEPROD(($A$2:$A$11á)*($B$2:$B$11ñ)*LIGNE(INDIRECT("1:"&LIGNES($A$2:$A$11)))))
mais je ne saurais l'expliquer pour "ligne(indirect(....", si un crack peut
éclairer nos lanternes.....
Avatar
Paul V
Hello à tous,

Comme je suis le seul crack ( ;-) ) réveillé ou à l'écoute, je vais essayer
de vous expliquer mùais il va falloir s'accrocher car tant que l'on a pas
compris, on a vachement l'impression d'avoir du vide à la place du cerveau.

Notez que cela tombe bien que l'on soit samedi car cela vous laisse le
week-end pour vous appliquer.

Sans vouloir être arrogant, j'apprécierais que quelques uns me disent si
l'explication est claire car je ne suis pas sur d'arriver à tout bien
expliquer.

Bref, on y va.

D'abord, il faut remarquer que la formule récupérée par Daniel fonctionne
mais n'est pas indispensable ici. Elle était sans doute mieux adaptée là ou
il l'a récupérée mais elle ne se justifie pas réellement (AMHA) ici.
Les deux formules ci-dessous fontionnerait tout aussi bien et serait plus
"adaptées"

=INDEX($C$2:$C$11;SOMMEPROD(($A$2:$A$11á)*($B$2:$B$11ñ)*LIGNE(INDIRECT("1:"&NBVAL(Code)))))
=INDEX($C$2:$C$11;SOMMEPROD(($A$2:$A$11á)*($B$2:$B$11ñ)*LIGNE(INDIRECT("1:10"))))

Mais ce sera peut-être plus clair quand vous serez au bout de ce texte (du
moins, je l'espère)

Comme je ne vois pas trop ou cela coince, j'analyse toute la formule. Que
ceux qui maîtise les notions que je parcours, skipe sans vergogne à la
suite.

Tout d'abord INDEX qui me permet d'aller chercher dans une matrice une
valeur à un certain endroit.
La matrice est le preùmier argument ($C$2:$C$11)
L'endroit est le deuxième argument
(SOMMEPROD(($A$2:$A$11á)*($B$2:$B$11ñ)*LIGNE(INDIRECT("1:"&LIGNES($A$2:$A$11))))
Cela c'est pas trop compliqué sauf qu'il faut comprendre pourquoi ce
deuxième argument donne la valeur 4 qui est la position du code recherché.

Ensuite SOMMEPROD

Comme chacun le sait maintenant, SOMMEPROD, à la grande surprise de ces
concepteurs, est une fonction qui fait des choses imprévues à l'origine.
SOMMEPROD à l'origine est prévue pour "traiter" des matrices entre elles
afin d'obtenir la somme des produits.
C'est d'ailleurs ce que l'on trouve dans l'aide
"Multiplie les valeurs correspondantes des matrices spécifiées et calcule la
somme de ces produits."

Des petits malins ont découverts que cette fonction faisiat bien d'autres
choses et entre autre avantage, effectue donc un calcul matriciel sans
devoir valider comme les autres calculs matriciels.

Donc dans une fonction SOMEMPROD, le système parcourt toutes les matrices et
"engrange" au passage les résultats des différents traitements pour donner
en finale le résultat de l'ensemble.
Dans notre exemple la fonction :
=SOMMEPROD((Typeá)*1) donne 2 comme résultat. Pourquoi?
Le système parcourt la plage "type" , vérifie si la valeur est vrai ou
fausse ou en d'autres mots si la valeur est 1 (vrai) ou 0 (fausse) et
mulpiplie par 1 chaque résultat
Le calcul détaillé est donc pour la plage "Type" qui va de A2 à A11
A2á * 1 ou encore faux *1 ou encore 0 *1 ce qui fait 0
plus
A3á * 1 ou encore faux *1 ou encore 0 *1 ce qui fait 0
Et ainsi de suite pour passer par
A5á * 1 ou encore vrai *1 ou encore 1 *1 ce qui fait 1

Comme deux cellule sont égales à E, le total fera donc deux.

Si on combine plusieurs conditions, la logique est la même:
Exemple toujours dans le même tableau
=SOMMEPROD((Typeá)*(Nomñ)) donne 1 car il y a une seule cellule dans
type égale à E en même temps que une cellule en Nom = F1

On peut ainsi multiplier les combinaisons (quasi ) à l'inffini

Normalement, à ce stade ci, cela devrait être clair pour la première partie
du deuxième argument de la fonction originale.

Il ne reste plus que ce fameux LIGNE(INDIRECT("1:"&LIGNES($A$2:$A$11)))
Passons rapidement sur Ligne et Lignes, la première donnant la ligne de la
plage, la deuxième de nombre de lignes de la plage.
LIGNES($A$2:$A$11) renvoie donc le nombre de lignes de la plage càd ici 10.
Ceci explique maintenant pourquoi on pouvait simplisier la formule en
remplaçant LIGNES($A$2:$A$11))) par 10 ou par NBVAL(A2:A11) dans notre
exemple puisque la plage est fixe. (Pour les super cracks qui se gondolent
en me lisant, je suis d'accord que ce point pourrait être discuté, mais au
lieu de vous gondoler, vous feriez mieux de faire ce pensum à ma place ;-)
Je fatigue déjà un peu, et si vous voulez ma place, prenez la, moi je vais
promener au bois, il fait tellement beau aujourd'hui que je ne comprends pas
e que je fais devant mon PC)

Il ne reste qu'INDIRECT et l'ensemble.:
Indirect est aussi une fonction qui a un peu échappé à ses concepteurs.
A l'origine, indirect renvoie la référence inscrite dans une chaine de
caractère (en gros)
Mais son fonctionnement interne est très particulier et surprenant.
Si vous introsuisez, par exemple INDIRECT("1:10") dans une formule
matricielle, le système va créer un vecteur vertical "VIRTUEL" avec toutes
les valeurs de 1 à 10 et donc si cette formule est incluse dans un
sommeprod, il va traiter toutes les valeurs du vecteurs comme si c'était une
matrice existante.
Exemple: =SOMMEPROD(LIGNE(INDIRECT("1:10"))) donne 55 càd la somme des
numéro de ligne DANS LE VECTEUR VIRTUEL créé par indirect("1:10") soit
1+2+3+4+5+6+7+8+9+10

Je vous avait prévenu, c'était pas de la tarte. Vous suivez toujours?
Si c'est pas clair ( je vois d'ici vos yeux équarquillés donc je me permets
d'insister; Ceux qui ont pigé, passez tout de suite à la case suivante sans
passer par le parloir de la prison)
Si c'est pas clair, imaginer donc un vecteur virtuel vertical càd "un
morceau de colonne" dans un classeur qui n'existe que dans la mémoire de
votre PC qui est complèté avec toutes les valeurs de 1 à 10 soit 1,2,3,
etc...
Chaque valeur est donc à une certain numéro de ligne dans ce classeur
virtuel et Sommeprod fait l'addition de ces numéros de ligne.

Ceci étant dit et les choses étant ce qu'elles sont, terminons maintenant
notre analyse.

Dans :
(SOMMEPROD(($A$2:$A$11á)*($B$2:$B$11ñ)*LIGNE(INDIRECT("1:"&LIGNES($A$2:$A$11))))
la dernière partie va créer avec indirect un "vecteur virtuel vertical"
composé du nombres de valeurs comprises de 1 au nombres de lignes composant
la plage A2:A11 soit de 1 à 10 soit 10 donc un "vecteur vertical virtuel" de
10 cellules.
Sommeprod vas prendre la première ligne des trois conditions càd "A2 est-il
égal à E "(dans l'exmple non donc valeur 0) multiplié par "B2 est-il égal à
F1" (non donc valeur 0) multiplié par le numéro de ligne de la première
cellule du "vecteur vertical virtuel" (dans l'exmple 1); Le résultat de
cette multiplication est bien sur 0 puisqu'au moins un des facteurs est égal
à 0. A cela Somme prod ajoute le résultat de la deuxième ligne, qui donne
aussi valeur 0.
Il n'y a qu'une ligne ou les deux conditions sont remplies donc 1*1
multiplié par la ligne de la cellule correspondante dans le "VVV" (pour
vecteur virtuel vertical) c'est la quatrième ligne. Dans le VVV le numéro de
la ligne est donc 4 et 1*1*4=4
Toutes les autres lignes étant agales à 0, le total est bien 4.
Ce 4 est donc récupéré pour aller cherche la 4ème position dans la plage
couverte par index et on a donc le code correct.

Queceux qui ont compris lève le doigt.

A+

PAul V



"daniel" a écrit dans le message de news:

bonjour,
trouvé dans un message de Sept 2005 (sans matricielle).
=INDEX($C$2:$C$11;SOMMEPROD(($A$2:$A$11á)*($B$2:$B$11ñ)*LIGNE(INDIRECT("1:"&LIGNES($A$2:$A$11)))))
mais je ne saurais l'expliquer pour "ligne(indirect(....", si un crack
peut éclairer nos lanternes.....



Avatar
Paul V
Mer2,

J'étais pas le seul à ne plus dormir.
Salut MichDenis, si j'avais su, j'aurais pas venu.
T'as tout bien dit et en plus concis que moi.

A+

Paul V


"MichDenis" a écrit dans le message de news:

|
=INDEX($C$2:$C$11;SOMMEPROD(($A$2:$A$11á)*($B$2:$B$11ñ)*LIGNE(INDIRECT|
|
("1:"&LIGNES($A$2:$A$11)))))

Habituellement, si on avait seulement un critère, on utiliserait, une
formule
de ce genre : Exemple :
=INDEX(Code;EQUIV(F1;Nom;0))
Dans cette formule, on a remplacé Equiv() par une formule
matricielle Sommeprod() pour déterminer la ligne où les
2 condtions étaient vrai. Dans le tableau, une seule entrée
répond aux 2 critères.

Avec 2 critères le sommeprod() va donner un tableau de vrai / faux pour
chacune des entrées du
tableau qui va tester

$A$2:$A$11á) * ($B$2:$B$11ñ)
Faux Faux = 0
Faux vrai = 0
Vrai Faux = 0
Vrai Vrai =1
Etc etc... pour chacune des lignes

Comme la valeur numérique de faux dans excel est 0
et la valeur numérique de Vrai est 1 , seules les entrées
dont les 2 colonnes égales vrai vont donner 1

Cette section de la formule :LIGNE(INDIRECT("1:"&LIGNES($A$2:$A$11)))
retourne un tableau de numéro des lignes indiquées dans la plage
la premiière ligne est 1 et la dernière ligne est 10 (LIGNES($A$2:$A$11))
Pour tester cela, sélectionne 10 lignes dans une même colonne, entre la
formule
et valide par Ctrl + Maj + Enter ... chacune des cellules indiquera un
chiffre de
1 à 10. (la plage à 10 lignes)

Si je multiplie le résultat obtenu par la première partie de la formule
par le
numéro de la ligne, j'obtiens :
0 * 1 = 0
0 * 2 = 0
0 * 3 = 0
1 * 4 = 4

Le chiffre 4 devient la valeur retournée par sommeprod() qui est en fait
le deuxième
argument de la fonction Index(Tableau,Ligne,Colonne). La ligne 4 est par
conséquent
la ligne où les 2 conditions sont vrais. On connaît le tableau où
chercher la valeur, on
vient d'évaluer la ligne = 4 et on la colonne est 1 (si non mentionnée) ,
on est donc
capable d'extraire la valeur recherchée.



"daniel" a écrit dans le message de news:

bonjour,
trouvé dans un message de Sept 2005 (sans matricielle).
=INDEX($C$2:$C$11;SOMMEPROD(($A$2:$A$11á)*($B$2:$B$11ñ)*LIGNE(INDIRECT("1:"&LIGNES($A$2:$A$11)))))
mais je ne saurais l'expliquer pour "ligne(indirect(....", si un crack
peut
éclairer nos lanternes.....






1 2 3