IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Filtres multiples sur TCD [Toutes versions]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Filtres multiples sur TCD
    Bonjour,

    J'essaies de mettre en place une sélection de plusieurs champs filtrés sur mes TCD, mais seul le dernier filtre est pris en compte.
    Pourriez vous m'aider SVP.

    Merci.

    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
    Call filtreTCD("MARGES CAF SUR CLOTURES", "BonusMalus", "statut du chantier", "clôturé", "Bonus ou malus sur affaire clôturée", "", "chargé d'affaire")
     
     
     
    Sub filtreTCD(nomFeuilleTCD As String, nomTCD As String, nomChamps1 As String, filtre1 As String, nomChamps2 As String, filtre2 As String, cacheSsTotaux As String)     ' Mise en forme des TCD
     
    Dim i As Integer
    Dim x As String
     
    Dim plageDonnees As Range
    Dim nombreLigneDonnees As Long
    Dim nomFeuilleDonnees As String
    Dim j As Long
    Dim k As Long
     
    Sheets(nomFeuilleTCD).Activate
     
    If nomChamps1 <> "" Then
        ActiveSheet.PivotTables(nomTCD).PivotFields(nomChamps1).ClearAllFilters         ' Supprime tous les précédents filtres
        ActiveSheet.PivotTables(nomTCD).PivotFields(nomChamps1) _
            .EnableMultiplePageItems = True
            With ActiveSheet.PivotTables(nomTCD).PivotFields(nomChamps1)                ' Filtre selon le champs défini
            If filtre1 <> "" Then
                .PivotItems(filtre1).Visible = True                                     ' TCD Filtré sur les cellules "Encours"
            End If
            For j = 1 To .PivotItems.Count
            If .PivotItems(j).Value = "0" Or .PivotItems(j).Value = "(Vide)" Then
                .PivotItems(j).Visible = False                                          ' TCD Filtré sur les cellules à 0.00
            End If
            Next j
        End With
    End If
     
     
    If nomChamps2 <> "" Then
        'ActiveSheet.PivotTables(nomTCD).PivotFields(nomChamps2).ClearAllFilters        ' Supprime tous les précédents filtres
        ActiveSheet.PivotTables(nomTCD).PivotFields(nomChamps2) _
            .EnableMultiplePageItems = True
            With ActiveSheet.PivotTables(nomTCD).PivotFields(nomChamps2)                ' Filtre selon le champs défini
            If filtre2 <> "" Then
                .PivotItems(filtre2).Visible = True
            End If
            For k = 1 To .PivotItems.Count
            If .PivotItems(k).Value = "0" Or .PivotItems(k).Value = "(Vide)" Then
            .PivotItems(k).Visible = False                                              ' TCD Filtré sur les cellules à 0.00
            End If
            Next k
        End With
    End If
     
    If cacheSsTotaux <> "" Then
        ActiveSheet.PivotTables(nomTCD).PivotFields(cacheSsTotaux).ShowDetail = False   ' N'affiche que les sous-totaux
     
    End If
     
        nomFeuilleDonnees = "données traitées"
        Sheets("extraction").Select                                                     ' Compteur de lignes de données dans feuille extraction
        Range("A1").Select
     
        nombreLigneDonnees = Range("A1", Selection.End(xlDown)).Cells.Count             ' Compte le nombre de ligne ligne de la plage de données
     
        Sheets(nomFeuilleDonnees).Select                                                ' Compteur de lignes de données dans feuille extraction
        Range("A1").Select
     
        Set plageDonnees = Worksheets(nomFeuilleDonnees).Range(Cells(1, 1), Cells(nombreLigneDonnees, 65)) ' Selection de la plage source presente sur l'onglet "données traitées"
        Sheets(nomFeuilleTCD).Activate
     
     
        Sheets(nomFeuilleTCD).Select
                                                                                        ' Modification de la plage de données dynamiquement
        ActiveSheet.PivotTables(nomTCD).ChangePivotCache _
        ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=plageDonnees, Version:=xlPivotTableVersion14)
     
    End Sub

  2. #2
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 564
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 564
    Par défaut
    Bonjour

    ClearAllFilters rend tout visible donc après on masque ce que ne doit pas l'être.
    On ne devrait pas avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            If filtre1 <> "" Then
                .PivotItems(filtre1).Visible = True                                     ' TCD Filtré sur les cellules "Encours"
            End If
    mais seulement la boucle sur les items
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            For each Valeur in .PivotItems
            If Valeur<>Filtre1 then Valeur.Visible = False   
            Next

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour ta réponse.
    Tu as tout a fait raison.

    Cette fonction n'était pas si simple car elle modifie 9 TCD dans mon classeur, avec des champs et des critères différents.
    Alphabetique ou numerique.

    Mais cela m'a permis d'inverser ma sélection et cela a l air de fonctionner.

    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
    Sub filtreTCD(nomFeuilleTCD As String, nomTCD As String, nomChamps1 As String, filtre1 As String, nomChamps2 As String, filtre2 As String, cacheSsTotaux As String)     ' Mise en forme des TCD
     
    Dim i As Integer
    Dim x As String
     
    Dim plageDonnees As Range
    Dim nombreLigneDonnees As Long
    Dim nomFeuilleDonnees As String
    Dim valeur1 As Variant
    Dim valeur2 As Variant
    Dim j As Long
    Dim k As Long
     
    Sheets(nomFeuilleTCD).Activate
     
    If nomChamps1 <> "" Then
        ActiveSheet.PivotTables(nomTCD).PivotFields(nomChamps1).ClearAllFilters         ' Supprime tous les précédents filtres
        ActiveSheet.PivotTables(nomTCD).PivotFields(nomChamps1) _
            .EnableMultiplePageItems = True
            With ActiveSheet.PivotTables(nomTCD).PivotFields(nomChamps1)                ' Filtre selon le champs défini
     
            For Each valeur1 In .PivotItems
            If valeur1 = filtre1 Then valeur1.Visible = False
            Next
     
            For j = 1 To .PivotItems.Count
            If .PivotItems(j).Value = "0" Or .PivotItems(j).Value = "(Vide)" Then
                .PivotItems(j).Visible = False                                          ' TCD Filtré sur les cellules à 0.00
            End If
            Next j
        End With
    End If
     
     
    If nomChamps2 <> "" Then
        ActiveSheet.PivotTables(nomTCD).PivotFields(nomChamps2).ClearAllFilters         ' Supprime tous les précédents filtres
        ActiveSheet.PivotTables(nomTCD).PivotFields(nomChamps2) _
            .EnableMultiplePageItems = True
            With ActiveSheet.PivotTables(nomTCD).PivotFields(nomChamps2)                ' Filtre selon le champs défini
     
            For Each valeur2 In .PivotItems
            If valeur2 = filtre1 Then valeur2.Visible = False
            Next
     
            For k = 1 To .PivotItems.Count
            If .PivotItems(k).Value = "0" Or .PivotItems(k).Value = "(Vide)" Then
                .PivotItems(k).Visible = False                                          ' TCD Filtré sur les cellules à 0.00
            End If
            Next k
        End With
    End If

  4. #4
    Invité
    Invité(e)
    Par défaut
    Par contre, j'ai une petit soucis.

    si je change de fichier source qui vient alimenter mes TCD, le filtre ne prend pas en compte toutes les lignes, je suis obligé de relancer une 2eme fois la macro pour qu'elle soient toutes refiltrées

  5. #5
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 564
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 564
    Par défaut
    Bonjour

    Je ne comprends toujours pas ta logique : pourquoi filtrer 2 fois le même champ ?

    Ce que je proposais était de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        ActiveSheet.PivotTables(nomTCD).PivotFields(nomChamps1) _
            .EnableMultiplePageItems = True
            With ActiveSheet.PivotTables(nomTCD).PivotFields(nomChamps1)                ' Filtre selon le champs défini
            If filtre1 <> "" Then
                .PivotItems(filtre1).Visible = True                                     ' TCD Filtré sur les cellules "Encours"
            End If
            For j = 1 To .PivotItems.Count
            If .PivotItems(j).Value = "0" Or .PivotItems(j).Value = "(Vide)" Then
                .PivotItems(j).Visible = False                                          ' TCD Filtré sur les cellules à 0.00
            End If
            Next j
        End With
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    With ActiveSheet.PivotTables(nomTCD).PivotFields(nomChamps1)    
       .EnableMultiplePageItems = True
        For each Valeur in .PivotItems
            If Valeur<>Filtre1 then Valeur.Visible = False   
        Next
    End With
    Si toutes les nouvelles lignes de la sources sont bien prises en compte, si l'on veut considérer comme cochés les nouveaux entrants, il faut juste cocher dans les paramètres de chaque champ "Inclure les nouveaux éléments dans le filtre manuel".

  6. #6
    Invité
    Invité(e)
    Par défaut
    En fait, je ne veux pas qu'il affiche aussi les cellules vides.
    Mais il est vrai que si le champs est renseigné, alors les champs vides ne s'afficheront pas.
    Je fais la correction de suite.

    L'erreur survenue dans la 2eme phase était toute simple.
    Je demande à redimensionné dynamiquement ma plage de données, mais après le filtre (grosse erreur).
    C'est pour cela qu'il ne reprenait pas toutes les lignes de ma nouvelle plage.
    Je l'ai corrigé, cela est correct maintenant.

    Merci pour ton aide et tes explications.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Filtres multiples sur comboBox
    Par kanak09 dans le forum Ext JS / Sencha
    Réponses: 1
    Dernier message: 11/12/2012, 07h07
  2. [XL-2010] Filtre multiple sur Label TCD
    Par lafafmentvotre dans le forum Excel
    Réponses: 0
    Dernier message: 04/03/2011, 15h35
  3. filtre variable sur TCD
    Par FloFlosu dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 14/02/2011, 22h08
  4. [MySQL] Filtre multiple sur une colonne
    Par pasbonte dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 02/11/2009, 17h59
  5. [VxiR2] Filtres multiples sur un rapport
    Par papakill dans le forum Deski
    Réponses: 1
    Dernier message: 17/03/2009, 07h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo