[Résolu][Calc] Tableaux croisés

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur: Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !

[Résolu][Calc] Tableaux croisés

Messagepar Briac44 » 19 Oct 2021 11:06

Bonjour,

Existe t'il une fonction ou une procédure simple pour résoudre le problème suivant :

Remplir la colonne prix de la Feuille1 en fonction du tableau de la Feuille2
Sinon une piste pour orienter mes recherches.
Merci par avance
Pièces jointes
test.ods
(9.9 Kio) Téléchargé 16 fois
Dernière édition par Oukcha le 20 Oct 2021 17:18, édité 1 fois.
Raison: Balisage
LibreOffice 6.0.7.3 Ubuntu 18.04.4
Briac44
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 19
Inscrit le : 16 Oct 2021 13:24

Re: [Calc] Tableaux croisés

Messagepar Noonours » 19 Oct 2021 14:25

Bonjour
Cette section concerne les macros, or je ne vois pas de macro dans ton document...
De plus, la résolution de ton problème est possible sans macro, avec la fonction = SOMMEPROD() ou le couple =INDEX() / EQUIV() ce qui est plus robuste qu'une solution avec macro.
Si tu choisis de continuer SANS macro, il faudra poster ce message dans la section tableur.
Si toutefois tu es obligé de procéder par programmation, merci de préciser le contexte, les ténors de la programmation te répondront mieux que moi :wink:
COOordialement,
Noonours plantigrade râleur

Pour obtenir la réponse la plus précise possible, N’HÉSITEZ SURTOUT PAS À JOINDRE UN FICHIER

LibO 7.1.7.2(x64) et AOO 4.1.11 sous Windows 10
LibO 6.1.6.3_M14 MIMO (obligation de version) sous Win 7
Avatar de l’utilisateur
Noonours
Membre enthOOusiaste
Membre enthOOusiaste
 
Message(s) : 420
Inscrit le : 11 Mai 2013 01:11
Localisation : Aix en Provence

Re: [Calc] Tableaux croisés

Messagepar Briac44 » 19 Oct 2021 17:33

Bonjour,

Désolé, je n'ai pas été assez précis.
Il s'agit bien d'écrire une macro, mais je ne savais pas par où commencer. J'avais fait de multiples essais et recherches sans succès.
J'ai passé l'après-midi à écrire quelque chose qui fonctionne a peu près. J'ai encore besoin d'affiner mon début de solution.
Je reviendrai demain matin pour donner ce que j'ai trouvé et demander une correction si besoin.

Merci encore pour le suivi.
LibreOffice 6.0.7.3 Ubuntu 18.04.4
Briac44
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 19
Inscrit le : 16 Oct 2021 13:24

Re: [Calc] Tableaux croisés

Messagepar zeguedon » 19 Oct 2021 23:04

Bonjour,
Capture2.png
Cliquer sur l'image l'agrandir

Apparemment c'est ce que tu souhaites. Une extension existe déjà pour faire ça. C'est par ici : https://forum.openoffice.org/fr/forum/viewtopic.php?f=18&t=15998#p88708
@+
Comment baliser [Résolu] ?
AOO 4.1.10
LibreOffice 7.1.5.2
Sous Linux & Windows 10
zeguedon
ManitOOu
ManitOOu
 
Message(s) : 2851
Inscrit le : 02 Juil 2014 18:25

Re: [Calc] Tableaux croisés

Messagepar Briac44 » 20 Oct 2021 11:42

Merci Zeguedon pour ta réponse.
Comme je le disais plus haut, je souhaite écrire une macro pour réaliser le même travail.
Ma macro se présente comme ceci :

Code : Tout sélectionner   AgrandirRéduire
option Explicit

Sub recup_tarif_client

Dim oDocument As Object, maFeuille As Object, maCellule As Object, calculTarif As Object
Dim monProduit As Object, monClient As Object, monPrix As Object
Dim valeurProduit As String, valeurClient As String, valeurPrix As Long, inc As Long

maFeuille = ThisComponent.Sheets.getByName("Feuille1")

monClient = maFeuille.getCellByPosition(0,1)
valeurClient = monClient.getString()

monProduit = maFeuille.getCellByPosition(1,1)
valeurProduit = monProduit.getString()

monPrix = maFeuille.getCellByPosition(2,1)
valeurPrix = monPrix.value

inc = 1
While valeurClient <> ""
   
   valeurPrix = calculTarif(valeurClient, valeurProduit)
   
   monClient = maFeuille.getCellByPosition(inc,1)
   valeurClient = monClient.getString()

   monProduit =maFeuille.getCellByPosition(inc,1)
   valeurProduit = monProduit.getString()

   monPrix = maFeuille.getCellByPosition(inc,1)   
   
   inc = inc+1
Wend
End Sub


Function calculTarif(monClient As Object, monProduit As Object)

Dim maFeuille2 As Object, ocellClient As Object, ocellProduit As Object, ocellResultat As Object
Dim valeurLigne As String , valeurColonne As String, valeurResultat As Long
Dim x As Long, y As Long, a As Long, b As Long

   maFeuille2 = ThisComponent.Sheets.getByName("Feuille2")
   x = 0
   y = 1
   a = 1
   b = 0
   
   ocellClient = maFeuille2.getCellByPosition(x,y)   
   valeurLigne = ocellClient.getString()
   
   ocellProduit = maFeuille2.getCellByPosition(a,b)
   valeurColonne = ocellProduit.getString()

   while valeurligne <> "" ' Détermine l'index de la ligne
      If valeurLigne = monClient Then
         while valeurColonne <> ""  ' détermine l'index de la colonne
            If valeurColonne = monProduit Then             
               ocellResultat = maFeuille2.getCellByPosition(a,y)
               valeurResultat = ocellResultat.value()
               print valeurResultat
            Else
               a = a+1
               ocellProduit = maFeuille2.getCellByPosition(a,b)
               valeurColonne = ocellProduit.getString()
            End If
         Wend
      Else
         y = y+1          
         ocellClient = maFeuille2.getCellByPosition(x,y)
         valeurLigne = ocellClient.getString()
      End If
   Wend
         
      
End Function


Je dois faire une erreur de syntaxe quelque part, car je rencontre les problèmes suivants :
- à la ligne : valeurPrix = calculTarif(valeurClient, valeurProduit) , la fonction calculTarif ne se lance pas
- la fonction en elle-même me donne bien le résultat escompté, mais ne renvoie pas la valeur "valeurResultat"

Merci par avance de me dire ou je fais erreur
LibreOffice 6.0.7.3 Ubuntu 18.04.4
Briac44
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 19
Inscrit le : 16 Oct 2021 13:24

Re: [Calc] Tableaux croisés

Messagepar Dude » 20 Oct 2021 12:43

Salut,

Briac44 a écrit:Comme je le disais plus haut, je souhaite écrire une macro pour réaliser le même travail.

Qu'est ce qui t'empêche de reprendre le code qui est dans l'extension Décroise ?

Briac44 a écrit:- à la ligne : valeurPrix = calculTarif(valeurClient, valeurProduit) , la fonction calculTarif ne se lance pas

Et donc, as-tu fait le débogage de ta macro ?
Code : Tout sélectionner   AgrandirRéduire
valeurColonne = ocellProduit.getString()

S'il s'agit de récupérer un nombre, ce n'est pas avec cette méthode qu'il faut agir. :?
En utilisant l'outil XRay, tu aurais vu que getValue fonctionne mieux.
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 22829
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1

Re: [Calc] Tableaux croisés

Messagepar Briac44 » 20 Oct 2021 14:36

Bonjour,

Qu'est ce qui t'empêche de reprendre le code qui est dans l'extension Décroise ?


Parce que mes deux tableaux en Feuille 1 et Feuille 2 ne sont pas figés. Les listes des clients et de produits vont s'allonger tous les mois. Je dois donc faire des boucles et je ne vois pas comment incrémenter les lignes et les colonnes.

Et donc, as-tu fait le débogage de ta macro ?


Oui, et j'ai déterminé ou ça bloque.
J'ai une fonction : Function calculTarif(monClient As Object, monProduit As Object)
Je l'appelle par valeurPrix = calculTarif(valeurClient, valeurProduit)

Dans ma macro, valeurClient = DUPOND mais la fonction ne récupère pas cette valeur pour la variable monClient.
Même chose pour valeurProduit = Produit1 qui n'est pas récupérée par la variable monProduit de la fonction.

J'imagine qu'il y a une erreur de syntaxe, mais je ne vois pas où.

S'il s'agit de récupérer un nombre, ce n'est pas avec cette méthode qu'il faut agir.

Toutes mes valeurs récupérées sont bien des chaines de caractères, sauf la valeur Prix qui elle est bien récupérée par un getValue

J'aimerais donc dans un premier temps régler ce passage de valeur à la fonction avant de m'attaquer au renvoi du résultat par la fonction.
Merci par avance
LibreOffice 6.0.7.3 Ubuntu 18.04.4
Briac44
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 19
Inscrit le : 16 Oct 2021 13:24

Re: [Calc] Tableaux croisés

Messagepar Briac44 » 20 Oct 2021 15:14

L'erreur vient de la définition de la fonction qui doit être faite comme ceci : Function calculTarif(monClient As String monProduit As String) As Object
Le deuxième problème reste entier : le code de la fonction calcule bien le résultat, mais la fonction ne renvoie pas ce résultat.
Je continue à chercher
LibreOffice 6.0.7.3 Ubuntu 18.04.4
Briac44
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 19
Inscrit le : 16 Oct 2021 13:24

[Calc] [Résolu]Tableaux croisés

Messagepar Briac44 » 20 Oct 2021 15:37

Merci pour les réponses qui m'ont bien orienté dans mes recherches. Je n'ai pas résolu le renvoi de la fonction.
Je vais donc reposter un exemple simple pour comprendre ce qui ne fonctionne pas
Merci encore
LibreOffice 6.0.7.3 Ubuntu 18.04.4
Briac44
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 19
Inscrit le : 16 Oct 2021 13:24


Retour vers Macros et API

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 10 invité(s)