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 :

Filtre élaboré et ligne des entêtes


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    décembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations forums :
    Inscription : décembre 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Filtre élaboré et ligne des entêtes
    Bonjour
    Quand on applique un filtre élaboré à une BD avec copie dans une autre feuille la ligne des entêtes est aussi recopiée. Existe-t-il une instruction pour l'empêcher?
    Merci de votre aide.

  2. #2
    Membre expert Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    décembre 2013
    Messages
    1 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : décembre 2013
    Messages : 1 944
    Points : 3 299
    Points
    3 299
    Par défaut
    bonjour
    peut tu montrer le code qui fait cette manipulation à savoir filtrer et copier ?
    -----------------------------------------------*****-------------------------------------------------------------------------------------------
    you don't have to be muslim to support the Palestinian people you just have to be human
    Vous ne devez pas être musulman pour soutenir le peuple palestinien, vous devez juste être humain

  3. #3
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    février 2010
    Messages
    6 509
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : février 2010
    Messages : 6 509
    Points : 12 150
    Points
    12 150
    Par défaut
    Bonjour

    Le filtre élaboré ne copie les en-têtes que si tu n'as pas préparé la zone cible

    Si tu prépares des en-têtes, seules les colonnes correspondantes sont extraites et non toutes les colonnes

    Par construction le filtre élaboré a besoin des en-têtes. C'est une fonctionnalité de manipulation de tables et, comme dans une BD, les titres correspondent aux noms des champs de la table et sont donc indispensables

    Sur 2016 plutôt qu'un filtre élaboré en VBA on utilise PowerQuery...
    Chris

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  4. #4
    Membre chevronné
    Homme Profil pro
    Inscrit en
    septembre 2013
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : septembre 2013
    Messages : 1 298
    Points : 2 177
    Points
    2 177
    Par défaut
    Bonjour,

    Il me semble curieux d'enlever les entêtes.

    Exemple qui efface les entêtes après extraction.
    Sur l'exemple c'est Rows(5).ClearContents qui efface les entêtes.

    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
    Private Sub Worksheet_selectionChange(ByVal Target As Range)
      If Target.Address = "$A$2" Then
        Set d = CreateObject("scripting.dictionary")
        temp = [Tableau1[Beneficiaire]]
        For Each c In temp
          d(c) = ""
        Next c
        If d.Count > 0 Then
          temp = Join(d.keys, ",")
          Target.Validation.Delete
          If temp <> "" Then Target.Validation.Add xlValidateList, Formula1:=temp
        End If
      End If
    End Sub
     
    Private Sub Worksheet_Change(ByVal Target As Range)
      If Target.Address = "$A$2" Then
        Sheets("Factures").[A1:H1000].AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=[A1:A2], CopyToRange:=[A5]
        Application.EnableEvents = False
        Rows(5).ClearContents
        Application.EnableEvents = True
      End If
    End Sub

    Nom : Sans titre.png
Affichages : 66
Taille : 15,8 Ko


    Boisgontier
    Fichiers attachés Fichiers attachés

  5. #5
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    14 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 14 966
    Points : 41 322
    Points
    41 322
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par 78chris Voir le message
    [...]
    Sur 2016 plutôt qu'un filtre élaboré en VBA on utilise PowerQuery...
    Il faudra encore beaucoup taper sur le clou, je pense. C'est tout de même vachement plus simple que les codes proposés à coup de dictionnaire, d'événements et autres, sans déclarations de variables et avec des codes datant au moins de 2003, sans parler de la notation à crochets, qui plus est avec une limite fantaisiste de la plage alors que les tableaux structurés sont présents depuis 12 ans (Je ne compte pas les "listes de données" présentes dès 2003). Je ne comprends pas comment on en est encore là en 2020 ^^
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    décembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations forums :
    Inscription : décembre 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour et merci à tous
    pour 78Chris
    J'avais bien préparé la feuille cible peut-être même trop notamment j'y avais prévu des sous-totaux et tout a été écrasé par la copie. Et de plus j'y avais placé les entêtes mais la copie les a répétées sue la ligne cible

    pour boisgontierjacques
    Comme tu le vois les entêtes se trouvaient déjà dans la feuille cible et je voulais éviter la répétition en les éliminant avant copie surtout que je voulais répéter plusieurs fois le filtrage

    pour Pierre Fauconnier
    Je ne connais rien du PQ mais tu m'as donné envie de commencer et pour cela j'essaye de refaire ton exemple.
    Mais dès le début en ajoutant une colonne avec la condition identique à la tienne=[@PAYS]="AU" je reçois le message d'erreur suivant : la syntaxe de ce nom est incorrecte et ce qui est dans les crochets est mis en surbrillance. Une colonne PAYS existe bien dans ma BD et AU comme valeur d'une cellule de cette colonne. Peux-tu me dire où est mon erreur? Et peux-tu me conseiller de la lecture sur PQ?

    Merci de votre aide passée, présente et future

  7. #7
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    14 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 14 966
    Points : 41 322
    Points
    41 322
    Billets dans le blog
    62
    Par défaut
    Lorsque je parle de la notation à crochets, je ne parle pas de références structurées, mais d'un code tel que [a1:a1000].End(xlUp). Cette syntaxe "d'initié" ( ) ne sert à rien, à part embrouiller, se priver de l'autocomplétion, demander plus de travail au compilateur (liaison tardive) et être source d'erreurs non détectables à la compilation, comme je l'explique dans mon billet. Tout ça pour ne pas saisir Range("a1:a1000").End(xlUp). Qui plus est, sauf lors de la phase de nettoyage et de préparation de données tierces extraites de façon barbare, un End(xlUp) a perdu beaucoup de son utilité si l'on conçoit correctement son classeur avec des tableaux structurés. Il n'est donc pas normal d'en avoir besoin pour un filtre avancé, puisque depuis 12 ans, on devrait appuyer le filtre avancé en VBA sur base d'une référence de tableau structuré, et pas en bornant la plage à coup de End(xlUp) (si on n'utilise pas PQ, ce qui à mon avis est une erreur depuis XL2010).

    Cette notation n'a aucun rapport avec les références structurées (voir ce chapitre de mon tuto sur les tableaux structurés) qui a, quant à elle, une utilité certaine, tant en Excel qu'en VBA.


    Basiquement, pour un filtre avancé, qui en 2020 s'appuie sur un tableau structuré, on a le code suivant, sur base de la configuration Excel suivante avec les données stockées dans la table t_Ventes, en voulant extraire uniquement les valeurs pour le client A...
    Nom : 2020-01-18_104117.png
Affichages : 51
Taille : 4,0 Ko

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Test()
      On Error GoTo EndHandler
     
      Application.DisplayAlerts = False
      Range("t_Ventes[#all]").AdvancedFilter xlFilterCopy, Range("e1:e2"), Range("g1:g2")
    EndHandler:
      Application.DisplayAlerts = True
      If Err <> 0 Then MsgBox Err.Description, vbExclamation, "Erreur: " & Err.Number
    End Sub

    Par contre, je n'ai pas compris ta remarque portant sur le =[@PAYS]="AU". Peux-tu donner le contexte et un supplément d'explications?


    Autre question: Pourquoi ne veux-tu pas les entêtes? Si c'est parce que tu utilises d'autres entêtes que ceux du tableau d'origine, il te suffit de les mémoriser puis de les restituer. Mais à nouveau, j'enfonce le clou: Avec Power Query, tout cela, même la modification d'entête, peut se réaliser sans vba.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Test()
      On Error GoTo EndHandler
      Dim Headers
     
      Application.DisplayAlerts = False
      Headers = Range("g1:h1") ' On mémorise
      Range("g1:h1").Value = "" ' On efface
      Range("t_Ventes[#all]").AdvancedFilter xlFilterCopy, Range("e1:e2"), Range("g1:h1")
      Range("g1:h1").Value = Headers 'on restitue
     
    EndHandler:
      Application.DisplayAlerts = True
      If Err <> 0 Then MsgBox Err.Description, vbExclamation, "Erreur: " & Err.Number
    End Sub
    Et au passage, fais attention que la plage d'arrivée n'est pas toujours nettoyée, ce qui peut laisser des crasses (voir le tuto de Philippe Tulliez au sujet des filtres avancés)
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    14 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 14 966
    Points : 41 322
    Points
    41 322
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par elclor Voir le message
    [...]
    Mais dès le début en ajoutant une colonne avec la condition identique à la tienne=[@PAYS]="AU" je reçois le message d'erreur suivant[...]
    Il n'y aurait pas un espace derrière PAYS dans l'intitulé de la colonne?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Une fois pour toutes, je donne mon avis. Je ne vais pas le répéter à chaque message...
    Si je propose une solution générique sur votre solution spécifique, c'est parce que, fainéant de nature, je privilégie le réutilisable...
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/06/2013, 03h09
  2. saisie d'une ligne suite à un filtre élaboré
    Par jerem1 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/12/2010, 10h14
  3. Réponses: 1
    Dernier message: 02/09/2010, 17h05
  4. afficher des entêtes pour les lignes d'une jtable
    Par minanoun dans le forum Composants
    Réponses: 4
    Dernier message: 13/04/2009, 03h14
  5. Réponses: 6
    Dernier message: 01/06/2006, 16h11

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