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 :

Filtrage sur un tableau EXCEL par macro


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 71
    Points : 36
    Points
    36
    Par défaut
    Bonjour,

    Je me permets de solliciter votre aide sur le point suivant :

    Je dispose d'un tableau sur EXCEL : NOM (colonne 1) , PRENOM (colonne 2), DEPARTEMENT (colonne 3).

    Je souhaite réaliser un filtrage automatique sur ce tableau. Je souhaite filtrer sur la colonne NOM, récupérer tous les éléments présents en un seul exemplaire de la colonne PRENOM et les stocker dans un tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets ("TEST").Range("A1").AutoFilter field:=1, Criteria1:="DUPONT"
    Je ne sais pas comment faire pour récupérer chaque donnée unitaire de la colonne PRENOM sachant que NOM est filtré.

    L'idée est de pouvoir récupérer sur une feuille le résultat de plusieurs filtrages consécutifs.

    Initialement, j'ai un tableau de nom : "DUPONT", "DURANT","DUCHENE". Je souhaite obtenir sur une même feuille EXCEL, le résultat du filtrage avec "DUPONT", suivi de celui avec "DURANT", enfin suivi de celui avec "DUCHENE".

    Sur la feuille résultat, il y a en première ligne l'entête. Mais quand je lance la macro, je souhaite récupérer uniquement les lignes filtrées pour chaque cas, donc sans les en-têtes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
         Sheets("ORIGINE").Select
          Columns("1:4").Select
          Selection.AutoFilter
          ActiveSheet.Range("$A$1:$D$1500").AutoFilter Field:=1, Criteria1:=tab_nom(i), Operator:=xlAnd
          Range("A1").Select
     
          Set rngSelect = ActiveCell.CurrentRegion.SpecialCells(xlCellTypeVisible)
          rngSelect.Copy
     
          Sheets("FINAL").Select
          Cells.PasteSpecial xlPasteAll
    Je ne sais pas comment faire pour que le code tienne compte notamment du nombre d'éléments dans le tableau de nom et de la dernière ligne de la feuille résultat.

    Merci d'avance pour votre aide.

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Bonjour,
    Essaie ceci..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Filtrer()
    Dim Derlig As Long
    Dim LigCopie As Long
        With Sheets("ORIGINE")
            .Columns("A:D").AutoFilter
            Derlig = .Range("A65536").End(xlUp).Row
            LigCopie = Sheets("FINAL").Range("A65536").End(xlUp).Row + 1
            .Range("$A$1:$D$1").AutoFilter Field:=1, Criteria1:=tab_nom(i), Operator:=xlAnd
            .Range("A2:D" & Derlig).Copy Sheets("FINAL").Range("A" & LigCopie)
        End With
    End Sub
    Les lignes filtrées seront automatiquement ajoutées l'une en dessous de l'autre, c'est ça que tu recherche ?
    A+

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 71
    Points : 36
    Points
    36
    Par défaut
    Bonjour,

    Quand je teste avec un seul élément du tableau (i=0) le code fonctionne. Mais quand j'utilise une boucle pour i=0 à 2 de tab_nom, la macro ne fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Do while i<=2
     
        With Sheets("ORIGINE")
            .Columns("A:D").AutoFilter
            Derlig = .Range("A65536").End(xlUp).Row
            LigCopie = Sheets("FINAL").Range("A65536").End(xlUp).Row + 1
            .Range("$A$1:$D$1").AutoFilter Field:=1, Criteria1:=tab_nom(i), Operator:=xlAnd
            .Range("A2:D" & Derlig).Copy Sheets("FINAL").Range("A" & LigCopie)
        End With
     
    Loop
    Je souhaite savoir quelle est mon erreur.

    J'ai effectué le code suivant. Mais la macro ne fonctionne pas correctement.

    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
         Sheets("ORIGINE").Select
          Columns("A:D").Select
          Selection.AutoFilter
          ActiveSheet.Range("$A$1:$D$1500").AutoFilter Field:=1, Criteria1:=tab_nom(0), Operator:=xlAnd
          Range("A1").Select
     
          Set rngSelect = ActiveCell.CurrentRegion.SpecialCells(xlCellTypeVisible)
          rngSelect.Copy
     
          Sheets("FINAL").Select
          Cells.PasteSpecial xlPasteAll
     
     
          for i=1 to 2
     
                Sheets("ORIGINE").Select
                  ActiveSheet.Range("$A$1:$D$1500").AutoFilter Field:=1, Criteria1:=tab_nom(i), Operator:=xlAnd
     
                Derlig = Sheets("ORIGINE").Range("A65536").End(xlUp).Row
                LigCopie = Sheets("FINAL").Range("A65536").End(xlUp).Row + 1
                 sheets ("ORIGINE").select
                Range("A2:D" & Derlig).Copy Sheets("FINAL").Range("A" & LigCopie)
     
          Next i
    Je vous serai reconnaissante de bien vouloir m'aider.

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Je ne comprend pas bien ce que tu veux faire, ? Copier toutes les lignes ? auquel cas pas besoin de filtre, enfin, quoi qu'il en soit essaye ce code...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub Filtrer()
    Dim Derlig As Long, Lig as Long
    Dim LigCopie As Long
        With Sheets("ORIGINE")
        For Lig = 2 to 4 'pour pas avoir la ligne des titres
            .Columns("A:D").AutoFilter
            Derlig = .Range("A65536").End(xlUp).Row
            LigCopie = Sheets("FINAL").Range("A65536").End(xlUp).Row + 1
            .Range("$A$1:$D$1").AutoFilter Field:=1, Criteria1:= .Cells(Lig,1), Operator:=xlAnd
            .Range("A2:D" & Derlig).Copy Sheets("FINAL").Range("A" & LigCopie)
        Next Lig
        End With
    End Sub
    Et évite d'employer des Select à tout va.
    A+

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 71
    Points : 36
    Points
    36
    Par défaut Filtrages consécutifs par macro et récupération du résultat
    Bonjour,

    En prenant un autre cas :

    Sur la feuille "ORIGINE", je filtre sur DEPARTEMENT (colonne 3). Dans un premier temps, je choisi DEPARTEMENT="informatique", je fais un copier-coller sur la feuille "FINAL" des lignes filtrées.

    Ensuite, je choisi DEPARTEMENT="électronique", je fais un copier-coller sur la feuille "FINAL" des lignes filtrées à la suite du premier.

    Enfin, je choisi DEPARTEMENT="administration", je fais un copier-coller sur la feuille "FINAL" des lignes filtrées à la suite du second.


    Mon soucis apparaissait lors de l'exécution de la macro sur la feuille "FINAL".
    Je ne pouvais pas voir le résultat des 3 filtrages consécutifs et parfois l'entête était en plusieurs exemplaires.

    Par ailleurs, je n'ai bien compris la syntaxe suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    .Range("$A$1:$D$1").AutoFilter Field:=1, Criteria1:= .Cells(Lig,1), Operator:=xlAnd
    Cela signifie que le filtrage est activé sur la première colonne feuille "ORIGINE", mais je souhaite savoir que représente cells(3,1), cells(4,1), cells (5,1) - les 3 noms du tableau ?

    Merci pour votre aide.

  6. #6
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut
    Le fait que tu vois ton entête revenir plusieurs fois est du fait de cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rngSelect = ActiveCell.CurrentRegion.SpecialCells(xlCellTypeVisible)
    en effet ici tu demande a excel de sélectionner l'ensemble de tes cellules visibles, l'entete est visible que je sache

    Il faudrait verifier e nombre de ligne contenu dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveCell.CurrentRegion.SpecialCells(xlCellTypeVisible)
    , peut etre en utilisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveCell.CurrentRegion.SpecialCells(xlCellTypeVisible).Rows.Count
    si nbrLigne=1, on sort de la macro, le tableau ne contient que l'entete, aucun resultat au filtre.
    si nbrligne>1, il faut modifier la selection pour ne pas prendre l'entete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveCell.CurrentRegion.SpecialCells(xlCellTypeVisible).resize(ActiveCell.CurrentRegion.SpecialCells(xlCellTypeVisible).Rows.Count-1,ActiveCell.CurrentRegion.SpecialCells(xlCellTypeVisible).columns.Count).offset(1,0)
    Je n'ai pas testé mais ce doit être un truc comme ça en fait le resize reduit la taille de la slection d'une ligne (on perd les donnée de la derniere ligne visible du tableau) et l'Offset decale la selectiond'une ligne vers le bas, on recupere les données de la derniere ligne et on abandonne celles de la 1er (l'entete si tu suis toujours ^^).

    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    bonjour Qwazerty, que crois-tu que fait cette ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("A2:D" & Derlig).Copy Sheets("FINAL").Range("A" & LigCopie)
    cati : Comment veux-tu faire tes sélections ?
    Je propose, ne pas gérer le filtre par macro mais directement sur la feuille et un bouton qui te copierait le résultat du filtre sur l'autre feuille ?

  8. #8
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut
    Je comprend bien, je répondais juste a l'incompréhension de cati_78 vis à vis de son code et j'ai essayé de garder cette même philosophie
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

Discussions similaires

  1. [XL-2013] Suppression d' image sur feuille excel par macro
    Par GROBIN dans le forum Excel
    Réponses: 3
    Dernier message: 16/11/2013, 23h07
  2. [XL-2007] Filtrage multiple d'un tableau excel avec macro
    Par robby98800 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 29/05/2012, 09h39
  3. mise à jour automatique tableau excel par macro
    Par fredo49 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 22/04/2011, 11h37
  4. Désactiver le filtrage automatique en excel par macro
    Par guefrachi dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/01/2010, 12h38
  5. [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

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