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 :

Ajouter un filtre dans un TCD [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Par défaut Ajouter un filtre dans un TCD
    Bonjour,

    Je crée un tableau croisé dynamique par macros.
    J'ai ajouté une macro à la suite qui crée un filtre sur les valeurs de la 3ème colonne du TCD.

    Ça donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Sheets("TCD").Select
        Selection.AutoFilter , Field:=3, Criteria1:=">=100", Operator:=xlAnd
    Lorsque je regarde le résultat du filtre après l'exécution de la macro :
    - le filtre existe dans mon TCD
    - le filtre numérique est correctement sélectionné : supérieur ou égal à 100

    Mais les valeurs affichées dans la colonne en question ne correspondent pas du tout...

    Il y a de tout, des valeurs plus petites, plus grandes...
    un filtre a bien été fait car des lignes ont disparu, mais sans queue ni tête...

    Lorsque j'efface manuellement ce filtre, et que je le recrée à l'identique encore manuellement, ça marche nickel !

    Quelqu'un aurait une idée svp ?

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Utilise l'enregistreur de macros, poste le code généré et indique ta version d'Excel.

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Par défaut
    Ma version est Excel 2010

    J'avais utilisé l'enregistreur de macro, et je m'en suis légèrement écarté, vu qu'elle ne marchait pas du tout pour le coup. ("La méthode AutoFilter de la classe Range a échoué")

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub filtrage_colonne()
    '
    ' filtrage_colonne Macro
    '
        Columns("C:C").Select
        Selection.AutoFilter
        ActiveSheet.Range("$C$3:$C$1435").AutoFilter Field:=1, Criteria1:=">=100", _
            Operator:=xlAnd
    End Sub

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    J'ai du mal à comprendre; tu filtres sur un champ ou sur un item ? Qu'est-ce qu'il y a en C3 ?

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Par défaut
    C3 : c'est la première cellule appartenant au TCD dans la colonne C.

    C'est dans cette cellule que se crée le filtre (que ce soit manuellement ou par la macro)

    Mon but est de n'afficher que les lignes du TCD dont la valeur située dans la colonne C matche mon filtre.

    Voici un morceau du TCD avant que le filtre ne soit créé.
    Images attachées Images attachées  

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Ça serait sympa d'avoir un petit fichier de test (sans données confidentielles).

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Par défaut
    Arffff...
    Malheureusement c'est bourré d'info confidentielles.

    Or le TCD garde toutes les infos du tableau de base, donc impossible de le rendre non confidentiel.

    Et j'ai essayé en ne copiant que les valeurs de mon TCD dans un nouveau classeur : ça marche très bien avec une macro. Le problème vient donc clairement de l'interaction d'un filtre avec le TCD (mais seulement en génération automatique... bizarre...)

    Pour essayer de donner une meilleure idée de ce qui se passe, je joins une nouvelle copie d'écran :

    (Remarquez le tooltip qui précise bien que les éléments de la colonne C sont supérieurs ou égaux à 100 )
    Images attachées Images attachées  

  8. #8
    Membre Expert Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Par défaut
    Sinon tu boucles sur les lignes et tu les caches si elles ne remplissent pas ta condition...
    (J'avoue que je n'ai jamais réussi à faire marcher correctement AutoFilter par macro, et ce n'est pas faute d'avoir essayé suite à certaines questions de membres sur ce forum.)

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 75
    Par défaut
    Citation Envoyé par Live83 Voir le message
    Ma version est Excel 2010

    ... ActiveSheet.Range("$C$3:$C$1435").AutoFilter Field:=1, Criteria1:=">=100",Operator:=xlAnd


    End Sub[/code]
    Bonjour,

    Il me semble que s'il y a ,Operator:=xlAnd il devrait y avoir derrière un second critère...Criteria2:= xxxx sinon, il faut supprimer ,Operator:=xlAnd

    Cordialement

  10. #10
    Membre averti
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Par défaut
    Citation Envoyé par ZebreLoup Voir le message
    Sinon tu boucles sur les lignes et tu les caches si elles ne remplissent pas ta condition...
    (J'avoue que je n'ai jamais réussi à faire marcher correctement AutoFilter par macro, et ce n'est pas faute d'avoir essayé suite à certaines questions de membres sur ce forum.)
    Bonjour,

    J'ai suivi ton conseil : ça marche nickel !

    C'est un peu long au niveau du traitement...
    Et j'ai du me creuser la tête car je suis novice en VBA et je trouve ça assez peu intuitif voire par moments un peu torturé !
    Etre obligé de sélectionner une cellule pour pouvoir sélectionner une ligne... à moins qu'on puisse faire plus simple ?
    Mais ça marche, ça fait ce que je veux, et c'est bien là le plus important.

    Merci pour votre temps et vos réponses !

    A toutes fins utiles :
    (J'ai aussi créé une macro pour faire la manipulation inverse)

    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
     
    Sub Cacher_lignes()
     
    Dim i As Integer
    i = 4
     
    While (Range("B" & i) <> "")
        If (Range("C" & i).Value <= Range("E2").Value) Then
            Range("B" & i).Activate
            Rows(ActiveCell.Row & ":" & ActiveCell.Row).Hidden = True
        End If
        i = i + 1
    Wend
     
    End Sub
     
    '******************
     
    Sub Montrer_lignes()
     
    Dim i As Integer
    i = 4
     
    While (Range("B" & i) <> "")
             Range("B" & i).Activate
            Rows(ActiveCell.Row & ":" & ActiveCell.Row).Hidden = False
            i = i + 1
    Wend
     
    End Sub

  11. #11
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Evite au maximum de sélectionner, tu perds en performance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Montrer_lignes()
     
    Dim i As Integer
    i = 4
     
    While (Range("B" & i) <> "")
             Rows(i).Hidden = False
            i = i + 1
    Wend
     
    End Sub

  12. #12
    Membre averti
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Par défaut
    Ah voilà... je vais essayer ça.
    Ca simplifie déjà visuellement et je veux bien croire que ne pas sélectionner fait gagner du temps !

    Merci

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 75
    Par défaut
    Avec ta version initiale, as-tu essayé de supprimer la fin de l'instruction comme indiqué au message #9 et regardé si cela fonctionne mieux?

    Cordialement

  14. #14
    Membre averti
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Par défaut
    Oui, pardon j'ai oublié de répondre.
    Ça ne change rien...

  15. #15
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Ou bien, pour éviter une boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub Montrer_lignes()
     
    Range([B4], [B4].End(xlDown)).EntireRow.Hidden = True
     
    End Sub

  16. #16
    Membre averti
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Par défaut
    Oui, en effet c'est beeeeaaaauuuucoup plus rapide !
    (en changeant le True en False )

  17. #17
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Pour masquer les lignes, tu peux utiliser :

    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
    Sub Cacher_lignes()
     
    Dim c As Range, Plage As Range
    Application.ScreenUpdating = False
    For Each c In Range([B4], [B4].End(xlDown))
        If c.Value <= Range("E2").Value Then
            If Plage Is Nothing Then
                Set Plage = c
            Else
                Set Plage = Union(Plage, c)
            End If
            Plage.EntireRow.Hidden = True
        End If
    Next c
    Application.ScreenUpdating = True
    End Sub

  18. #18
    Membre averti
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Par défaut
    Bonjour,

    Je n'ai pas eu le temps d'essayer la dernière proposition.
    Mais ce que j'ai mis auparavant fonctionne très bien !

    Je mets le topic en résolu.

    Merci

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

Discussions similaires

  1. Ajout "addfield Rawfield" dans un TCD ?
    Par chrystobale dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2009, 23h34
  2. [E-03] Ajouter des colonnes dans un TCD
    Par zaza45 dans le forum Excel
    Réponses: 1
    Dernier message: 22/09/2008, 14h27
  3. Peut-on ajouter une formule dans un TCD
    Par gdolfin95 dans le forum Excel
    Réponses: 2
    Dernier message: 19/06/2008, 14h23
  4. filtre dans un TCD
    Par k-eisti dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/07/2007, 21h43
  5. Ajouter un filtre dans le navigateur
    Par meufeu dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 16/02/2007, 15h49

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