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 :

Problème Filtre avancé avec VBA [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Problème Filtre avancé avec VBA
    Bonsoir,
    Dans un classeur Excel 2010 (avec une seule feuille), je parviens sans problème à utiliser un filtre avancé "à la main", mais dès que j'utilise VBA, avec les mêmes données le filtre n'extrait rien (avec l'option copier à un autre endroit). Je crois avoir tout essayé, indiqué les cellules en Range, créé des variables, rien n'y fait alors que les mêmes opérations y compris en enregistrement de macro fonctionnent très bien dans la feuille Excel et pas en VBA. Voici le code généré par l'enregistreur de macro qui a fonctionné lors de l'enregistrement, mais pas quand je l’exécute ensuite en VBA :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Range("Database").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range _
            ("Crit03"), CopyToRange:=Range("G17"), Unique:=False
    MERCI si vous pouvez me sortir de là, je deviens fou !!

  2. #2
    Membre éprouvé
    Homme Profil pro
    Programmeur analyste
    Inscrit en
    Février 2009
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Canada

    Informations professionnelles :
    Activité : Programmeur analyste
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2009
    Messages : 546
    Points : 1 116
    Points
    1 116
    Par défaut
    Bonjour,
    on ne peut pas avoir un Range comme Range("Database")
    Il faut un range de type Range("B9:C26")

    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("B9:C26").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("B13:B18"), CopyToRange:=Range("N9:O9"), Unique:=False

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 940
    Points : 28 938
    Points
    28 938
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Le code que tu as publié fonctionne parfaitement à condition que les plages nommées DataBase et Crit03 soient d'étendue au classeur ou dans si elles ont comme étendue la feuille où se trouve les plages que celles-ci soit active.
    Dans le cas contraire, une erreur 1004 sera provoquée.
    Si le scénario est ce dernier, il faut préciser le nom de la feuille où est étendue la plage comme ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("DataList1!Database").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range _
            ("dataList1!Crit03"), CopyToRange:=Range("G17"), Unique:=False
    Attention : Dans ce cas ci, l'exportation aura lieu plage G17 de la feuille active.
    Conclusion : Les zones des données, de critères et d'exportation doivent avoir une référence explicite. (Classeur, feuille et plage).

  4. #4
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Impossible filtre avancé en VBA XL2010
    Citation Envoyé par gnain Voir le message
    Bonjour,
    on ne peut pas avoir un Range comme Range("Database")
    Il faut un range de type Range("B9:C26")

    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("B9:C26").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("B13:B18"), CopyToRange:=Range("N9:O9"), Unique:=False
    Bonsoir,

    Merci de ta réponse rapide. Malheureusement ça ne marche toujours pas !!
    En direct dans le classeur (1 seule feuille !) je demande Filtrer Avancé, je fais un copier/coller des références de cellules comme tu le conseillais et je les colle dans mon code VBA, code que j'ai obtenu avec l'enregistrement de macros et je fais très attention à tout vérifier ! En 'direct' et même en enregistrement de macros, il trouve des heures dans ma base et il les colle en-dessous de mon entête de colonne (obtenue par copier/coller des entêtes de la base), donc ça marche. Mais quand je lance ma proc Sub, ça ne marche plus, il laisse l'entête de destination pour l'export mais il ne colle rien dessous, alors que CE SONT LES MEMES DONNEES ET LES MEMES ZONES !!

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("$A$1:$E$100").AdvancedFilter Action:=xlFilterCopy, _
    CriteriaRange:=Range("$H$1:$I$2"), CopyToRange:=Range("$G$17"), Unique:=False
    J'ai aussi essayé sans les $, OK en direct, ça ne marche pas en VBA !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("A1:E100").AdvancedFilter Action:=xlFilterCopy, _
    CriteriaRange:=Range("H1:I2"), CopyToRange:=Range("G17"), Unique:=False
    De même en utilisant les zones nommées dans le filtre généré automatiquement par XL :

    Database | Crit03 (pour le mois de mars qui devrait afficher 7:00) | G17
    OK en direct, Non en VBA
    J'ai joint une recopie d'écran avec le filtre avancé 'ouvert'.

    Comment se fesse ??

    Merci de passer du temps sur ce qui ne devrait pas être un problème.
    JPP
    Images attachées Images attachées  

  5. #5
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    =Philippe Tulliez;8198206]Bonjour,
    Le code que tu as publié fonctionne parfaitement à condition que les plages nommées DataBase et Crit03 soient d'étendue au classeur ou dans si elles ont comme étendue la feuille où se trouve les plages que celles-ci soit active.
    Dans le cas contraire, une erreur 1004 sera provoquée.
    Si le scénario est ce dernier, il faut préciser le nom de la feuille où est étendue la plage comme ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("DataList1!Database").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range _
            ("dataList1!Crit03"), CopyToRange:=Range("G17"), Unique:=False
    Attention : Dans ce cas ci, l'exportation aura lieu plage G17 de la feuille active.
    Conclusion : Les zones des données, de critères et d'exportation doivent avoir une référence explicite. (Classeur, feuille et plage).
    Bonsoir,

    Merci de ta réponse, mais ça ne marche toujours pas !!
    J'ai renommé mon classeur "Waly.xlsm" et la seule feuille "WalyHours".

    Voici mon code modifié selon tes instructions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Application.Workbooks("Waly.xlsm").Worksheets("WalyHours").Range("Database") _
        .AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=Application.Workbooks("Waly.xlsm").Worksheets("WalyHours").Range("Crit04"), _
        CopyToRange:=Application.Workbooks("Waly.xlsm").Worksheets("WalyHours").Range("G17"), _
        Unique:=False
    Malheureusement ça ne marche toujours pas !!
    En direct dans le classeur (1 seule feuille !) je demande Filtrer Avancé, je fais un copier/coller des références de cellules comme tu le conseillais et je les colle dans mon code VBA, code que j'ai obtenu avec l'enregistrement de macros et je fais très attention à tout vérifier ! En 'direct' et même en enregistrement de macros, il trouve des heures dans ma base et il les colle en-dessous de mon entête de colonne (obtenue par copier/coller des entêtes de la base), donc ça peut marcher.

    Mais quand je lance ma proc Sub, ça ne marche plus, il laisse l'entête de destination pour l'export mais il ne colle rien dessous, alors que CE SONT LES MEMES DONNEES ET LES MEMES ZONES !!

    et avec ce code ça ne marche pas mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Range("WalyHours!Database") _
        .AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=Range("WalyHours!Crit03"), _
        CopyToRange:=Range("G17"), _
        Unique:=False
    Merci encore de votre travail de bénédictin !! Bonne (courte je suppose !) nuit.

    JPP

    ReBonsoir,
    Dans ma recopie d'écran 'défectueuse' attaché à ma réponse à "gnain", tu peux voir le problème : G18 est vide !

    J'ai oublié de vous dire, je ne sais pas si c'est important, XL m'a créé le nom 'Extraire' dans la liste des noms. Je viens d'essayer la macro avec 'Extraire', ça ne marche pas mieux !

    Serait-ce un bug d'Excel 2010 ?

    Aurait-il fallu (je cherche !) que je 'charge' je ne sais pas si c'est le bon terme un 'Complément (? idem) d'Excel comme j'ai dû le faire dans une autre appli où j'ouvre des fichiers Word, j'y écrit depuis XL en VBA, etc... Est-ce une piste ?

    Merci encore

    Merci encore de votre travail de bénédictin !! Bonne (courte je suppose !) nuit.
    JPP

  6. #6
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut




    Bonjour, bonjour !

    Et en corrigeant la plage des critères dans le code ?‼




    _____________________________________________________________________________________________________
    Je suis Charlie - Je suis Bardo

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 940
    Points : 28 938
    Points
    28 938
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Ton problème vient de ton critère qui est une date. Date qui est interprétée différemment suivant que tu utilises le VBA ou la version manuelle.
    Le VBA interprète la date au format MM/JJ/AAAA.
    Modifie le critère comme ceci >=4/1/15.

    Pour pallier ce problème, je fais une concaténation de l'opérateur de comparaison et de la référence à la cellule où je place la date au format JJ/MM/AA
    A toi de voir ce qui te convient le mieux

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    comme renseigne tu ta page de critères?

  9. #9
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    Ton problème vient de ton critère qui est une date. Date qui est interprétée différemment suivant que tu utilises le VBA ou la version manuelle.
    Le VBA interprète la date au format MM/JJ/AAAA.
    Modifie le critère comme ceci >=4/1/15.

    Pour pallier ce problème, je fais une concaténation de l'opérateur de comparaison et de la référence à la cellule où je place la date au format JJ/MM/AA
    A toi de voir ce qui te convient le mieux
    Bonjour à cette heure-ci

    Merci beaucoup pour ce miracle de la compétence et du service réunis !!

    Enfin, ça marche ! J'ai corrigé mon code en inversant Mois et Jour (à l'américaine) dans mon Sub. Par contre comme dans ma feuille j'avais des cellules avec BDSOMME, etc... j'ai dû faire une deuxième zone de critères "à la française" sinon cette autre partie de la feuille n'affichait plus rien. C'est un peu lourd, j'avoue, mais les deux fonctionnent EN MEME TEMPS donc ça me va. Je pense que tu aurais sûrement trouvé une formule plus élégante et plus économe.

    Juste pour ma culture et pour que je progresse, si tu as le temps, je n'ai pas compris une partie de ta réponse et je pense que ça pourrait optimiser mon code :

    ""Modifie le critère comme ceci >=4/1/15.

    Pour pallier ce problème, je fais une concaténation de l'opérateur de comparaison et de la référence à la cellule où je place la date au format JJ/MM/AA


    Je ne vois pas comment utiliser ta citation en italique et souligné.

    Merci encore de tout coeur pour cette solution.

    JPP

  10. #10
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 940
    Points : 28 938
    Points
    28 938
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je ne vois pas comment utiliser ta citation en italique et souligné
    Ta zone de critères est I3:J4 et suivant ton illustration, ton critère est >=1/4/15 donc tu remplaces cette formule par =">=" & $J$6 et en J6, tu peux placer la date 1/4/2015 (format JJ/MM/AA).
    L'avantage de cette solution est multiple. Elle peut être utilisée indifféremment par VBA ou manuellement, l'encodage de la date servant au critère est plus simple à modifier et d'autre part cela fonctionne avec les formules de la catégorie Base de données telle que BDSOMME.
    J'espère que c'est plus clair.

  11. #11
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Pardon, je ne sais plus si je t'ai encore une fois remercié pour ton aide. J'ai maintenant compris ta formule ci-dessus (avec $J$6). Ca marche très bien en 'manuel', en VBA et avec BDSomme.

    Si je peux abuser, j'ai essayé de réduire mon code en évitant de faire 12 longues sub pour filtrer ma base selon les mois. J'ai déjà réduit en gardant le gros de la macro dans une sub qui me permet d’appeler les 12 autres où il n'y a plus que la date et la formule de filtrage (suis-je clair ?). Je pense qu'on doit pouvoir faire une seule Sub à laquelle on passerait le paramètre 1er jour du mois en cours par exemple. J'essaye de me plonger dans les exemples qui sont donnés pour l'appel d'une procédure avec passage d'argument ou paramètre (c'est différent ?), mais ça me paraît très obscur et je ne vois vraiment pas comment fonctionnent ces proc appelantes et appelées. Y a-t-il un bon tutoriel simple qque part à ta connaissance ? J'ai réussi à conserver une variable i entre les proc qui pourrait me servir de passage, mais comment ? Voila où j'en suis :
    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
    Option Explicit
    Dim i As Integer
     
    Sub FiltrerBase()
    Range("Database").Select
        ActiveWorkbook.Worksheets("WalyHours").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("WalyHours").Sort.SortFields.Add Key:=Range( _
            "A2:A100"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
            xlSortNormal
        With ActiveWorkbook.Worksheets("WalyHours").Sort
            .SetRange Range("Database")
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    '
        Selection.AutoFilter
        ActiveSheet.Range("Database").AutoFilter Field:=1, Criteria1:=Array("=") _
            , Operator:=xlFilterValues, Criteria2:=Array(1, i & "/1/2015") ' j'utilise ma variable i ici
    End Sub ' FiltrerBase
     
    Sub FiltrerBase03()
        i = Range("H10").Value' donc i = 3 ici
    'j'ai 01/03/2015 en H10 et ainsi de suite pour les autres mois
        FiltrerBase
    End Sub
     
    Sub FiltrerBase04()
        i = Range("I10").Value
        FiltrerBase
        End Sub
    etc... pour les autres mois

    Merci beaucoup si tu trouves du temps pour moi,
    JPP

  12. #12
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 940
    Points : 28 938
    Points
    28 938
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'essaye de me plonger dans les exemples qui sont donnés pour l'appel d'une procédure avec passage d'argument ou paramètre (c'est différent ?)
    Argument ou paramètre, c'est du pareil au même
    Y a-t-il un bon tutoriel simple qque part à ta connaissance ?
    Un tutoriel à lire Les fonctions personnelles dans Excel

  13. #13
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci encore et bon week-end à toi.

    Jean-Pierre PETITJEAN

  14. #14
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 940
    Points : 28 938
    Points
    28 938
    Billets dans le blog
    53
    Par défaut
    Bonjour Jean-Pierre,
    S'il s'agit d'écrire une procédure en vue d'effectuer un tri avec arguments, tu peux utiliser celle que j'ai proposée dans cette contribution Procédure de tri - Excel 2003-2010 ou t'en inspirer pour créer ta propre procédure.
    Exemple d'une procédure utilisant un argument dans la réponse à une discussion traitant d'un filtre avancé

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

Discussions similaires

  1. [XL-2007] Problème filtre avancé
    Par trane51 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 23/06/2011, 17h19
  2. problèmes de couleurs avec VBA
    Par flamel dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 05/11/2010, 21h53
  3. [AC-2003] Problème de dates avec VBA
    Par Ric500 dans le forum VBA Access
    Réponses: 5
    Dernier message: 13/09/2010, 17h39
  4. [Toutes versions] Filtre automatique avec vba
    Par sabzzz dans le forum Contribuez
    Réponses: 0
    Dernier message: 13/04/2010, 21h17

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