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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du 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
    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 émérite
    Homme Profil pro
    Programmeur analyste
    Inscrit en
    Février 2009
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Canada

    Informations professionnelles :
    Activité : Programmeur analyste
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2009
    Messages : 546
    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
    13 168
    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 : 13 168
    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).
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Nouveau membre du 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
    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

  5. #5
    Expert éminent
    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
    Par défaut




    Bonjour, bonjour !

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




    _____________________________________________________________________________________________________
    Je suis Charlie - Je suis Bardo

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

  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
    13 168
    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 : 13 168
    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
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  8. #8
    Nouveau membre du 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
    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

  9. #9
    Nouveau membre du 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
    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  

+ 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