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 :

Récupérer valeur filtre automatique vba [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 213
    Points : 105
    Points
    105
    Par défaut Récupérer valeur filtre automatique vba
    Bonjour,

    j'aimerais récupérer les valeurs d'un filtre automatique en vba.

    j'y suis arrivé pour deux critères selectionnés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub nombreCritere()
        Debug.Print ActiveSheet.AutoFilter.Filters(1).Criteria1
        Debug.Print ActiveSheet.AutoFilter.Filters(1).Criteria2
    End Sub
    mais impossible de récupérer dès lors que j'ai plus de 2 filtres...

    une idée ?

    PS : si un modo passe par là qu'il mette mon post dans la section VBA...me suis trompé merci.

    Merci.
    Sai

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    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 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour,

    Si tu parles de filtres obtenus en cochant des cases de sélection, il semblerait que ce soit impossible. La meilleure réponse que j'aie obtenue (Rory Archibald) :

    It does appear impossible to
    return the filter values directly (they are stored in the XML of course)

    Regards,
    Rory
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 213
    Points : 105
    Points
    105
    Par défaut
    arf...j'étais persuadé qu'on pouvait...

    merci pour ton retour !

  4. #4
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    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 203
    Points : 14 354
    Points
    14 354
    Par défaut
    C'est absolument anormal qu'on ne puisse pas les récupérer par VBA alors qu'on peut les mettre par VBA, je suis bien d'accord.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 213
    Points : 105
    Points
    105
    Par défaut
    bon je crois avoir trouvé...c'est bizarre

    en gros lorsque le nombre de filtre coché est strictement supérieur à 2 on peut boucler sur la propriété Criteria1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Sub filterList()
      For Each n In ActiveSheet.AutoFilter.Filters(1).Criteria1
        Debug.Print n
      Next
    End Sub
    je viens de tester ça marche plutôt bien...si ça peut servir à quelqu'un

    Sai

  6. #6
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    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 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Exact, sauf pour les filtres sur les dates ou les heures.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Cf fonction filtretotal()



    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
     
    Function FiltreTotal()
       Application.Volatile
       feuille = Application.Caller.Parent.Name
       chaine = ""
       For c = 1 To Sheets(feuille).Range("_FilterDataBase").Columns.Count
         If FiltreActuelNo(c) <> "" Then
           If IsDate(Sheets(feuille).Range("_FilterDataBase").Cells(2, c)) Then
             chaine = chaine & Sheets(feuille).Range("_FilterDataBase").Cells(1, c) & FiltreActuelNo(c, "D") & " "
           Else
             chaine = chaine & Sheets(feuille).Range("_FilterDataBase").Cells(1, c).Value & FiltreActuelNo(c) & " "
           End If
         End If
       Next c
       If chaine = "" Then chaine = "Tout"
       FiltreTotal = chaine
    End Function
     
    Function FiltreActuelNo(col, Optional typeCol As String)
     feuille = Application.Caller.Parent.Name
     Application.Volatile
     If Sheets(feuille).FilterMode Then
        If Sheets(feuille).AutoFilter.Filters.Item(col).On Then
          temp = Sheets(feuille).AutoFilter.Filters.Item(col).Criteria1
          If Left(temp, 2) = ">=" Or Left(temp, 2) = "<=" Then
             o = Left(temp, 2): n = Mid(temp, 3)
          Else
             If Left(temp, 1) = "=" Or Left(temp, 1) = ">" Or Left(temp, 1) = "<" Then
               o = Left(temp, 1): n = Mid(temp, 2)
             Else
               n = temp
             End If
          End If
          If typeCol = "D" Then n = Format(n, "dd/mm/yy")
          temp = o & n
          '---
          If Sheets(feuille).AutoFilter.Filters.Item(col).Operator Then
              oper = IIf(Sheets(feuille).AutoFilter.Filters.Item(col).Operator = 1, " ET ", " OU ")
              On Error Resume Next
              Err = 0
              temp2 = Sheets(feuille).AutoFilter.Filters.Item(col).Criteria2
              If Err = 0 Then
                  If Left(temp2, 2) = ">=" Or Left(temp2, 2) = "<=" Then
                     o = Left(temp2, 2): n = Mid(temp2, 3)
                  Else
                    If Left(temp2, 1) = "=" Or Left(temp2, 1) = ">" Or Left(temp2, 1) = "<" _
                     Then o = Left(temp2, 1): n = Mid(temp2, 2)
                  End If
                  If typeCol = "D" Then n = Format(n, "dd/mm/yy")
                  temp2 = o & n
               Else
                  oper = ""
               End If
           End If
           FiltreActuelNo = temp & oper & temp2
        Else
          FiltreActuelNo = ""
        End If
      Else
          FiltreActuelNo = ""
      End If
    End Function
    JB
    Fichiers attachés Fichiers attachés
    Dernière modification par Pierre Fauconnier ; 01/02/2013 à 19h29.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Salut Jacques

    Tu pourrais détailler ta fonction personnalisée pour les membres du forum qui ne peuvent ou ne veulent récupérer des pièces jointes.

    Merci

    Philippe

  9. #9
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    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 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour Jacques,

    Quand tu as une colonne avec des dates et que les éléments du filtre sont sélectés avec des cases à cocher (filtre chronologique, à partir de XL2007), la ligne :

    temp = Sheets(feuille).AutoFilter.Filters.Item(col).Criteria1

    plante (erreur 1004). Quand tu exécutes la ligne :

    Set Var = ActiveSheet.AutoFilter.Filters.Item(1)

    et que tu regardes la variable dans la fenêtre des variables locales, en face de "Criteria1", tu vois "erreur définie par l'application ou par l'objet".
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  10. #10
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 696
    Points
    6 696
    Par défaut
    bonjour,

    Explication possible :

    Quand tu emploies des filtres à cocher chronologiques sous 2007-2010, tu passes systématiquement en Criteria2 tout seul (il n’y a pas de 1) lié à la valeur xlFilterValues de l’opérateur XlAutoFilterOperator (6 valeurs en 2003, 11 ensuite) renvoyé par la propriété Operator de l’objet Filter.

    Cette valeur exploite un array, ils ont dû bricoler ça pour conserver la compatibilité, donc officiellement que 2 possibilités, mais la deuxième pouvant être sous forme d’array, ça permet la panoplie de choix que tolère le système de coches.

    Donc via cette façon d’opérer, tu n’auras pas de Criteria1 et le code ne risque pas de le trouver ?

    cordialement,

    Didier
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

  11. #11
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    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 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour Ormonth,

    On n'a pas non plus accès à Criteria2.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  12. #12
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    J'ai pu adapter les choix multiples pour les chaînes (récupérées dans un tableau dans critère1)
    Logiquement, les dates multiples devraient être récupérées dans un tableau dans critère2 mais je n'y parviens pas



    JB
    Dernière modification par Pierre Fauconnier ; 01/02/2013 à 19h29.

  13. #13
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 696
    Points
    6 696
    Par défaut
    Bonjour,

    @ Daniel & Jacques, avec les filtres à cocher chronologiques par défaut, on passe direct en Criteria2 et je n'arrive pas non plus à y avoir accès.

    Je pense que ça vient du fait qu’ils ont construit une usine à gaz (super pratique par contre) à ce niveau.

    En effet le comportement de ces filtres est à la base conditionné par l’option Grouper les Dates dans le menu Filtre automatique du Groupe Afficher les options pour ce classeur, celle-ci étant activée par défaut.

    Si on la désactive, manuellement ou par code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveWindow.AutoFilterDateGrouping = False  ' desactive l'option grouper dates du filtre auto
    ...on a du coup une liste de coches de toutes les occurrences dates et si on fait un filtre, on obtient un comportement classique avec un Array sous Criteria1 du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ActiveSheet.Range("$A$1:$D$21").AutoFilter Field:=3, Criteria1:=Array("14/09/2004 14:12:16", "17/01/2013 11:26:45", _
    "19/12/2008 18:04:07", "24/07/2009 14:27:32"), Operator:=xlFilterValues
    qu’on peut exploiter, de façon normale, comme dans le code ci-dessous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Gogo()
    Dim elt As Variant
     
    For Each elt In ActiveSheet.AutoFilter.Filters.Item(3).Criteria1
        Debug.Print elt
    Next elt
    End Sub
    Par contre en mode par défaut, on obtient, avec l’enregistreur, un code plus bizarre, qui fonctionne bien si on le lance et nous donne donc la méthode à employer en construction si besoin, genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub EnregistreurDG()
     
    ActiveSheet.Range("$A$1:$D$21").AutoFilter Field:=3, Operator:=xlFilterValues, _
    Criteria2:=Array(2, "1/17/2013", 1, "5/24/2012", 5, "9/22/2011 15:6:12", 3, "12/19/2008 18:22:48", _
    0, "7/16/2007", 4, "9/14/2004 14:12:16")
     
    End Sub
    D’autant plus spécifique que si on le lance avec l’option de groupement de dates désactivées, ça marche sans souci et sans la réactiver (preuve qu’il reconnaît bien ses petits…)

    On peut constater que dans ce code :

    Les mois et les dates sont toujours inversés sans souci de cohérence puisque textuellement on aurait des dates du genre "5/24/2012", ce qui sous-entendrait un mois « 24 » dans l’année. On peut donc considérer que dans son traitement sous-jacent, il traite des chaînes de texte qu’il manipule selon les pays pour retrouver ses petits en dates au final.

    L’array obtenu associe un item de plus à chaque ensemble de dates, mais impossible d’avoir accès à sa structure car on ne peut avoir accès à la propriété Criteria2..

    En désespoir de cause, je suis allé voir dans le code XML de la feuille et on trouve ceci :

    <autoFilter ref="A1-D21"><filterColumn colId="2"><filters><dateGroupItem year="2013" month="1" day="17" dateTimeGrouping="day"/><dateGroupItem year="2012" month="5" dateTimeGrouping="month"/><dateGroupItem year="2011" month="9" day="22" hour="15" minute="6" second="12" dateTimeGrouping="second"/><dateGroupItem year="2008" month="12" day="19" hour="18" dateTimeGrouping="hour"/><dateGroupItem year="2007" dateTimeGrouping="year"/><dateGroupItem year="2004" month="9" day="14" hour="14" minute="12" dateTimeGrouping="minute"/></filters></filterColumn></autoFilter>

    Soit classé chrhonologiquement :

    <dateGroupItem year="2007" dateTimeGrouping="year"/>

    <dateGroupItem year="2012" month="5" dateTimeGrouping="month"/>

    <dateGroupItem year="2013" month="1" day="17" dateTimeGrouping="day"/>

    <dateGroupItem year="2008" month="12" day="19" hour="18" dateTimeGrouping="hour"/>

    <dateGroupItem year="2004" month="9" day="14" hour="14" minute="12" dateTimeGrouping="minute"/>

    <dateGroupItem year="2011" month="9" day="22" hour="15" minute="6" second="12" dateTimeGrouping="second"/>
    note : "A1-D21" = "A1:D21"

    En rapprochant les données de l’Array VBA à ça, on peut en déduire que les Items supplémentaires correspondent à ceci :

    0 ans
    1 mois
    2 jours
    3 heures
    4 minutes
    5 secondes

    Donc j’en suis, dans mon approche de solution, à penser qu’il faudra passer en VBA par le XML pour arriver à ses fins.
    Donc soit récupérer les infos par String dans le fichier texte, soit importer le fichier XML de la feuille et voir si on peut y récupérer les données qui s’y trouvent selon une forme ou une autre. Le plus simple sera surement la piste texte.

    J’en suis là, mais ayant d’autres marrons sur le feu et j’avance à mes moments perdus.

    mon fichier test de base est le suivant :
    Filtre auto Dates 2010DG-Dates macrosTest.xlsx

    ps: pour activer le test que j'ai fait, il suffit d'y coller la macro ci-dessus

    cordialement,

    Didier
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

  14. #14
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    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 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour Ormonth,

    ... et la boucle est bouclée :

    Citation:
    It does appear impossible to
    return the filter values directly (they are stored in the XML of course)

    Regards,
    Rory
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  15. #15
    Membre régulier

    Inscrit en
    Janvier 2011
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 28
    Points : 75
    Points
    75
    Par défaut
    Citation Envoyé par Invité Voir le message
    Bonjour,

    Cf fonction filtretotal()

    JB
    Ce code fonctionne mais ne marche pas systématiquement avec Excel 2010 car dans la fonction "FiltreActuelNo" Sheets(feuille).AutoFilter.Filters.Item(col).Criteria1 ou Sheets(feuille).AutoFilter.Filters.Item(col).Criteria2 peuvent être un tableau donc il faut commencer par les tester avec IsArray(FiltreCour.Filters.Item(col).Criteria1), dans le cas où Criteria1 ou Criteria2 est un tableau (mise à jour, on peut tester à la valeur de .Operator "Operator = xlFilterValues"), puis il faut boucler sur les critère pour appliquer la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
          If Left(temp, 2) = ">=" Or Left(temp, 2) = "<=" Then
             o = Left(temp, 2): n = Mid(temp, 3)
          Else
             If Left(temp, 1) = "=" Or Left(temp, 1) = ">" Or Left(temp, 1) = "<" Then
               o = Left(temp, 1): n = Mid(temp, 2)
             Else
               n = temp
             End If
          End If
          If typeCol = "D" Then n = Format(n, "dd/mm/yy")
          temp = o & n
    Je ne vous fournit pas la fonction révisée, car je n'ai fait qu'une adaptation rustique (je ne traite pas le cas des dates).
    En espérant que cela sera utile à quelqu'un.
    GM
    A bientôt
    Guy

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

Discussions similaires

  1. [XL-2010] Filtres automatique & vba
    Par iperkut dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/03/2010, 22h05
  2. Récupérer valeurs d´un UserForm VBA Excel
    Par andromedor dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/01/2010, 14h07
  3. Récupérer valeur filtré du DataGrid
    Par Australia dans le forum Flex
    Réponses: 8
    Dernier message: 06/01/2010, 15h07
  4. [XL-2003] Récupérer la valeur d'un filtre automatique
    Par Safra dans le forum Excel
    Réponses: 5
    Dernier message: 19/10/2009, 17h12
  5. Réponses: 4
    Dernier message: 06/08/2007, 10h54

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