Macros

From The Document Foundation Wiki
< Macros‎ | Calc
Jump to: navigation, search

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