[Calc] Filtre, Ajout/Suppr champ 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 !

[Calc] Filtre, Ajout/Suppr champ 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é 18 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
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) : 5
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) : 21253
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) : 5
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) : 5
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 8 invité(s)