[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 !

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

Messagepar Patrice33740 » 17 Août 2019 16:35

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   AgrandirRéduire
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
(73.4 Kio) Téléchargé 29 fois


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
Dernière édition par micmac le 21 Fév 2020 12:00, édité 2 fois.
Cordialement
Patrice

LibreOffice 6.2.5 sur W10 32bits et
LibreOffice 6.2.5 sur W10 64bits
Avatar de l’utilisateur
Patrice33740
Fraîchement OOthentifié
 
Message(s) : 6
Inscrit le : 31 Août 2018 18:00
Localisation : Arès - France

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

Messagepar Dude » 18 Août 2019 10:40

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
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 21687
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1

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

Messagepar Patrice33740 » 18 Août 2019 11:34

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
Cordialement
Patrice

LibreOffice 6.2.5 sur W10 32bits et
LibreOffice 6.2.5 sur W10 64bits
Avatar de l’utilisateur
Patrice33740
Fraîchement OOthentifié
 
Message(s) : 6
Inscrit le : 31 Août 2018 18:00
Localisation : Arès - France

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

Messagepar Patrice33740 » 27 Août 2019 19:54

Up
Cordialement
Patrice

LibreOffice 6.2.5 sur W10 32bits et
LibreOffice 6.2.5 sur W10 64bits
Avatar de l’utilisateur
Patrice33740
Fraîchement OOthentifié
 
Message(s) : 6
Inscrit le : 31 Août 2018 18:00
Localisation : Arès - France

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

Messagepar Patrice33740 » 21 Fév 2020 11:50

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   AgrandirRéduire
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
(71.61 Kio) Téléchargé 12 fois
Cordialement
Patrice

LibreOffice 6.2.5 sur W10 32bits et
LibreOffice 6.2.5 sur W10 64bits
Avatar de l’utilisateur
Patrice33740
Fraîchement OOthentifié
 
Message(s) : 6
Inscrit le : 31 Août 2018 18:00
Localisation : Arès - France


Retour vers Macros et API

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 1 invité