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 :
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
En pas à pas, le nouveau descripteur semble correct mais le résultat n'est pas celui attendu.

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)