[Résolu] Fonction PRODUIT puis SOMME

Discussions à propos du tableur Calc.
Les questions sur les macros doivent être postées dans la section dédiée en dessous.

Modérateur: Vilains modOOs

Règles du forum
Cette section est uniquement dédiée au tableur Calc. Vous ne devez pas poster ici de questions sur les macros mais utiliser la section éponyme.

[Résolu] Fonction PRODUIT puis SOMME

Messagepar Guillaume85 » 24 Août 2006 17:47

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... :)
Open Office 2.2.1 Windows XP
Guillaume85
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 11
Inscrit le : 24 Août 2006 17:38

Messagepar cris59 » 24 Août 2006 18:51

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
Dernière édition par cris59 le 25 Août 2006 10:14, édité 1 fois.
WinXP PRO SP2 avec OOo2.2 & Vista avec OOo2.3.1
& Debian avec OOo2.2

http://www.cpserv.net/
Avatar de l’utilisateur
cris59
Membre enthOOusiaste
Membre enthOOusiaste
 
Message(s) : 482
Inscrit le : 20 Mars 2006 16:15
Localisation : Paris

Messages d'erreur

Messagepar Guillaume85 » 25 Août 2006 08:23

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.
Open Office 2.2.1 Windows XP
Guillaume85
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 11
Inscrit le : 24 Août 2006 17:38

Messagepar Dude » 25 Août 2006 08:31

Le mieux est encore que tu joignes un fichier contenant ta macro que l'on voit ce qui ne va pas.
AOO 4.1.7 sous Windows 7 Pro x64

Poser une question, c'est bien. Répondre aux autres, c'est encore mieux.
Améliorez AOO et votez pour les issues
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 21143
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1

Messagepar cris59 » 25 Août 2006 09:19

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
Dernière édition par cris59 le 25 Août 2006 10:17, édité 1 fois.
WinXP PRO SP2 avec OOo2.2 & Vista avec OOo2.3.1
& Debian avec OOo2.2

http://www.cpserv.net/
Avatar de l’utilisateur
cris59
Membre enthOOusiaste
Membre enthOOusiaste
 
Message(s) : 482
Inscrit le : 20 Mars 2006 16:15
Localisation : Paris

Messagepar cris59 » 25 Août 2006 10:25

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
Dernière édition par cris59 le 26 Août 2006 05:01, édité 1 fois.
WinXP PRO SP2 avec OOo2.2 & Vista avec OOo2.3.1
& Debian avec OOo2.2

http://www.cpserv.net/
Avatar de l’utilisateur
cris59
Membre enthOOusiaste
Membre enthOOusiaste
 
Message(s) : 482
Inscrit le : 20 Mars 2006 16:15
Localisation : Paris

Voici le fichier

Messagepar Guillaume85 » 25 Août 2006 16:13

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.
Open Office 2.2.1 Windows XP
Guillaume85
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 11
Inscrit le : 24 Août 2006 17:38

Messagepar Pierre-Yves Samyn » 25 Août 2006 16:56

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 ?
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 11276
Inscrit le : 02 Mai 2006 09:42

Messagepar cris59 » 26 Août 2006 07:59

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
WinXP PRO SP2 avec OOo2.2 & Vista avec OOo2.3.1
& Debian avec OOo2.2

http://www.cpserv.net/
Avatar de l’utilisateur
cris59
Membre enthOOusiaste
Membre enthOOusiaste
 
Message(s) : 482
Inscrit le : 20 Mars 2006 16:15
Localisation : Paris

REMERCIEMENTS

Messagepar Guillaume85 » 26 Août 2006 10:05

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
Open Office 2.2.1 Windows XP
Guillaume85
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 11
Inscrit le : 24 Août 2006 17:38

RESOLU

Messagepar Guillaume85 » 28 Août 2006 07:06

A+
Open Office 2.2.1 Windows XP
Guillaume85
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 11
Inscrit le : 24 Août 2006 17:38


Retour vers Tableur

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Google [Bot] et 5 invité(s)