Outil complémentaire
Certains souhaiterons automatiser la procédure de filtrage lorsque les filtres seront multiples et régulièrement utilisés sur un tableau en permanente évolution ou sur de nombreux tableaux de même structure mais toujours différents. Le code qui suit permet cette automatisation en respectant quelques règles élémentaires.
Notez que ce document n'a pas vocation à décrire la procédure d'utilisation des macros. Ce qui suit est donc réservé aux plus avertis, mais la section macro du forum est là pour accueillir vos éventuelles questions sur le sujet. Merci d'en respecter les règles si vous vous y rendez pour poster.
L'utilisation du code qui suit requière le respect de quelques règles 1. Une feuille à filtrer nommée "LISTING" pour l'exemple. Si vous modifiez ce nom il faudra adapter dans le code la ligne décrite au point 4 de ce chapitre
2. Une feuille avec les critères de filtrage définis dans des zones nommées sur le principe du filtre spécial décrit plus haut
Dans le code qui suit le nombre de filtres est de trois. Il faudra adapter en modifiant dans le code la valeur de la ligne suivante :
- Code : Tout sélectionner AgrandirRéduire
nbFiltres = 3 'remplacez 3 par le nombre réel de filtres que vous utilisez
3. Pour chaque nouveau filtre, il faudra sélectionner la zone des critères puis la nommer en commençant par "Filtre1" puis en poursuivant par Filtre2, Filtre3 etc. La macro se chargera de créer pour chaque filtre une nouvelle feuille du même nom pour accueillir le résultat du filtrage.
4. La zone à filtrer se définit dans le code sur la ligne suivante en remplaçant A1:B30 par les bonnes références et le cas échéant "LISTING" par le nom de votre feuille:
- Code : Tout sélectionner AgrandirRéduire
zone_a_filtrer = lesFeuilles.getByName("LISTING").getCellRangeByName("A1:B30")'définir ici le nom de la feuille et les références de la zone à filtrer
Le code en question- Code : Tout sélectionner AgrandirRéduire
Option Explicit
Sub fitreSpecial()
Dim monDocument As Object, lesFeuilles As Object, maFeuille As Object
Dim zone_a_filtrer as object, ma_zone_criteres As Object, ma_zone_destination As Object
Dim monFiltre As Object
Dim nbFiltres As integer
Dim index As Integer, i As integer
monDocument = ThisComponent
lesFeuilles = monDocument.Sheets
nbFiltres = 3 'définir ici le nombre de filtres
For i = 1 To nbFiltres
index = lesFeuilles.Count
lesFeuilles.insertNewByName("Filtre" & index-1, index)'crée une nouvelle feuille
ma_zone_destination = lesFeuilles.getByName("Filtre" & index-1).getCellRangeByName("A1")'destination du filtrage
ma_zone_criteres = lesFeuilles.getByName("Critères").getCellRangeByName("Filtre" & index-1) 'lit les paramètres du filtre
zone_a_filtrer = lesFeuilles.getByName("LISTING").getCellRangeByName("A1:B30")'définr ici la zone à filtrer
monFiltre = ma_zone_criteres.createFilterDescriptorByObject(zone_a_filtrer)
With monFiltre
.CopyOutputData = True
.ContainsHeader = True
.Orientation = com.sun.star.table.TableOrientation.COLUMNS
.OutputPosition = ma_zone_destination.CellAddress
.SkipDuplicates = True ' True pour ne pas afficher les doublons False pour les afficher.
End With
zone_a_filtrer.filter(monFiltre)
Next i
End Sub
Pour commencer un nouveau traitement il ne faut conserver que les deux premières feuilles du classeur.
Ce code peut être amélioré pour conserver dans le classeur un historique des précédents filtrages sans être obligé de le vider à chaque fois. Je m'y attellerai lorsque j'aurai l'envie et le temps libre pour le faire si quelque ne s'en charge pas avant.
Documents annexes :La modération vous a écrit: Aucune question dans ce fil : veuillez utiliser la section Macro !