Ajouter un filtre dans un tableau dynamique croisé en macro

Bonjour,
Suite à mes deux précédents posts, je continue mon apprentissage/exploration… mais je bute sur ce point.
Je n’arrive pas à ajouter un filtre au tableau dynamique croisé que je créé par une macro.
Je crois que je n’arrive pas à comprendre comment on se sert des fonctions, propriétés, méthodes ou valeurs d’un objet en basic… Dans le document proposé dans mon premier post (www.pitonyak.org/oo.php) , je vois bien qu’il y a tout en page 510 et 511 (affichée 506), mais il n’y a pas d’exemple et je n’arrive toujours qu’à des erreurs de type “propriété ou méthode non trouvée”.
Je n’en trouve pas non plus sur le net qui arrivent à me faire comprendre comment cela fonctionne…

Voici une partie de mon code :

rem On récupère les données du tableau 
tabCD = feuille.getDataPilotTables()

rem on crée un descripteur avec les infos du tableau source
TDescriptor  = tabCD.createDataPilotDescriptor()
TDescriptor.setSourceRange(adresseTableau)
tousLesChamps = TDescriptor.getDataPilotFields()

rem On trie par "Classe scolaire" (3ème colonne) et par "Nom-Prénom" (2ème colonne) dans le champs "lignes"
champs =  TousLesChamps.getByIndex(3)
champs.Orientation = com.sun.star.sheet.DataPilotFieldOrientation.ROW
champs = TousLesChamps.getByIndex(2)
champs.Orientation =  com.sun.star.sheet.DataPilotFieldOrientation.ROW

rem Ajoute le filtre sur la première date du mois (colonne 4)   (C'est là que ça commence à ne plus fonctionner...)
filtreTD = com.sun.star.sheet.field(4)
Champs = TousLesChamps.getByIndex(4)
Champs.FilterOperator = com.sun.star.sheet.FilterOperator.EQUAL
Champs.NumericValue = 1

rem On crée le tableau dynamique dans la feuille "Appel du jour"
tabCD.insertNewByName("EtudeDuMois", CellAddress, TDescriptor)

Je veux donc juste un filtre sur la colonne 4 où les champs sont égaux à 1.

Quelqu’un peut-il m’aider ?

Bonjour @Da_BouH

Il est possible de filtrer une table dynamique soit directement dans la table (cf. AutoFiltre) ou via le champ Filtre.

Le classeur joint crée donc deux exemples (en Feuille2 filtre sur vendeur Anne et Feuille3 filtre sur vendeur Marie).

CreerDeuxTablePilote2.ods (31,1 Ko)

Cordialement

1 Like

Yes ! Ça fonctionne !
Encore une fois, merci !

Je constate que j’avais à peu près les fonctions et propriétés sous le nez et que j’étais bien au bon endroit dans l’aide, mais il me manque cruellement la logique de la syntaxe (et sûrement quelques concepts également !) pour réussir tout seul… Merci à toi pour toutes ces mises à niveau !

Penses-tu qu’il serait possible de récupéré le champ de filtre pour l’afficher dans une case ?

Dans mon “exo”, je filtre suivant les “présents” à une date (Ce que j’ai dans mon filterOperator égal à 1). J’aimerais afficher cette date choisie dans ce filtre (qui est un titre de colonne du tableau source) dans une case au dessus du tableau dynamique.

Je suis en train d’essayer notamment avec la fonction setFormula d’une cellule, mais je ne sais pas ce que je peux y mettre…

(je crois que ma question n’est pas très clair… mais là tout de suite, je n’arrive pas à l’être plus !

Bonjour

Félicitations, commencer son apprentissage par un aussi gros morceau n’est pas une mince affaire…

Comme c’est quoi qui fixe le filtre dans le programme tu peux a priori faire ce que tu veux, donc… je crois que je ne comprends pas la question :frowning:

S’il s’agit de savoir comment gérer l’entrée d’une date, je montre des exemples dans cette fiche sur le wiki.

On est d’accord que mon explication est complètement nulle :sweat_smile: (à ma décharge, j’ai le covid depuis hier soir !).
Je crois qu’on ne peut pas y couper, je te joins le fichier anomymé :
fichier-étude.ods (19.1 KB)

La feuille “Appel du jour” a été créé par la macro (avec le bouton de la première feuille).
Dans cette feuille, j’essaie de mettre en A3 la date qui a été sélectionnée dans le filtre. Dans un premier temps, lors de la création du tableau, et peut-être après (soyons fous), dès que le filtre de ce tableau est modifié (donc qu’une autre date est sélectionnée). J’ai bien cru voir qu’on pouvait gérer ce genre “d’événement”.
J’ai laissé en commentaire dans la macro les dernières choses testées en vain.

Et merci pour les encouragements, j’avoue que parfois, ça me rappelle “l’overdose” de java que j’avais eue pendant mon IUT… ça remonte à loin, mais j’hallucine toujours autant sur ces commandes à rallonge de propriétés, méthodes, fonctions… Je n’arrive pas à trouver un répertoire clair de tout ça (à part ton premier fichier d’aide !) et surtout avec des exemples. Celui d’openoffice a l’air complet, mais je n’y comprends pas grand chose…

La page Macro du wiki regroupe l’essentiel des ressources. Parmi celles-ci tu ne peux faire l’impasse sur l’outil MRI qui permet d’afficher les propriétés, méthodes, services et interfaces supportées par un objet. J’ai moi même recouru à cet outil pour répondre à ta nouvelle question (car je n’avais pas la réponse toute prête).

Outre les sites webs le livre de Bernard Marcelly & Laurent Godard reste une référence.

Pour récupérer le champ choisi pour le filtre il faut accéder à l’objet DataPilotTables.

Digression : dans ton classeur exemple je constate que tu as lancé plusieurs fois le programme de création du tableau dynamique… sans supprimer le(s) précédent(s). Il y a donc plusieurs TD “fantômes”. Une bonne pratique consiste à vérifier dans le pgm s’il ne faut pas d’abord supprimer avant de créer. J’ai supprimé ces fantômes dans l’exemple que je joins et j’ai inclus la routine permettant de le faire.

À partir du TD on accède à l’objet FilterDescriptor qui donne accès au premier des FilterFields dont la proprité Field contient l’index du champ utilisé dans le filtre.

Par cet index on peut conntaître le nom du champ par

oDP.DataPilotFields.getByIndex(lFF).name

Ceci donne une chaîne contenant la date sous forme numérique (44682 par ex.). On convertit et on peut définir la propriété value de A3.

oSheet.getCellRangeByName("A3").value = cdbl(oDP.DataPilotFields.getByIndex(lFF).name)

La fonctionnalité que tu cherches à développer va encore plus loin dans la difficulté. Elle nécessite l’utilisation d’un listener (gestionnaire d’événements) pour réagir au changement de filtre. Cela tombe bien, les tableaux dynamiques permettent de créer des XModifyListener.

Ceci est fait dans la procédure PysListenersAdd .
On peut arrêter un listener par la méthode remove de l’objet :

oDP.RemoveModifyListener(oListener)

On passe en paramètre la variable “pointant” vers le listener. Il faut donc que cette variable soit connue de la procédure. On définit pour cela sa portée comme global.

fichier-étude.ods (27,2 Ko)

Voila, j’espère à mon tour avoir été clair mais, encore une fois, c’est peut-être un gros morceau…

1 Like

WA-HoU !
Bon bah voilà, je sais ce qu’il me reste à faire dès que j’irai un peu mieux :slight_smile: (là, j’ai peur de ne plus savoir si j’ai mal au crane à cause du PC, du basic ou du covid :smile: ) !

Superbe réponse, merci beaucoup. Je te tiens au courant si j’arrive à faire tout ça (ou si je bloque.
Je ne connaissais pas ce MRI, je vais potasser ça également. Ça semble être exactement ce qu’il me faut !