Macros

    From The Document Foundation Wiki
    < Macros‎ | Calc


    Comment filtrer une plage de cellules ?

    Nous disposons des données suivantes :

    copie d'écran classeur
    Les deux plages de données à filtrer


    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 Données ▸ Définir la plage (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 :

    1. documentation de l'API pour le service SheetFilterDescriptor
    2. documentation de l'API pour la structure TableFilterField