[Résolu][Calc] Ajout/suppr de filtre et conserver les autres

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
Avatar de l’utilisateur
Patrice33740
Fraîchement OOthentifié
Messages : 7
Inscription : 31 août 2018 17:00
Localisation : Arès - France

[Résolu][Calc] Ajout/suppr de filtre et conserver les autres

Message par Patrice33740 »

Bonjour,

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
En pas à pas, le nouveau descripteur semble correct mais le résultat n'est pas celui attendu.
Le fichier épuré :
Pb activer desactiver filtre.ods
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
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par micmac le 21 févr. 2020 11:00, modifié 2 fois.
Cordialement
Patrice

LibreOffice 7.2.6 sur W10 32bits et
LibreOffice 7.2.6 sur W10 64bits
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25175
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Filtre, Ajout/Suppr champ et conserver les autres

Message par Dude »

Salut,
Patrice33740 a écrit :En pas à pas, le nouveau descripteur semble correct mais le résultat n'est pas celui attendu.
Mme Irma est à la plage.
Mets nous en ligne deux copies écran avec l'effet incorrect / attendu.
Avatar de l’utilisateur
Patrice33740
Fraîchement OOthentifié
Messages : 7
Inscription : 31 août 2018 17:00
Localisation : Arès - France

Re: [Calc] Filtre, Ajout/Suppr champ et conserver les autres

Message par Patrice33740 »

Bonjour,
Dude a écrit :Mets nous en ligne deux copies écran avec l'effet incorrect / attendu.
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'.
Par exemple, un Autofiltre avec Année = 2012 et Club = Ambares ou Barsac :
pb filtre 1.jpg
J'obtiens uniquement Année = 2012 et Club = Ambares et Tri = ° :
pb filtre 2.jpg
Alors que j'attends Année = 2012 et Club = Ambares ou Barsac et Tri = ° :
pb filtre 3.jpg
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Cordialement
Patrice

LibreOffice 7.2.6 sur W10 32bits et
LibreOffice 7.2.6 sur W10 64bits
Avatar de l’utilisateur
Patrice33740
Fraîchement OOthentifié
Messages : 7
Inscription : 31 août 2018 17:00
Localisation : Arès - France

Re: [Calc] Filtre, Ajout/Suppr champ et conserver les autres

Message par Patrice33740 »

Up
Cordialement
Patrice

LibreOffice 7.2.6 sur W10 32bits et
LibreOffice 7.2.6 sur W10 64bits
Avatar de l’utilisateur
Patrice33740
Fraîchement OOthentifié
Messages : 7
Inscription : 31 août 2018 17:00
Localisation : Arès - France

Re: [Calc] Filtre, Ajout/Suppr champ et conserver les autres

Message par Patrice33740 »

Bonjour,

Enfin une solution grâce à jurassik pork (c'est pas un déterrage)

En conservant le même descripteur de filtre (FilterDescriptor) on peut modifier (ou ajouter / supprimer) des champs multicritéres (FilterFields3).
Dans ce cas, il est indispensable de rafraichir la plage de données (DatabaseRange.Refresh) après chaque modification.

La macro corrigée :

Code : Tout sélectionner

Sub FiltrePourPesee
' Filtre les non pesés / Désactive le filtrage des non pesés.
'
 Dim oChampsFiltres3new(0) As New com.sun.star.sheet.TableFilterField3        'champs filtres new
 Dim oValeursChampFiltre3(0) As New com.sun.star.sheet.FilterFieldValue        'valeur du champ filtre
 Dim oDescFiltreOld as Object            'descripteur de filtre actuel
 Dim oChampsFiltres3old as Object        'champs filtres old
 Dim oFeuille as Object                    'feuille                
 Dim oPlageDeDonnees as Object            'plage de données
 Dim sNomPlageDeDonnees as String        'nom de la plage de données
 Dim iQteChampsFiltres as Integer        'quantité de champs filtres
 Dim iNumChampFiltre as Integer            'numéro de champ filtre
 Dim bFiltreNonPesesActif as Boolean    'filtre non pesés actif
 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
        oDescFiltreOld = oPlageDeDonnees.referredCells.createFilterDescriptor(TRUE)    'descripteur vierge
        oDescFiltreOld.ContainsHeader = TRUE
        oDescFiltreOld.UseRegularExpressions = FALSE 
        oPlageDeDonnees.AutoFilter = TRUE
    End If
    ' Descripteur actuel
    oDescFiltreOld = oPlageDeDonnees.FilterDescriptor    
    oChampsFiltres3old() = oDescFiltreOld.FilterFields3
    iQteChampsFiltres = Ubound(oChampsFiltres3old)
    ' Effacer le filtre
    oDescFiltreOld.setFilterFields(array())
    oPlageDeDonnees.referredcells.Rows.Isvisible = True
    oPlageDeDonnees.refresh
    ' Nouveaux champs du filtre
    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
        ' Appliquer le filtre
           oDescFiltreOld.setFilterFields3(oChampsFiltres3new)
           oPlageDeDonnees.refresh          
    Else
        If iQteChampsFiltres = 0 And oChampsFiltres3old(0).Field = 10 then
             ' Si uniquement filtre 'non pesés' : utiliser le filtre effacé
        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 
            ' Appliquer le filtre
            oDescFiltreOld.setFilterFields3(oChampsFiltres3new)
            oPlageDeDonnees.refresh          
        End If
    End If  
 
End Sub
Et le fichier correspondant :
Pb activer desactiver filtre 1.ods
[/b]
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Cordialement
Patrice

LibreOffice 7.2.6 sur W10 32bits et
LibreOffice 7.2.6 sur W10 64bits