Je cherche a modifier un Autofiltre 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 qui ne fonctionne que partiellement : il ne fonctionne pas lorsque qu'il y a plusieurs critères sur une même colonne :
Code : Tout sélectionner
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 épuré : Lorsque je place manuellement un filtre sur une ou plusieurs colonnes, par exemple sur l'année et certains clubs, je voudrais que la macro ci-dessus conserve ces critères 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.
Cordialement
Patrice