Bonjour,
Je cherche une macro Libre Office 6.2.5 pour modifier un filtre existant sur une plage de données.
Je voudrais ajouter (ou supprimer) un champ supplémentaire en conservant les champs existants.
J'ai essayé ce code mais il ne fonctionne pas :
En pas à pas, le nouveau descripteur semble correct mais le résultat n'est pas celui attendu.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93 Sub FiltrePourPesee ' Filtre les non pesés / Désactive le filtrage des non pesés. ' Dim oDescFiltreOld as Object Dim oDescFiltreNew as Object Dim oChampsFiltres3new(0) As New com.sun.star.sheet.TableFilterField3 Dim oValeursChampFiltre3(0) As New com.sun.star.sheet.FilterFieldValue Dim oFeuille as Object Dim oPlageDeDonnees as Object Dim oChampsFiltres3old as Object Dim sNomPlageDeDonnees as String Dim iQteChampsFiltres as Integer Dim iNumChampFiltre as Integer Dim bFiltreNonPesesActif as Boolean Dim idx as Integer 'index ' Définir la plage de données oFeuille = ThisComponent.getCurrentController.getActiveSheet() sNomPlageDeDonnees = "db_" & Replace(oFeuille.Name, "-", "_") oPlageDeDonnees = thiscomponent.DatabaseRanges.getByName(sNomPlageDeDonnees) ' Tester le filtre If oPlageDeDonnees.AutoFilter = FALSE then ' Pas de filtre automatique : mettre un filtre automatique sur la plage de données oDescFiltreNew = oPlageDeDonnees.referredCells.createFilterDescriptor(TRUE) 'descripteur vierge oDescFiltreNew.ContainsHeader = TRUE oDescFiltreNew.UseRegularExpressions = FALSE oPlageDeDonnees.AutoFilter = TRUE End If ' Descripteur actuel oDescFiltreOld = oPlageDeDonnees.referredCells.createFilterDescriptor(FALSE) 'descripteur actuel oChampsFiltres3old() = oDescFiltreOld.FilterFields3 iQteChampsFiltres = Ubound(oChampsFiltres3old) ' Nouveau descripteur oDescFiltreNew = oPlageDeDonnees.referredCells.createFilterDescriptor(TRUE) 'descripteur vierge With oDescFiltreNew .ContainsHeader = TRUE .UseRegularExpressions = FALSE End With ' Ajouter / Supprimer le filtrage des 'non pesés' sur la colonne « Tri » If iQteChampsFiltres = -1 then ' Aucun filtrage : définir le filtre 'non pesés' de la colonne « Tri » Redim Preserve oChampsFiltres3new(0) With oChampsFiltres3new(0) .Field = 10 .Operator = com.sun.star.sheet.FilterOperator.EQUAL With oValeursChampFiltre3(0) .IsNumeric = FALSE .NumericValue = 0 .StringValue = "º" End With .Values = oValeursChampFiltre3 End With oDescFiltreNew.FilterFields3 = oChampsFiltres3new() Else If iQteChampsFiltres = 0 And oChampsFiltres3old(0).Field = 10 then ' Si uniquement filtre 'non pesés' : utiliser le filtre vierge Else ' Si le filtre a plusieurs champs iNumChampFiltre = -1 For idx = 0 to iQteChampsFiltres If oChampsFiltres3old(idx).Field = 10 then ' Filtre non pesé actif bFiltreNonPesesActif = TRUE Else ' Ajouter les anciens champs à la nouvelle table de champs iNumChampFiltre = iNumChampFiltre + 1 Redim Preserve oChampsFiltres3new(iNumChampFiltre) oChampsFiltres3new(iNumChampFiltre) = oChampsFiltres3old(idx) End If Next idx If Not bFiltreNonPesesActif then ' Si le champ «Tri» n'est pas filtré iNumChampFiltre = iNumChampFiltre + 1 Redim Preserve oChampsFiltres3new(iNumChampFiltre) ' Ajouter un filtre 'Non pesés' sur la colonne « Tri » With oChampsFiltres3new(iNumChampFiltre) .Field = 10 'K : Tri .Operator = com.sun.star.sheet.FilterOperator.EQUAL With oValeursChampFiltre3(0) .IsNumeric = FALSE .NumericValue = 0 .StringValue = "º" End With .Values = oValeursChampFiltre3 End With End If oDescFiltreNew.FilterFields3 = oChampsFiltres3new() End If End If ' Filtrer oPlageDeDonnees.referredCells.filter(oDescFiltreNew) End Sub
Le fichier allégé : Pb activer desactiver filtre.ods
Lorsque je place manuellement un filtre sur une ou plusieurs colonnes, par exemple sur l'année et le club, je voudrais que la macro ci-dessus conserve ce filtre et ajoute un champ sur la colonne 'Tri'.
Inversement, lorsque la colonne 'Tri' est filtrée, je voudrais supprimer ce 'champfiltre' en conservant celui des autres colonnes.
EDIT : En fait, la macro fonctionne partiellement, elle ne fonctionne que lorsqu'il n'a qu'une seule valeur par champ filtre. Elle bugue si on filtre avec plusieurs valeurs dans la même colonne (par exemple plusieurs clubs)
Partager