Extraire les valeurs d'un filtre dans un autre tableau

Bonjour je souhaiterais à l'aide d'un userform et d'une combobox à l'intérieur de l'userform, filtrer les données d'un tableau selon leur code (colonne code).

Les valeurs iraient se placer dans un tableau dans l'onglet Feuil 2 et les valeurs Bondholders Full Name, adresse1, adress 2, adress 3 iraient eux se placer en cellule A1 à A4.

Le tableau se rempliraient au fur et a mesure, il n'est pas figé.

Ci-joint un fichier exemple où j'aurais choisir le code AAA dans l'userform.

Je vous remercie d'avance

J'ai trouvé un code qui correspond à ce que je veux faire mais je n'arrive pas à l'adapter. Si vous pouviez juste m'aidez à commencer je pense être en capacité de terminer l'adaptation.

capture d e cran 2016 12 22 a 11 30 47 capture d e cran 2016 12 22 a 11 31 55 capture d e cran 2016 12 22 a 11 32 44
40exemple.xlsx (44.20 Ko)

Bonjour,

Tu envisages un filtrage avancé d'une base de données sur un champ, opération relativement simple, qui ne justifie nullement un Userform et la procédure compliquée qui l'accompagne ! L'aménagement rapide d'une zone de critères et une simple liste déroulante suffira à déclencher le filtrage, lequel se fera alors en une ligne de code !

Mais tu peux toujours t'amuser à faire l'acrobate dans des appareillages complexes...

Dans la mesure où tu fournis un fichier xlsx, sans le Userform indiqué, sans macro, je m'arrête donc là !

Cordialement.

Bonjour Nicolas, bonjour le forum,

Il serait bon que tu joignes le fichier xlsm avec l'Userform. Pour le reste, je pense que je devrais pouvoir adapter le code...

Bonjour MFerrand,

Le filtrage se fait effectivement sur un champ c'est qui est simple en soi mais l'idée principale est de recopier les valeurs des lignes filtrés dans un autre tableau de l'onglet Feuil 2 car je souhaite ensuite envoyer l'onglet Feuil 2 vers un doc word.

Pour cela il me semble qu'une macro est nécessaire.

Effectivement le bouton de ma Feuil1 de mon Exemple est inutile à ce stad e

Le fait d'envoyer le résultat ailleurs ne change rien à la simplicité de l'opération.

Je suis toujours réticent à faire des macros pour réaliser des opérations plus simples autrement. Dans le cas du filtrage avancé, on est dans le cas inverse, c'est plus compliqué à faire manuellement (et barbant qui plus est) que le faire en macro. Et même, on va plus vite à écrire la macro et la lancer qu'à réaliser l'opération manuelle une seule fois !

Bonjour ThauThème,

Merci pour votre réponse.

Ci-Joint le fichier en xlsm avec l'userform. Ca serait un userform tout simple avec un combobox qui prend ses valeurs dans la colonne code en évitant les doublons.

Merci d'avance.

71exemple-2.xlsm (58.86 Ko)

Bonjour le fil, bonjour le forum,

Pour ma part, j'ai toujours détesté le filtre avancé qui oblige à réserver une place dans l'onglet même où sont les données. Même si on peut bien évidemment les supprimer à la fin de la macro. Je préfère les acrobaties...

Je ne sais pas si vous avez vu, je le remets la au cas où

Merci beaucoup

48exemple-2.xlsm (58.86 Ko)

Je le stocke. Je te ferai mon modèle dans la journée. Pas le temps maintenant.

Re,

Tu compliquais un peu les choses, en voulant une base filtrée et réorganisée ! Ça va réduire l'écart en taille de code avec la solution que proposera ThauTheme...

Pour faciliter les manipulations, 4 plages nommées :

- BaseCode : la 1re colonne (Code) de la base, en-tête de champ incluse, en dynamique

- LstCode : un filtrage avancé sans doublon de la plage précédente en Z1 (colonne masquée), nommée en dynamique à partir de Z2 (inclut une cellule vide, voir ci-dessous), destinée à alimentée liste déroulante placée en C2

- Crit : c'est la zone de critères pour le filtrage, en C1:C2, C2 sous liste déroulante ; c'est le choix dans la liste qui déclenchera le filtrage ; en cas de choix de la position "vide" (ou effacement de C2), le filtrage n'aura pas lieu, mais le filtrage antérieur sera effacé

- BaseFilt : la 1re colonne de la zone de résultats du filtrage (feuille 2), en-tête incluse, en dynamique ; lors de l'effacement, on n'efface pas l'en-tête, de cette façon la plage existe toujours et ne déclenchera pas d'erreur si on l'effaçait par exemple deux fois de suite.

Le dispositif est simple : évènementielle au changement de sélection dans la liste déroulante en C2 ;

on procède au filtrage avancé : résultat (temporaire sur la feuille 2 en AA9:AM9 ;

on mesure l'extension par la dernière cellule occupée en AA, ligne qui en retranchant 9 donne le nombre de ligne de données filtrées (variable n) ;

compte tenu du découpage des résultats, on transfère les valeurs de la 11e col. filtrée en 1re col. résultats, les 6e à 10e col. filtrées en 2e à 6e col. résultats, les 12e et 13e col. filtrées en 7e et 8e col. résultats, en trois fois donc ;

on efface le filtrage (temporaire, Clear pour effacer toutes traces du filtrage) ;

on affiche la feuille.

Petite particularité : on accède à la feuille 2 à partir de la plage nommée (propriété Worksheet), d'où indépendance par rapport au nom de feuille. L'évènementielle étant liée à la feuille 1, son nom n'est également pas utilisé...

Si un changement intervient dans la colonne Code de la base, la même évènementielle intervient mais là se contente de filtrer la liste alimentant la liste déroulante.

Le code :

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim n%
    If Target.Address = "$C$2" Then
        [BaseFilt].Offset(1).Resize(, 8).ClearContents
        If Target <> "" Then
            [BaseCode].Resize(, 13).AdvancedFilter xlFilterCopy, [Crit], _
             [BaseFilt].Worksheet.Range("AA9:AM9"), False
            With [BaseFilt]
                n = .Worksheet.Range("AA" & Rows.Count).End(xlUp).Row - 9
                .Cells(2, 1).Resize(n).Value = .Worksheet.Range("AK10").Resize(n).Value
                .Cells(2, 2).Resize(n, 5).Value = .Worksheet.Range("AF10").Resize(n, 5).Value
                .Cells(2, 7).Resize(n, 2).Value = .Worksheet.Range("AL10").Resize(n, 2).Value
                .Worksheet.Range("AA9").Resize(n + 1, 13).Clear
                .Worksheet.Activate
            End With
        End If
    ElseIf Not Intersect(Target, [BaseCode]) Is Nothing Then
        [BaseCode].AdvancedFilter xlFilterCopy, , Me.Range("Z1"), True
    End If
End Sub

Cordialement.


Merci beaucoup pour votre réponse mais lorsque je choisis un code ,

j'ai le message d'erreur : Erreur 424 : Objet requis et la ligne suivante surligné en jaune :

Je précise que je suis sur Mac......

capture d e cran 2016 12 22 a 16 03 18

Merci pour votre réponse et votre code malheuresement le message d'erreur suivant s'affiche : erreur 424 : objet requis et la ligne suivante est surlignée :

Je précise que je suis sur Mac...

Si c'est sur le fichier que j'ai restitué, c'est des plus curieux, à moins qu'on ait touché à la définition de la plage, ou déplacé des éléments.

A vérifier dans le gestionnaire de noms que BaseFilt est bien définie par la formule :

=DECALER(Feuil2!$E$9;;;NBVAL(Feuil2!$E:$E)-NBVAL(Feuil2!$E$1:$E$8))

Ou qu'une en-tête n'a pas été effacée...

Aucune raison à cette erreur si le fichier est intact.

Non le fichier est intacte, c'est le même. Je pense que le problème ne vient pas spécialement de cette ligne car lorsque j'efface la première condition le même message d'erreur apparaît pour la ligne BaseCode.

Le problème doit venir du fait que je sois sur Mac car le message d'erreur 424 objet requis apparait souvent sur des codes Vba qui marche pourtant sur PC...

Les noms sont bien dans le classeur ?

Sinon est-ce que MAC accepte la notation compacte entre crochets ? Je n'ai jamais entendu parler du contraire mais ma connaissance du MAC est embryonnaire...

En tout cas, pas d'erreur chez moi.. Si je veux en produire, je supprime des éléments et effectivement quand le code a besoin de l'élément supprimé, ça bloque

Je viens de pêcher au passage une indication de problèmes de formulation avec Evaluate... Or la notation entre crochets fait implicitement appel à la méthode Evaluate.

Cela vaut donc la peine d'essayer de remplacer : [BaseFilt] par : Range("BaseFilt")

Si cela passe, tu auras l'erreur à la prochaine ligne comportant une expression entre crochets mais ce serait une bonne chose car on tiendrait la solution.

Si cela ne marcher pas j'essaierais de trouver d'autres formulations à tester.

Malheuresement, j'avais déjà essayer de remplacer par Range("Baselift") et l'erreur 1004 apparaît dans un premier temps :

l'élément portant ce nom est introuvable

puis lorsque je réessaye

La méthode « Range » de l'objet « _Worksheet » a échoué

Merci encore pour votre aide !

Ah ! Mais as-tu vérifié la présence des noms dans le gestionnaire de noms ? !

Oui pourtant :

capture d e cran 2016 12 22 a 23 55 54

Dis donc ! Je vois que tu utilises un Excel anglais. Les formules de plages sont en français, elles devraient être en anglais sur un Excel anglais ?

Rechercher des sujets similaires à "extraire valeurs filtre tableau"