[Résolu] [Calc] Filtrer un tableau

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 !
bertrandRibon
NOOuvel adepte
NOOuvel adepte
Messages : 10
Inscription : 01 juin 2019 19:29

[Résolu] [Calc] Filtrer un tableau

Message par bertrandRibon »

Bonjour,
Présentation :
Je fais très souvent un filtre sur un "gros" (30 colonne,s 1600 lignes) tableau, et je me demandais s'il n'y avait pas moyen d'automatiser cela via une macro, par exemple.
Essai :
J'ai vu que l'on pouvait créer des macros par enregistrement des actions, quitte à modifier/ corriger le code après coup, mais là c'est un flop complet...
Tâches effectuées :
Dans mon tableau de 30 colonnes et 1600 lignes, j'ai 4 colonnes contenant, mettons, 250 termes au total. Je veux filtrer mon tableau sur un ("terme1") de ces 250 termes, et pour ce faire, je fais appel à la fonction filtre standard, qui comporte justement 4 lignes, et pour chacune, je met le nom de la première colonne, je choisis comme condition "=" (égal à), et en valeur mon "terme1". Puis je passe à la deuxième ligne, avec l'opérateur "ou", et je répète les mêmes choses, avec bien sûr le nom de la deuxième colonne, idem pour les 3ème et 4ème lignes. Pas compliqué, facile à vérifier, mais un peu laborieux d'où...
La macro rêvée :
J'en décris le fonctionnement, je peux, puisque c'est un rêve : je me positionne sur n'importe quelle case (non vide) de ces 4 colonnes (je suis donc sur une case qui contient un des 250 termes), et j'appuie sur le raccourci ad-hoc, et mon filtre se fait (sur le terme sélectionné).... le top !
La question :
Cela semble facile, mais je ne sais même pas si c'est faisable, et je n'ai aucune notion des instructions à utiliser... donc si quelqu'un pouvait -outre la faisabilité - me donner ne serait-ce que les instructions à utiliser, je fouillerai pour voir comment en faire une macro...
Merci d'avance à tous, pour ceux qui ont lu, pour ceux qui répondent.....
Cordialement,
Bertrand
Dernière modification par bertrandRibon le 11 juin 2019 01:37, modifié 1 fois.
Open Office 4.1.6 sur Debian 9.8
Avatar de l’utilisateur
micmac
RespOOnsable forum
RespOOnsable forum
Messages : 9255
Inscription : 28 août 2010 08:45

[Calc] Filtrer un tableau

Message par micmac »

Bonjour,

Cette section a des règles très précises que vous devez obligatoirement suivre pour obtenir de l'aide. C'est indiqué dans le cadre rouge en haut de la page.

Il est demandé aux auteurs de faire précéder le titre de leur question d'une balise adéquate. Ce balisage est extrêmement important car il permet d'avoir une base de connaissance optimum en cas de recherche.
Avez-vous remarqué comment étaient postées les autres questions ?

Lisez ce fil pour savoir quelle balise utiliser : https://forum.openoffice.org/fr/forum/s ... html#27295

N'oubliez pas que les termes Macro, OpenOffice ne doivent pas être employés car il sont implicites. Essayez de synthétiser au mieux ce que vous cherchez à faire.

Le titre de votre question n'est pas assez explicite ou ne reflète pas le problème que vous décrivez :
< Créer une macro pour filtrer un tableau >
Nous l'avons donc modifié. En effet, lors d'une recherche, ce sujet risquait de passer inaperçu et donc de ne pas aider d'autres personnes ayant le même problème que vous.
Nous l'avons fait pour vous cette fois-ci mais lors de votre prochaine question, nous vous remercions de le faire vous-même au risque de voir votre sujet verrouillé.

Merci de votre collaboration.
Touche Ctrl de Windows = touche cmd⌘ sur Mac
Outils > Options sur Windows = OpenOffice > Préférences sur Mac
Avatar de l’utilisateur
Noonours
PassiOOnné
PassiOOnné
Messages : 501
Inscription : 11 mai 2013 00:11
Localisation : Aix en Provence

Re: [Calc] Filtrer un tableau

Message par Noonours »

Bonjour BertrandRibon et bienvenue sur ce forum,

une proposition vite-fait avec une macro déclenchée par un double-clic sur la donnée que tu veux filtrer.
(pour ça, il faut faire un clic-droit sur l'onglet de la feuille, puis "Evènements de la feuille..." et assigner la macro au double-clic)

Le script en question:

Code : Tout sélectionner

Sub FiltrerDblClick(oEv As Object)

oDoc = thisComponent
oFeuil = oDoc.sheets.getByName("Feuille1")
MaZone = oFeuil.getCellRangeByName("A1:J100") 'zone à determiner

Dim LeChampFiltre(0) As New com.sun.star.sheet.TableFilterField2

With LeChampFiltre(0)
	.Field = oEv.CellAddress.Column
	.Operator = com.sun.star.sheet.FilterOperator2.EQUAL
	.IsNumeric = False
	.StringValue = oEv.String
End With

MonFiltre = MaZone.createFilterDescriptor(true)

With MonFiltre
	.ContainsHeader = true
	.Orientation = com.sun.star.table.TableOrientation.COLUMNS
	.FilterFields2 = LeChampFiltre()
End With

MaZone.Filter(MonFiltre)

End Sub
Alors c'est très simplifié et ne tient pas compte d'une éventuelle sélection multiple de cellules, d'un double-clic en dehors de tes données, ou d'un retour avec un affichage de données non-filtrées... et autres "garde-fous" ... :lol:

J'ai créé un fichier exemple ci dessous, qui conserve les en-têtes de colonnes, dis nous si c'est en gros ce que tu attends. (le filtre peut être déclenché par autre chose qu'un double-clic: bouton, commande dans le menu...)
BertrandRibon.ods
COOordialement,
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Noonours le 15 oct. 2019 18:30, modifié 1 fois.
Noonours procrastinateur perfectionniste: "Je fais rien, mais demain je l'ferai mieux"

Pour obtenir la réponse la plus précise possible, VEUILLEZ JOINDRE UN FICHIER

LibO 7.6.5.2 Stable et OpenOffice 4.1.15 sous Windows 10
bertrandRibon
NOOuvel adepte
NOOuvel adepte
Messages : 10
Inscription : 01 juin 2019 19:29

Re: [Calc] Filtrer un tableau

Message par bertrandRibon »

Bonjour et merci de t'être penché sur mon problème...
J'ai essayé, et la macro ne donne pas tout à fait le résultat que je souhaite... et je ne me suis pas encore assez investi dans la programmation pour comprendre comment cela fonctionne et pouvoir la modifier moi même... c'est prévu, il me faut juste y consacrer le temps nécessaire...
Pour mieux me faire comprendre, j'ai fait le tableau joint qui ressemble à mon tableau, et si, par exemple, on se met dans la case D6 (qui contient "Kiwi") pour lancer la macro, il faudrait obtenir les 7 lignes qui comportent le mot "Kiwi" dans une quelconque des colonnes 3,4 5 ou 6, et donc avoir les dates des 17, 20, 22, 23, 24 mai (deux fois) et 3 juin.
Mille mercis d'avance,
Bertrand
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Open Office 4.1.6 sur Debian 9.8
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Filtrer un tableau

Message par Dude »

Salut,

Avec zBasic, tu filtres en quelques lignes :
no_problemo.gif
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
bertrandRibon
NOOuvel adepte
NOOuvel adepte
Messages : 10
Inscription : 01 juin 2019 19:29

Re: [Calc] Filtrer un tableau

Message par bertrandRibon »

Bonjour,
Merci, c'est tout à fait cela...
Il ne me reste plus qu'à mettre une variable à la place de "Kiwi" dans le programme et affecter la valeur de la cellule dans laquelle je me trouve à cette variable lors du lancement du programme.
Pas trop le temps dans la semaine, je me mettrai dessus ce WE...
Merci pour tout
Bertrand
Open Office 4.1.6 sur Debian 9.8
bertrandRibon
NOOuvel adepte
NOOuvel adepte
Messages : 10
Inscription : 01 juin 2019 19:29

Re: [Calc] Filtrer un tableau

Message par bertrandRibon »

Bonjour, à tous et notamment à Dude qui est à l'origine de l'essai que je viens de faire, mais vous avez peut être la réponse...
J'ai donc retranscrit le bout de code dans un univers de macro, après avoir chargé, et je pense, correctement installé l'extension zBasic, et quand je fais tourner la macro "Main", j'ai le message d'erreur suivant : "zBasic = zFiltre.Execute Aucun critère déclaré via zFiltre.colonne", et stop. Par contre, il va au bout du programme car la feuille "Résultat" se crée correctement, mais vide...
Voila, je n'ai pas trop d'idée, à part aller voir la syntaxe de la commande zFiltre, mais manifestement, ça marche tel quel chez Dude, alors je suis perplexe... ou j'ai mal retranscrit, mais je me suis crevé les yeux à vérifier...
Bref; je suis preneur de toute suggestion, d'avance, merci
Bertrand
PS : Je joins le fichier avec la macro qui devrait suivre...
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Open Office 4.1.6 sur Debian 9.8
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Filtrer un tableau

Message par Dude »

Déjà, tu fais gagner du temps à tout le monde en publiant en plus du document, la macro.
Cela nous évite d'avoir à télécharger systématiquement des documents inutilement.
bertrandRibon a écrit :j'ai le message d'erreur suivant : "zBasic = zFiltre.Execute Aucun critère déclaré via zFiltre.colonne",
Je ne vois nulle part, l'utilisation de zBasic dans la macro de ton document :

Code : Tout sélectionner

Sub FiltrerDblClick(oEv As Object)

oDoc = thisComponent
oFeuil = oDoc.sheets.getByName("Feuille1")
MaZone = oFeuil.getCellRangeByName("A1:J100")

Dim LeChampFiltre(0) As New com.sun.star.sheet.TableFilterField2

With LeChampFiltre(0)
	.Field = oEv.CellAddress.Column
	.Operator = com.sun.star.sheet.FilterOperator2.EQUAL
	.IsNumeric = False
	.StringValue = oEv.String
End With

MonFiltre = MaZone.createFilterDescriptor(true)

With MonFiltre
	.ContainsHeader = true
	.Orientation = com.sun.star.table.TableOrientation.COLUMNS
	.FilterFields2 = LeChampFiltre()
End With

MaZone.Filter(MonFiltre)

End Sub
Commence déjà par correctement exécuter l'exemple que je te donne. :roll:
bertrandRibon
NOOuvel adepte
NOOuvel adepte
Messages : 10
Inscription : 01 juin 2019 19:29

Re: [Calc] Filtrer un tableau

Message par bertrandRibon »

Bonsoir,
Désolé pour les perturbations, mais il faut que j'apprenne en même temps à utiliser ce site, les macros et debian (notamment pour les pièces jointes), cela fait un peu beaucoup à la fois (pour moi).
La macro que tu cites est un exemple proposé par la première personne à répondre à ma demande, je ne sais pas où elle est.
Ci-dessous la macro que j'ai retranscrite (je ne sais pas faire de jolis encadrements de couleur comme vous le faites, mais je crois avoir vu quelque part comment faire, j'irai le lire, promis), mais je ne suis pas sûr qu'elle soit attachée au fichier que j'ai envoyé.
Par contre, je suis sûr que c'est celle là que j'exécute, car elle crée bien une nouvelle feuille intitulé "Résultat", et quand je ne supprime pas cette feuille avant un nouvel essai, j'ai le message "Cette feuille existe déjà", avant le deuxième message "Aucun critère déclaré via zFiltre.Colonne".

Code : Tout sélectionner

Sub Main
GlobalScope.BasicLibraries.loadLibrary("zBasic")
Dim oFiltre as variant
oFiltre= zFiltre.Demarre("Feuille1", "A1:J183")
zFiltre.Parametre(oFiltre, "entete", "O")
zFiltre.Colonne(oFiltre, 3, "", 2, "N", "Kiwi")
zFiltre.Colonne(oFiltre, 4, "OR", 2, "N", "Kiwi")
zFiltre.Colonne(oFiltre, 5, "OR", 2, "N", "Kiwi")
zFiltre.Colonne(oFiltre, 6, "OR", 2, "N", "Kiwi")
zFeuille.Cree("Résultat")
zFiltre.Execute(oFiltre, "Résultat", "A1")
End Sub
Open Office 4.1.6 sur Debian 9.8
Avatar de l’utilisateur
Noonours
PassiOOnné
PassiOOnné
Messages : 501
Inscription : 11 mai 2013 00:11
Localisation : Aix en Provence

Re: [Calc] Filtrer un tableau

Message par Noonours »

Bonjour,
Je re-tente une proposition d'une macro sans l'utilisation de l'extension zBasic qui filtre sur les 4 colonnes C, D, E et F et copie le résultat sur une feuille nommée "Résultats" (cette dernière est créée si elle n'existe pas)

Code : Tout sélectionner

REM  *****  BASIC  *****

Sub FiltrerDblClick(oEv As Object)

oDoc = thisComponent
LesFeuil = oDoc.sheets
oFeuil = LesFeuil.getByName("Feuille1")
MaZone = oFeuil.getCellRangeByName("A1:J1000")

Dim LeChampFiltre(3) As New com.sun.star.sheet.TableFilterField2

With LeChampFiltre(0)
	.Field = 2 'colonne C
	.Operator = com.sun.star.sheet.FilterOperator2.EQUAL
	.IsNumeric = False
	.StringValue = oEv.String
End With

With LeChampFiltre(1)
	.Connection = com.sun.star.sheet.FilterConnection.OR
	.Field = 3 'colonne D
	.Operator = com.sun.star.sheet.FilterOperator2.EQUAL
	.IsNumeric = False
	.StringValue = oEv.String
End With

With LeChampFiltre(2)
	.Connection = com.sun.star.sheet.FilterConnection.OR
	.Field = 4 'colonne E
	.Operator = com.sun.star.sheet.FilterOperator2.EQUAL
	.IsNumeric = False
	.StringValue = oEv.String
End With

With LeChampFiltre(3)
	.Connection = com.sun.star.sheet.FilterConnection.OR
	.Field = 5 'colonne F
	.Operator = com.sun.star.sheet.FilterOperator2.EQUAL
	.IsNumeric = False
	.StringValue = oEv.String
End With

MonFiltre = MaZone.createFilterDescriptor(true)

If not LesFeuil.hasByName("Résultats") then	LesFeuil.insertNewByName("Résultats", oFeuil.RangeAddress.sheet +1)

With MonFiltre
	.CopyOutputData = True
	.OutputPosition = LesFeuil.getByName("Résultats").getCellRangeByName("A1").CellAddress
	.ContainsHeader = True
	.Orientation = com.sun.star.table.TableOrientation.COLUMNS
	.FilterFields2 = LeChampFiltre()
End With

MaZone.Filter(MonFiltre)

End Sub
Noonours procrastinateur perfectionniste: "Je fais rien, mais demain je l'ferai mieux"

Pour obtenir la réponse la plus précise possible, VEUILLEZ JOINDRE UN FICHIER

LibO 7.6.5.2 Stable et OpenOffice 4.1.15 sous Windows 10
bertrandRibon
NOOuvel adepte
NOOuvel adepte
Messages : 10
Inscription : 01 juin 2019 19:29

Re: [Calc] Filtrer un tableau

Message par bertrandRibon »

Booonjour !
Ca fonctionne ! Merci Noonours ! Pas bien compris pourquoi cela n'a pas fonctionné du premier coup, pourtant j'avais fait un copier-collé de la macro pour être sûr de ne rien oublier, mais la deuxième fois, cela a marché...
Du coup, je l'ai adapté à mon gros fichier,en changeant le numéro des colonnes et la taille de la feuille (ça, j'y arrive, mdr), ça fonctionne toujours...
Remarque N°1, logique : il faut supprimer la feuille "résultat" à chaque fois, car si le résultat suivant comporte moins de lignes, les lignes excédentaires du premier résultat subsistent...
Remarque N°2 : Serait-ce gênant (ou risqué) de ne pas faire une nouvelle feuille, mais d'afficher le résultat directement dans la feuille en cours, sachant qu'il faudra alors supprimer le filtre pour retrouver le fichier originel ?
Mais sinon, je l'ai testé sous toutes les coutures, ça fonctionne parfaitement... pas besoin de garde fous (encore que...), il n'y a que moi qui l'utilise, je suis censé savoir ce que je fais... le seul vrai danger est de faire un double-clic ailleurs que dans la zone considérée, ce qui n'est pas gênant si on fait une nouvelle feuille, d'où l'intérêt de la nouvelle feuille.
Merci mille fois de la persévérance, Noonours, c'est une bonne qualité
Merci à tous les lecteurs et contributeurs, je vois bien que ce que vous faites n'est pas facile, mais ça permet bien d'avancer...
Bertrand
Open Office 4.1.6 sur Debian 9.8
bertrandRibon
NOOuvel adepte
NOOuvel adepte
Messages : 10
Inscription : 01 juin 2019 19:29

Re: [Calc] Filtrer un tableau

Message par bertrandRibon »

Donc le problème est résolu.
Re Merci
Bertrand
Open Office 4.1.6 sur Debian 9.8