Macros
TDF LibreOffice Document Liberation Project Blogs communautaires Weblate Nextcloud Redmine Ask LibreOffice Donner
Comment filtrer une plage de cellules ?
Nous disposons des données suivantes :
Nous souhaitons filtrer la plage A1:F16 pour n'afficher parmi les noms commençant par la lettre t que ceux ayant une moyenne supérieure ou égale à 80.
Nous souhaitons par ailleurs filtrer la plage A19:B34 pour n'afficher que les lignes pour lesquelles l'âge est supérieur à 25.
Deux plages de base de données (respectivement Plage1 et Plage2 pour A1:F16 et A19:B34) ont été définies via ▸ (le programme ne vérifie pas l'existence de ces plages ; utiliser la méthode hasByName pour cela dans un cas réel).
Cet exemple a pour objet de montrer comment procéder par macro pour accéder à ces plages et les filtrer.
Principes :
- Accéder à une plage de base de données puis « remonter » à la plage de référence pour appliquer le filtre.
- Un filtre est un objet comprenant des paramètres généraux (la plage comporte-t-elle un en-tête, utilise-t-on les caractères génériques, le filtre se fait-il « sur place » ou vers une autre destination, etc.)[1] et un ensemble de paramètres par critères de filtre (champ, opérateur, valeur)[2].
- Paramétrer un filtre vide permet de supprimer tous les filtres éventuellement déjà posés. Le programme commence donc par cela pour chaque plage.
option explicit
'********************************************************************************
'This library is Copyright (C) 2012 Pierre-Yves Samyn, except otherwise indicated
'Purpose: Frame the selection or create an empty frame if no selection
' This program is free software: you can redistribute it and/or modify
' it under the terms of the GNU General Public License as published by
' the Free Software Foundation, either version 3 of the License, or
' (at your option) any later version.
' This program is distributed in the hope that it will be useful,
' but WITHOUT ANY WARRANTY; without even the implied warranty of
' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
' GNU General Public License for more details.
' You should have received a copy of the GNU General Public License
' along with this program. If not, see <http://www.gnu.org/licenses/>.
'********************************************************************************
sub FiltrerPlage()
dim LibODataRange as object, LibOFiltre as object
dim LibOChampFiltre1(1) As New com.sun.star.sheet.TableFilterField
dim LibOChampFiltre2(0) As New com.sun.star.sheet.TableFilterField
' Accès à une plage de données par son nom
LibODataRange = thiscomponent.DatabaseRanges.getByName("Plage1")
' Crée un descripteur de filtre vide sur la plage référencée
LibOFiltre = LibODataRange.referredCells.createFilterDescriptor(true)
with LibOFiltre 'Les paramètres généraux
.ContainsHeader = true 'La première ligne = en-tête de colonnes
' .CopyOutputData = true 'Copierait le résultat ailleurs
'Où voudrait-on le résultat
' .OutputPosition = LibOFeuilleDest.getCellRangeByName("A3").CellAddress
.UseRegularExpressions = true 'Utilise les expressions régulières
end with
'Ci-dessous les paramètres par colonne (ici deux colonnes de filtre)
' Paramètre un champ pour afficher les élèves
' dont le nom commence par la lettre t.
with LibOChampFiltre1(0)
.Field = 0 'Filtre la colonne A
.IsNumeric = false 'Utilise une chaîne et non un nombre.
.Operator = com.sun.star.sheet.FilterOperator.EQUAL
.StringValue = "t.*" 'Tout ce qui commence par t.
end with
' Paramètre un champ qui a une valeur Moyenne supérieure ou égale
' à 80 et qui réponde aux deux conditions.
with LibOChampFiltre1(1)
.Connection = com.sun.star.sheet.FilterConnection.AND
.Field = 5 'Filtre la colonne F
.IsNumeric = true 'Utilise un nombre
.Operator = com.sun.star.sheet.FilterOperator.GREATER_EQUAL
.NumericValue = 80 'Valeurs supérieures ou égales à 80
end with
LibOFiltre.setFilterFields(LibOChampFiltre1()) 'Passe les param. "colonnes" au filtre
LibODataRange.referredCells.filter(LibOFiltre) 'Applique le filtre
' Accès à une plage de données par son nom
LibODataRange = thiscomponent.DatabaseRanges.getByName("Plage2")
' Crée un descripteur de filtre vide sur la plage référencée
LibOFiltre = LibODataRange.referredCells.createFilterDescriptor(true)
with LibOFiltre 'Les paramètres généraux
.ContainsHeader = true 'La première ligne = en-tête de colonnes
.UseRegularExpressions = false 'N'utilise pas d'expressions régulières
end with
'Ci-dessous les paramètres par colonne (ici une seule colonne de filtre)
'Filtre les élèves plus âgés que 25 ans
with LibOChampFiltre2(0)
.Field = 1 'Filtre colonne B
.IsNumeric = true 'Utilise un nombre
.Operator = com.sun.star.sheet.FilterOperator.GREATER
.NumericValue = 25 'Valeurs supérieures à 25
end with
LibOFiltre.setFilterFields(LibOChampFiltre2()) 'Passe les param. "colonnes" au filtre
LibODataRange.referredCells.filter(LibOFiltre) 'Applique le filtre
end sub
Notes :
- ↑ documentation de l'API pour le service SheetFilterDescriptor
- ↑ documentation de l'API pour la structure TableFilterField