Vba excel filtre / listbox ...
Fermé
ludivine
-
24 août 2006 à 12:43
amine69500 Messages postés 422 Date d'inscription lundi 8 juin 2009 Statut Membre Dernière intervention 25 août 2013 - 11 août 2010 à 22:51
amine69500 Messages postés 422 Date d'inscription lundi 8 juin 2009 Statut Membre Dernière intervention 25 août 2013 - 11 août 2010 à 22:51
A voir également:
- Vba excel filtre / listbox ...
- Liste déroulante excel - Guide
- Photo filtre 7 gratuit - Télécharger - Retouche d'image
- Si et excel - Guide
- Aller à la ligne excel - Guide
- Word et excel gratuit - Guide
15 réponses
Armojax
Messages postés
1860
Date d'inscription
mercredi 19 janvier 2005
Statut
Membre
Dernière intervention
2 octobre 2024
1 528
29 août 2006 à 18:54
29 août 2006 à 18:54
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.
Armojax
Messages postés
1860
Date d'inscription
mercredi 19 janvier 2005
Statut
Membre
Dernière intervention
2 octobre 2024
1 528
24 août 2006 à 15:59
24 août 2006 à 15:59
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".
Armojax
Messages postés
1860
Date d'inscription
mercredi 19 janvier 2005
Statut
Membre
Dernière intervention
2 octobre 2024
1 528
24 août 2006 à 13:34
24 août 2006 à 13:34
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 LoopSi 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
amine69500
Messages postés
422
Date d'inscription
lundi 8 juin 2009
Statut
Membre
Dernière intervention
25 août 2013
12
11 août 2010 à 22:51
11 août 2010 à 22:51
merci man pour ton code j'ai fait copier colle puis je lé adapter a ma colonne et ca marche bien merci bonne soirer
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
lulu37
Messages postés
76
Date d'inscription
jeudi 24 août 2006
Statut
Membre
Dernière intervention
8 avril 2016
13
25 août 2006 à 10:07
25 août 2006 à 10:07
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
Armojax
Messages postés
1860
Date d'inscription
mercredi 19 janvier 2005
Statut
Membre
Dernière intervention
2 octobre 2024
1 528
25 août 2006 à 10:31
25 août 2006 à 10:31
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...
lulu37
Messages postés
76
Date d'inscription
jeudi 24 août 2006
Statut
Membre
Dernière intervention
8 avril 2016
13
25 août 2006 à 12:03
25 août 2006 à 12:03
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 !
Armojax
Messages postés
1860
Date d'inscription
mercredi 19 janvier 2005
Statut
Membre
Dernière intervention
2 octobre 2024
1 528
25 août 2006 à 17:07
25 août 2006 à 17:07
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
lulu37
Messages postés
76
Date d'inscription
jeudi 24 août 2006
Statut
Membre
Dernière intervention
8 avril 2016
13
29 août 2006 à 17:33
29 août 2006 à 17:33
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...)
??
lulu37
Messages postés
76
Date d'inscription
jeudi 24 août 2006
Statut
Membre
Dernière intervention
8 avril 2016
13
29 août 2006 à 17:37
29 août 2006 à 17:37
j'entends par là, compléter rowsource = plagededonnéesNommée
après je sais pas ...
après je sais pas ...
Armojax
Messages postés
1860
Date d'inscription
mercredi 19 janvier 2005
Statut
Membre
Dernière intervention
2 octobre 2024
1 528
29 août 2006 à 18:03
29 août 2006 à 18:03
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.
lulu37
Messages postés
76
Date d'inscription
jeudi 24 août 2006
Statut
Membre
Dernière intervention
8 avril 2016
13
29 août 2006 à 18:15
29 août 2006 à 18:15
à 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
lulu37
Messages postés
76
Date d'inscription
jeudi 24 août 2006
Statut
Membre
Dernière intervention
8 avril 2016
13
30 août 2006 à 11:12
30 août 2006 à 11:12
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...
Armojax
Messages postés
1860
Date d'inscription
mercredi 19 janvier 2005
Statut
Membre
Dernière intervention
2 octobre 2024
1 528
30 août 2006 à 13:59
30 août 2006 à 13:59
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...
lulu37
Messages postés
76
Date d'inscription
jeudi 24 août 2006
Statut
Membre
Dernière intervention
8 avril 2016
13
30 août 2006 à 15:30
30 août 2006 à 15:30
la combobox c'est nickel
a+
a+