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 :

[VBA] Critère d'AutoFilter et Tableau dynamique [XL-2016]


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
    Analyse système
    Inscrit en
    Mars 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2017
    Messages : 5
    Par défaut [VBA] Critère d'AutoFilter et Tableau dynamique
    Bonjour à tous,

    Je cherche à utiliser les données d'un tableau dynamique comme critère dans AutoFilter. Le problème que j'ai est que, seule la première valeur de mon tableau est prise en compte.
    Pour résumer : Je commence par déclarer un tableau en début de process puis j'enregistre des données dans ce tableau. Ces données correspondent à des "codes" que je souhaite utiliser ensuite comme critères, lors d'un filtrage de données d'une autre feuille.

    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
    Sub test()
     
    Sheets("Feuil2").Select
     
    dl_code = Range("A1").End(xlDown).Row
     
    Dim tab_code()
    ReDim tab_code(dl_code - 2, 0)
    For i = 0 To dl_code - 2
        tab_code(i, 0) = Range("A" & i + 2)
    Next
     
    Sheets("Feuil1").Select
    ActiveSheet.Range("A1:Q" & [A65536].End(xlUp).Row).AutoFilter Field:=2, Criteria1:=tab_code(), Operator _
        :=xlFilterValues
     
    End Sub
    Lorsque j’exécute ce code, la macro fonctionne correctement mais seule la valeur déclarée en "tab_code(0, 0)" est utilisée. Comment faire pour que toutes les valeurs déclarées dans mon tableau soient prise en compte comme critère ?

    Merci d'avance
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    une proposition écrite à main levée

    ta propre proposition avait des mauvaises habitudes (sélections de feuilles, boucle inutile) et le fait de travailler en Base 0 est dangereux quand ensuite on travaille sur des feuilles de calcul

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test()
    'Dim tab_code()
    'tab_code = Application.Transpose(Sheets("Feuil2").UsedRange.Value)
                                               ' tab_code
    Sheets("Feuil1").Range("A1").AutoFilter 2, Application.Transpose(Sheets("Feuil2").UsedRange.Columns(1).Value), xlFilterValues
                    ' inutile de citer toute la plage
                    ' on indique la première cellule A1 uniquement
    End Sub
    Attention à bien Reset ton filtre entre deux utilisation (un .Autofilter sans critère suffit)

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Mars 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2017
    Messages : 5
    Par défaut
    Bonjour Joe et merci pour ta réponse

    Ton code fonctionne et le résultat attendu est bien là ! Je vais faire quelques recherches pour essayer de comprendre ta démarche. Peux-tu juste m'expliquer à quoi correspond le "Base 0" s'il te plait ? Comme tu l'auras remarqué, je débute en VBA et en programmation tout court...

    Merci encore.

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    De façon native, un Tableau (array) commence à l'indice 0
    La "Base" est donc 0

    Quand on va travailler sur le tableau, dans des boucles, en corrélation avec Excel ou toute source qui commence à 1 (ligne, colonne etc...), on doit toujours trifouiller les indices des variables pour faire coïncider 0 (premier élément du array) et 1 (premier élément tiers) ... pas franchement pratique et lisible dans le code.

    Donc, on peut forcer le début d'un tableau sur l'indice 1 de deux manières différentes :

    - en haut du module, on déclare
    Et tout array déclaré dans ce module commencera à l'indice 1

    - quand on dimensionne le tableau manuellement, on spécifie clairement la plage de début à 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim MonTableau(1 to 40)
    Et seulement ce tableau sera affecté par la Base 1


    A noter également que quand on récupère une plage de données pour la mettre dans un Array, il sera par défaut en Base 1 (et ce sera accessoirement un tableau à deux dimensions).
    C'est ce que je fais dans ma proposition, j'aspire la colonne A de Feuil2 et on obtient un tableau 2D de X lignes sur 1 colonne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim MonTableau()
    MonTableau = Feuil1.UsedRange.Value
    MsgBox Ubound(MonTableau,1)  ' donnera 1 car c'est l'indice du premier élément

    En tant que tel, ce n'était pas ton problème.
    Le problème exact, c'est que ton tableau était "à l'envers", donc quand tu l'utilisais comme critère de filtre, VBA transmet à excel le premier élément uniquement de ton tableau 1D ... d'où la résolution appliquée dans ma proposition : j'ai transposé le tableau pour inverser les dimensions

    Si on reprend ton code intial, en transposant simplement ton tableau final, on doit obtenir le même résultat, je te laisse tester et constater

    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
    Sub test()
    
    Sheets("Feuil2").Select
    
    dl_code = Range("A1").End(xlDown).Row
    
    Dim tab_code()
    ReDim tab_code(dl_code - 2, 0)
    For i = 0 To dl_code - 2
        tab_code(i, 0) = Range("A" & i + 2)
    Next
    
    Sheets("Feuil1").Select
    ActiveSheet.Range("A1:Q" & [A65536].End(xlUp).Row).AutoFilter Field:=2, Criteria1:=Application.Transpose(tab_code), Operator _
        :=xlFilterValues
    
    End Sub

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Mars 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2017
    Messages : 5
    Par défaut
    Bonjour Joe,

    Un grand merci pour ces explications détaillées qui m'ont permis de comprendre mes erreurs mais aussi l'utilisation de "UsedRange" et "Transpose", notions que je ne connaissais pas du tout !
    En effet si je reprend mon code initial en inversant les dimensions du tableau le résultat est correct, mais je vais plutôt essayer de simplifier un maximum comme tu le fais pour alléger le code final.

    A bientôt et merci !

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

Discussions similaires

  1. [VBA-E]Ligne calculée en fin de tableau dynamique
    Par AliochaBada dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 07/10/2006, 22h23
  2. [VBA Excel] Un tableau dynamique dans un type utilisateur?
    Par cyber_N dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 23/07/2006, 19h51
  3. [VBA-E] tableau dynamique
    Par bricereyem dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 09/06/2006, 17h57
  4. [VBA-E]actualisation d'un tableau dynamique par macro
    Par illight dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 18/04/2006, 16h37
  5. [VBA-E]Afficher tout dans un tableau dynamique croisé
    Par alex_95 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/03/2006, 13h09

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