Vba excel filtre / listbox ...
ludivine
-
amine69500 Messages postés 471 Statut Membre -
amine69500 Messages postés 471 Statut Membre -
Bonjour,
Débutante sur vba excel, je rencontre pas mal de pb malgré de nombreuses recherches sur internet.
Je voudrais afficher le contenu SANS DOUBLONS d'une colonne dans une liste déroulante sur formulaire, sachant que les valeurs à afficher ne commencent qu'à la ligne 3 (j'ai réussi mais les doublons eux sont tjs là!)
Je voudrais également créer un code pour enlever les filtres de toutes les colonnes sauf la colonne 1 de ma feuille. (sans avoir à faire 1 ligne de code pour chaque colonne)
Quelqu'un peut-il m'aider? Dur, dur de tatonner... lol
Merci d'avance
Ludivine
Débutante sur vba excel, je rencontre pas mal de pb malgré de nombreuses recherches sur internet.
Je voudrais afficher le contenu SANS DOUBLONS d'une colonne dans une liste déroulante sur formulaire, sachant que les valeurs à afficher ne commencent qu'à la ligne 3 (j'ai réussi mais les doublons eux sont tjs là!)
Je voudrais également créer un code pour enlever les filtres de toutes les colonnes sauf la colonne 1 de ma feuille. (sans avoir à faire 1 ligne de code pour chaque colonne)
Quelqu'un peut-il m'aider? Dur, dur de tatonner... lol
Merci d'avance
Ludivine
A voir également:
- Vba excel filtre / listbox ...
- Photo filtre 7 gratuit - Télécharger - Retouche d'image
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Déplacer colonne excel - Guide
- Si ou excel - Guide
15 réponses
Essaie cette macro, à lancer à l'ouverture de ton classeur. Elle crée la liste triée sans doublons dans une feuille spéciale que j'appelle Param (pas la peine de créer la feuille, ça se fait tout seul si elle n'existe pas), et lui donne un nom. Tout est recalculé à chaque ouverture du classeur. Le nom de la plage est PlageListBox (tu changes tout ce que tu veux...).
Et dans les propriétés de ta ListBox, tu peux mettre le nom de cette plage dans RowSource.
Et dans les propriétés de ta ListBox, tu peux mettre le nom de cette plage dans RowSource.
Sub PrepaListe()
Dim Lig_Deb As Long
Dim DerLig As Long
Dim Col As String
Dim Feuille As String
Dim CelluleCourante As Range
Dim CelluleSuivante As Range
Dim FF As Worksheet
' PARAMETRES A ADAPTER
'----------------------------------------------------------------------------
Lig_Deb = 3 ' n° de la première ligne de données filtrées
Col = "A" ' colonne de données filtrées
Feuille = "Feuil1" ' nom de la feuille de données
'----------------------------------------------------------------------------
Application.ScreenUpdating = False
On Error Resume Next
Worksheets("Param").Activate
If Err.Number = 9 Then
Worksheets.Add
ActiveSheet.Name = "Param"
End If
On Error GoTo 0
Sheets("Param").Cells.ClearContents
Set FF = Sheets(Feuille)
DerLig = FF.Cells(65536, Col).End(xlUp).Row
FF.Range(Col & Lig_Deb & ":" & Col & DerLig).Copy
Cells(1, 1).Select
ActiveSheet.Paste
Selection.Sort Key1:=Range("A1"), _
Order1:=xlAscending, _
Header:=xlNo
Application.CutCopyMode = False
Set CelluleCourante = Range("A1")
Do While Not IsEmpty(CelluleCourante)
Set CelluleSuivante = CelluleCourante.Offset(1, 0)
If CelluleSuivante.Value = CelluleCourante.Value Then
CelluleCourante.EntireRow.Delete
End If
Set CelluleCourante = CelluleSuivante
Loop
On Error Resume Next
ActiveWorkbook.Names("PlageListBox").Delete
On Error GoTo 0
DerLig = Range("A65536").End(xlUp).Row
ActiveWorkbook.Names.Add Name:="PlageListBox", _
RefersToR1C1:="=Param!R1C1:R" & DerLig & "C1"
Application.ScreenUpdating = True
End Sub
bonjour,
j'ai consu une zone de liste via Excel "données/validation" dans la colonne A. et de la même manière une deuxième zone de liste dans la colonne B. Or mon patron me demande quand on selectionne une valeur de la colonne A il faut que la colonne B affiche seulement les données correspondantes à cette valeur dans la colonne B.
Exemple:
zone de liste colonne A: "a;b;c;d;e"
zone de liste colonne B: "aa;ab;ac;ad;af;ba;bb;bc;bd..."
le souhait:
qd on selectionne dans la colonne A : la valeur "a"
alors la zone de liste de la colonne B affiche seulement les valeur qui commence par a : {aa;ab;ac;ad;af}
et non la liste totale puisque j'en ai 12000 valeur et l'utilisateur se perd vraiment.
Merci d'avance de votre collaboration.
j'ai consu une zone de liste via Excel "données/validation" dans la colonne A. et de la même manière une deuxième zone de liste dans la colonne B. Or mon patron me demande quand on selectionne une valeur de la colonne A il faut que la colonne B affiche seulement les données correspondantes à cette valeur dans la colonne B.
Exemple:
zone de liste colonne A: "a;b;c;d;e"
zone de liste colonne B: "aa;ab;ac;ad;af;ba;bb;bc;bd..."
le souhait:
qd on selectionne dans la colonne A : la valeur "a"
alors la zone de liste de la colonne B affiche seulement les valeur qui commence par a : {aa;ab;ac;ad;af}
et non la liste totale puisque j'en ai 12000 valeur et l'utilisateur se perd vraiment.
Merci d'avance de votre collaboration.
Re, ludivine,
OK. Essaie ça, à mettre dans la macro Initialize de ton UserForm. Adapte les paramètres :
- Lig : n° de la première ligne de données
- Col : colonne des données
- ListBox1 : remplacer éventuellement par le nom de ta ListBox.
OK. Essaie ça, à mettre dans la macro Initialize de ton UserForm. Adapte les paramètres :
- Lig : n° de la première ligne de données
- Col : colonne des données
- ListBox1 : remplacer éventuellement par le nom de ta ListBox.
Private Sub UserForm_Initialize() Dim Lig As Long Dim Col As String Dim ValeurCourante As String Dim ValeurPrécédente As String Lig = 3 Col = "A" ValeurPrécédente = "" ValeurCourante = Cells(Lig, Col).Value Do While ValeurCourante <> "" If ValeurCourante <> ValeurPrécédente Then ListBox1.AddItem ValeurCourante End If Lig = Lig + 1 ValeurPrécédente = ValeurCourante ValeurCourante = Cells(Lig, Col).Value Loop End SubPour les filtres, ce que je t'ai donné ne marche pas ? Ça supprime tous les filtres, et ça réinstalle celui de la colonne "A".
Bonjour Ludivine,
Pour virer les doublons dans la colonne "A" à partir de la ligne 3 :
EntireRow supprime la ligne entière. L'enlever pour ne virer que la cellule.
Pour les filtres :
Pour virer les doublons dans la colonne "A" à partir de la ligne 3 :
Dim CelluleCourante As Range
Dim CelluleSuivante As Range
Set CelluleCourante = Range("A3")
Do While Not IsEmpty(CelluleCourante)
Set CelluleSuivante = CelluleCourante.Offset(1, 0)
If CelluleSuivante.Value = CelluleCourante.Value Then
CelluleCourante.EntireRow.Delete
End If
Set CelluleCourante = CelluleSuivante
Loop
Si tu ne veux pas détruire tes doublons, mais seulement ne pas les afficher, tu peux t'inspirer de ça, ou travailler sur une autre colonne provisoire dans laquelle tu auras copié les données.
EntireRow supprime la ligne entière. L'enlever pour ne virer que la cellule.
Pour les filtres :
ActiveSheet.AutoFilterMode = False
Columns("A:A").AutoFilter
Bonjour Armojax,
Merci pour ta réponse, cependant je ne me suis peut etre pas bien exprimée :
en fait j ai une feuille avec une base de données
le but est d accéder aux données par formulaires (pour simplifier la recherche)
la listbox dans formulaire, c'est pour filtrer la colonne A, donc afficher la liste des valeurs de la colonne A sans les doublons (pour la visualisation...), ils sélectionnent et ça retourne la valeur dans le filtre auto
dans l'autre procédure (filtres), j'ai fait :
Selection.AutoFilter Field:=2
Selection.AutoFilter Field:=3
Selection.AutoFilter Field:=4
...
pour pas toucher au filtre de ma colonne A qui doit restée filtrée, tout en conservant la possibilité d'accéder aux filtres de la feuille ...
ca marche bien sûr, mais il doit y avoir + court lol
??
Ludivine
Merci pour ta réponse, cependant je ne me suis peut etre pas bien exprimée :
en fait j ai une feuille avec une base de données
le but est d accéder aux données par formulaires (pour simplifier la recherche)
la listbox dans formulaire, c'est pour filtrer la colonne A, donc afficher la liste des valeurs de la colonne A sans les doublons (pour la visualisation...), ils sélectionnent et ça retourne la valeur dans le filtre auto
dans l'autre procédure (filtres), j'ai fait :
Selection.AutoFilter Field:=2
Selection.AutoFilter Field:=3
Selection.AutoFilter Field:=4
...
pour pas toucher au filtre de ma colonne A qui doit restée filtrée, tout en conservant la possibilité d'accéder aux filtres de la feuille ...
ca marche bien sûr, mais il doit y avoir + court lol
??
Ludivine
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour,
Ca ne marche pas snif ... dur pour un vendredi !
J'ai du zappé quelque chose c'est sûr, mais je ne comprend rien à la première partie de ton code, du coup si je dois adapter, c'est pas gagné.
Bref, pour la listbox, à l'origine, j'avais bien la liste de mes données ... seulement en ayant donné le nom de l
Ca ne marche pas snif ... dur pour un vendredi !
J'ai du zappé quelque chose c'est sûr, mais je ne comprend rien à la première partie de ton code, du coup si je dois adapter, c'est pas gagné.
Bref, pour la listbox, à l'origine, j'avais bien la liste de mes données ... seulement en ayant donné le nom de l
Pas sniff, ludivine... !
Ci-dessous un exemple :
https://www.cjoint.com/?izkDwEfevP
A l'ouverture du classeur la Listbox s'affiche automatiquement.
Regarde le code du UserForm...
Ci-dessous un exemple :
https://www.cjoint.com/?izkDwEfevP
A l'ouverture du classeur la Listbox s'affiche automatiquement.
Regarde le code du UserForm...
ok, Ca ne peut pas marcher dans mon cas, les doublons ne se suivent pas forcément, à moins de faire un tri à l'ouverture...
pour les filtres, (j'ai pas pu finir tt à l heure), j'ai bien noté ton code pour + tard, mais je t'explique :
les utilisateurs sélectionnent une valeur de ma listbox (celle qui pose pb) la valeur est renvoyée sur le filtre de la col A, je ne veux pas qu'ils aient la main sur ce filtre, mais sur les autres si...
du coup si je réinitialise le filtre, la valeur n'y sera plus, à moins qu'elle puisse être réinjectée...
N'oublies pas que je suis une débutante, mais alors une vraie de vraie !
pour les filtres, (j'ai pas pu finir tt à l heure), j'ai bien noté ton code pour + tard, mais je t'explique :
les utilisateurs sélectionnent une valeur de ma listbox (celle qui pose pb) la valeur est renvoyée sur le filtre de la col A, je ne veux pas qu'ils aient la main sur ce filtre, mais sur les autres si...
du coup si je réinitialise le filtre, la valeur n'y sera plus, à moins qu'elle puisse être réinjectée...
N'oublies pas que je suis une débutante, mais alors une vraie de vraie !
Désolé ludivine, mais ma FreeBox est restée en rade pendant 3 heures. Bon, 3 h en 2 ans c'est pas une catastrophe, mais bon...
Donc je te mets un nouveau classeur ici :
https://www.cjoint.com/?izrcMmdFXA
Je vois un peu mieux ce que tu veux faire.
Le formulaire ne se lance pas au démarrage. Tu peux faire <CTRL+MAJ+M>.
Tu pourras paramétrer la macro Initialize selon tes propres besoins. J'utilise la colonne "Z" pour y copier les données de la colonne "A" et les trier pour alimenter la ListBox.
Quand on clique dans la liste, on filtre les données correspondantes. Dans la commande j'ai mis le paramètre VisibleDropDown à False, ce qui cache la petite "flèche en bas" du filtre. Tu peux le mettre à True (ou l'enlever, c'est la valeur par défaut) si tu veux.
A suivre, sans doute...
Donc je te mets un nouveau classeur ici :
https://www.cjoint.com/?izrcMmdFXA
Je vois un peu mieux ce que tu veux faire.
Le formulaire ne se lance pas au démarrage. Tu peux faire <CTRL+MAJ+M>.
Tu pourras paramétrer la macro Initialize selon tes propres besoins. J'utilise la colonne "Z" pour y copier les données de la colonne "A" et les trier pour alimenter la ListBox.
Quand on clique dans la liste, on filtre les données correspondantes. Dans la commande j'ai mis le paramètre VisibleDropDown à False, ce qui cache la petite "flèche en bas" du filtre. Tu peux le mettre à True (ou l'enlever, c'est la valeur par défaut) si tu veux.
A suivre, sans doute...
bonjour , j ai vu tes interventions sur un probléme qui ressemble au mien,
j ai crée un programme qui fait le cumul des produits sorties; j ai plusieurs sortes de produits.
a chaque sorties de produits je remplies des textbox (date,quantité,nom client, date de facture, numero Bl, Destination, Type de vehicule, immatriculation), une fois c informations entrés , ils sont automatiquement enregistrés sur une feuille excel,
mon probléme est que je veux créer un autre userform2 commandé par un bouton au niveau du userform1,
sur ma userform2 je veux avoir 3 listbox , la listbox1 affiche les entétes de la feuille ou sont enregistrés les données, que la listbox2 affiche les données filtrés de chaque colonne ( par exemple si je selectionne nom client sur la listbox1 que la listbox2 affiche les tous les clients sans doublon et si je selectionne un client au niveau de la listbox2 , tous les mouements qu'il a pu effectué s 'affiche au niveau de la listbox3 sous forme de tableau avec tous les details; merci d avance
j ai crée un programme qui fait le cumul des produits sorties; j ai plusieurs sortes de produits.
a chaque sorties de produits je remplies des textbox (date,quantité,nom client, date de facture, numero Bl, Destination, Type de vehicule, immatriculation), une fois c informations entrés , ils sont automatiquement enregistrés sur une feuille excel,
mon probléme est que je veux créer un autre userform2 commandé par un bouton au niveau du userform1,
sur ma userform2 je veux avoir 3 listbox , la listbox1 affiche les entétes de la feuille ou sont enregistrés les données, que la listbox2 affiche les données filtrés de chaque colonne ( par exemple si je selectionne nom client sur la listbox1 que la listbox2 affiche les tous les clients sans doublon et si je selectionne un client au niveau de la listbox2 , tous les mouements qu'il a pu effectué s 'affiche au niveau de la listbox3 sous forme de tableau avec tous les details; merci d avance
coucou
ca avait l'air de fonctionner à un moment donné...mais là je ne comprend plus rien
j'ai inséré un nouveau formulaire, selon réponse, le formulaire avec listbox en question doit s'afficher, mais ça me fait une erreur d'exe '13', j'ai l'impression qu'il n'aime l'initialisation....
es tu sûr qu'il n'y a pas moyen de compléter plus simplement (sans initialisation) la propriété rowsource de la listbox avec un paramètre en plus pour n'afficher qu'une seule fois les memes valeurs (paramètre que je ne connais pas bien sûr...)
??
ca avait l'air de fonctionner à un moment donné...mais là je ne comprend plus rien
j'ai inséré un nouveau formulaire, selon réponse, le formulaire avec listbox en question doit s'afficher, mais ça me fait une erreur d'exe '13', j'ai l'impression qu'il n'aime l'initialisation....
es tu sûr qu'il n'y a pas moyen de compléter plus simplement (sans initialisation) la propriété rowsource de la listbox avec un paramètre en plus pour n'afficher qu'une seule fois les memes valeurs (paramètre que je ne connais pas bien sûr...)
??
A priori, l'erreur VBA "13" est Incompatibilité de type. Peut-être du texte qui serait utilisé comme du numérique par exemple, ou quelque chose comme ça...?
Si tes données sont stables pendant que tu utilises tes macros, on peut effectivement préparer la liste de la ListBox à l'open du classeur, plutôt qu'à l'Initialize du formulaire. Dans ce cas, il faut que tu tries tes données et que tu construises une plage où les doublons sont éliminés. Ensuite tu utilises effectivement la propriété RowSource pour se référer à cette plage.
Si tes données sont stables pendant que tu utilises tes macros, on peut effectivement préparer la liste de la ListBox à l'open du classeur, plutôt qu'à l'Initialize du formulaire. Dans ce cas, il faut que tu tries tes données et que tu construises une plage où les doublons sont éliminés. Ensuite tu utilises effectivement la propriété RowSource pour se référer à cette plage.
à ce moment là, je pense que je vais créer une plage de données, avec valeurs uniques, qui sera source d'alim pour ma colonne de données
et alimenter ma listbox par le nom de la plage
ca me parait etre plus simple (sauf si nouvelle entrée pour celui qui fait les modifs de la base de données, quoique...), qu'en penses tu?
et alimenter ma listbox par le nom de la plage
ca me parait etre plus simple (sauf si nouvelle entrée pour celui qui fait les modifs de la base de données, quoique...), qu'en penses tu?
Bonjour Armojax !
merci pour ta réponse, cependant je n'ai pas testé.
En fait, j'ai fait ce que j'ai décrit dans mon dernier message.
J'ai créé ma liste exhaustive (valeurs uniques) dans une feuille cachée / Validation des données sur la colonne des données (valeurs multiples)
ce qui me permet finalement de controler la saisie (les valeurs sont tout le temps les mêmes (quand meme 1 petit bouton en + pour ajouter 1 valeur si nécessaire avec visu feuil cahée...), c'est plus sur pour la suite des événements...
En prime ma listbox sur formulaire est reliée à la plage nommée de ma feuille cachée, donc tout est bon et sans doublons du coup!
J'espère seulement que d'utiliser la validation de données ne risque pas de faire planter le tout... (ca m'est déjà arrivé sur un autre fichier y a quelque temps de cela...snif)
Merci encore, dans d'autres circonstances, je ne manquerais pas d'utiliser ton code
Bonne journée
Ludivine
merci pour ta réponse, cependant je n'ai pas testé.
En fait, j'ai fait ce que j'ai décrit dans mon dernier message.
J'ai créé ma liste exhaustive (valeurs uniques) dans une feuille cachée / Validation des données sur la colonne des données (valeurs multiples)
ce qui me permet finalement de controler la saisie (les valeurs sont tout le temps les mêmes (quand meme 1 petit bouton en + pour ajouter 1 valeur si nécessaire avec visu feuil cahée...), c'est plus sur pour la suite des événements...
En prime ma listbox sur formulaire est reliée à la plage nommée de ma feuille cachée, donc tout est bon et sans doublons du coup!
J'espère seulement que d'utiliser la validation de données ne risque pas de faire planter le tout... (ca m'est déjà arrivé sur un autre fichier y a quelque temps de cela...snif)
Merci encore, dans d'autres circonstances, je ne manquerais pas d'utiliser ton code
Bonne journée
Ludivine
Ah si, juste une dernière petite question !
Comment je peux afficher une flèche pour dérouler ma listbox comme une liste déroulante ? (suis je claire?...)
Pour l'instant, j'ai deux petites flèches haut et bas à droite de ma listbox, et les valeurs restent affichées seulement à l'intérieur. Mais je voudrais n'avoir qu'une flèche bas et qd clique, que toute la liste s'affiche...
Comment je peux afficher une flèche pour dérouler ma listbox comme une liste déroulante ? (suis je claire?...)
Pour l'instant, j'ai deux petites flèches haut et bas à droite de ma listbox, et les valeurs restent affichées seulement à l'intérieur. Mais je voudrais n'avoir qu'une flèche bas et qd clique, que toute la liste s'affiche...
Au lieu d'une ListBox, tu peux utiliser un ComboBox. Beaucoup de propriétés sont identiques, et ça ne devrait pas être compliqué à transposer. Tu auras une liste déroulante, et tu pourras déterminer le nombre d'items visibles d'un coup avec la propriété ListRows.
Et pour répondre à ton item n° 13 ci-dessus : la macro que j'ai fournie fait à peu près ce que tu as mis en place : elle recalcule automatiquement, dans une feuille à part, une plage que tu peux passer à RowSource. Tu peux l'exécuter à chaque ouverture du classeur si ça change tout le temps, ou seulement quand c'est le moment...
Et pour répondre à ton item n° 13 ci-dessus : la macro que j'ai fournie fait à peu près ce que tu as mis en place : elle recalcule automatiquement, dans une feuille à part, une plage que tu peux passer à RowSource. Tu peux l'exécuter à chaque ouverture du classeur si ça change tout le temps, ou seulement quand c'est le moment...