Macros

From The Document Foundation Wiki
< Macros‎ | Calc
Jump to navigation Jump to 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