Page 1 sur 1

[Résolu] Fonction PRODUIT puis SOMME

MessagePublié: 24 Août 2006 17:47
par Guillaume85
Bonjour,

Voilà mon problème :
J'ai un tableau avec 133 colonnes et presques autant de lignes.

Je veux calculer la somme des produits :

=C4*C2+D4*D2+E4*E2+F4*F2.... et comme ça jusqu'à la colonne FQ

Et non pas SOMMPROD (C4:FQ4;C2:FQ2)

Connaissez-vous une formule qui puisse me simplifier la vie ?


Je vous remercie d'avance et espère vivement que quelqu'un va me donner une solution parce qu'autre il y a du temps à passer... :)

MessagePublié: 24 Août 2006 18:51
par cris59
Tu peux définir une fonction ...

Dans la bibliothèque "Standard" de "Mes Macros et boites de dialogues", tu écris ta fonction et tu l'appelles comme une fonction classique

Code : Tout sélectionner   AgrandirRéduire
Function LASOMPROD(a,b)
maFeuille = thisComponent.Sheets.getByIndex(0)
laSomme = 0
For i = 2 to 11     'colonne C à L, l'index des colonnes commence à 0
leProd = maFeuille.getCellByPosition(i, a).getValue() * maFeuille.getCellByPosition(i, b).getValue()
laSomme = laSomme + leProd
next i
LASOMPROD = laSomme
End Function


tu appelles ta fonction par =LASOMPROD(3;1) qui correspond à ton exemple =C4*C2+D4*D2+E4*E2+F4*F2....

J'ai été jusqu'à L, toi tu mets l'index correpondant à FQ

Fais attention le séparateur est une virgule dans la fonction, mais il faut un point-virgule à l'appel de la fonction dans la cellule


cris59

Messages d'erreur

MessagePublié: 25 Août 2006 08:23
par Guillaume85
Voilà ce que j'ai rentré :

Code : Tout sélectionner   AgrandirRéduire
Function LASOMPROD(a,b)
maFeuille = thisComponent.Sheets.getByIndex(0)
laSomme = 0
For i = 3 to 135     'colonne C à FQ, l'index des colonnes commence à 0
leProd = maFeuille.getCellByPosition(i, a).getValue() * maFeuille.getCellByPosition(i, b).getValue()
laSomme = laSomme + leProd
next i
LASOMPROD = laSomme
End Function


Les messages d'erreur suivants apparaissent :

- lorsque je lis le programme dans Oobasic, blocage à la ligne commençant par maFeuille
"Runtime error BASIC"
"Propriété ou méthode introuvable"


- lorsque j'éxécute la Macro, blocage à la ligne commençant par leProd
"Runtime error BASIC"
"L'argument n'est pas facultatif"


PS : Je ne connais pratiquement rien en programmation. J'ai vu ça à l'école mais mes connaissances sont faibles.

Merci d'avance pour votre aide.

MessagePublié: 25 Août 2006 08:31
par Dude
Le mieux est encore que tu joignes un fichier contenant ta macro que l'on voit ce qui ne va pas.

MessagePublié: 25 Août 2006 09:19
par cris59
Correctif pour ta fonction

Code : Tout sélectionner   AgrandirRéduire
Function LASOMPROD(a,b)
maFeuille = thisComponent.Sheets.getByIndex(0)
laSomme = 0
For i = 3 to 135     'colonne C à FQ, l'index des colonnes commence à 0
leProd = maFeuille.getCellByPosition([i - 1, a - 1).getValue() * maFeuille.getCellByPosition(i - 1, b - 1).getValue()
laSomme = laSomme + leProd
next i
LASOMPROD = laSomme
End Function


les index commencent à 0, pour avoir la colonne C il faut mettre 2 par exemple, c'est pour cela que j'ai rajouté - 1 sur les index


Il ne faut pas lancer la macro

1. tu copies / colles la fonction dans la bibliothèque "Standard" de "Mes Macros et boites de dialogues"

2. tu fermes l'éditeur Basic

3. dans une cellule tu écris

=LASOMPROD(4;2) tu fais Entrée et tu auras le résultat


Tu utilises LASOMPROD(a;b) de la même manière que les autres fonctions de Calc


cris59

MessagePublié: 25 Août 2006 10:25
par cris59
La fonction marche bien mais n'étant ratachée à aucune cellule elle ne se met pas à jour automatiquement si tu modifies une des valeurs concernées

Une solution :

Code : Tout sélectionner   AgrandirRéduire
Function LASOMPROD(a,b,c)
maFeuille = thisComponent.Sheets.getByIndex(0)
laSomme = 0
laZone = c
For i = 3 to 135    'colonne C à FQ
   leProd = maFeuille.getCellByPosition(i - 1, a - 1).getValue() * maFeuille.getCellByPosition(i - 1, b - 1).getValue()
   laSomme = laSomme + leProd
next i
LASOMPROD = laSomme
End Function


que tu appelles par

=LASOMPROD(2;4;C2:FQ4)


cris59

Voici le fichier

MessagePublié: 25 Août 2006 16:13
par Guillaume85
Désolé ça ne fonctionne pas.


Peut être (sûrement) que je m'y prends mal.

Voici le fichier :

http://user.services.openoffice.org/fr/ci-joint/fichier/2006/08/25-050941.ods


Merci beaucoup pour votre aide.

MessagePublié: 25 Août 2006 16:56
par Pierre-Yves Samyn
Bonjour

Ton classeur ne contenant pas la macro (je pense que tu as suivi l'excellent conseil de cris59 te proposant de coller cette macro dans la bibliothèque standard d'OpenOffice afin d'en disposer quel que soit le classeur), il est difficile de voir ce qui ne va pas...

Alors, j'ai simplement inclus la macro dans le classeur lui-même, en appelant la fonction comme le préconise cris59 et cela fonctionne parfaitement chez moi, cf. fichier joint

http://user.services.openoffice.org/fr/ci-joint/fichier/2006/08/25-055247.ods

Qu'en est-il pour toi ?

MessagePublié: 26 Août 2006 07:59
par cris59
Plusieurs choses

1. OpenOffice recalcule si possible les fonctions dès que celles-ci lui sont visibles et il charge ses bibliothèques avant de charger le classeur.

Problème : lorsque la fonction est placée dans la bibliothèque "Standard" de "Mes Macros et boites de dialogues" elle fait appel aux feuilles du classeur (Sheets), il y a une erreur à l'ouverture du fichier ... le fichier n'étant pas chargé complétement, il ne peut voir les feuilles ...

Solution : placer la fonction dans un module sur le classeur lui-même

2. Vu ton fichier et ce que tu veux obtenir, je te propose la solution suivante

Code : Tout sélectionner   AgrandirRéduire
Function LASOMPROD(a,b,c,d)
REM appel dans la cellule par   =LASOMPROD(2;4;C2:FQ2;C4:FQ4)   
laSomme = 0
leCoef = c
laZone = d
maFeuille = thisComponent.Sheets.getByIndex(0)
For i = 3 to 174    'colonne C à FQ
   leProd = maFeuille.getCellByPosition(i - 1 , a - 1).getValue() * maFeuille.getCellByPosition(i - 1, b - 1).getValue()
   laSomme = laSomme + leProd
next i
LASOMPROD = laSomme
End Function


=LASOMPROD(2;4;C2:FQ2;C4:FQ4),

ce qui est en index 2 ne change pas (cela correspond à la ligne des coefficients), les autres doivent être le n° de ligne approprié.

=LASOMPROD(2;6;C2:FQ2;C6:FQ6) pour le total à la ligne 6


ton fichier modifié

http://user.services.openoffice.org/fr/ci-joint/fichier/2006/08/26-085302.ods


cris59

REMERCIEMENTS

MessagePublié: 26 Août 2006 10:05
par Guillaume85
Grand merci à tous pour votre aide.
Vous m'enlever une belle épine du pied.

Christine, je ne manquerais pas de te faire de la pub auprès de mes supérieurs dès que l'occasion se présentera.


A la prochaine :D



Guillaume

RESOLU

MessagePublié: 28 Août 2006 07:06
par Guillaume85
A+