Vba excel filtre / listbox ...

Fermé
ludivine - 24 août 2006 à 12:43
amine69500 Messages postés 418 Date d'inscription lundi 8 juin 2009 Statut Membre Dernière intervention 25 août 2013 - 11 août 2010 à 22:51
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
A voir également:

15 réponses

Armojax Messages postés 1858 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 22 mars 2024 1 528
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.
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

6
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.
3
Armojax Messages postés 1858 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 22 mars 2024 1 528
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.
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 Sub
Pour 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".
1
Armojax Messages postés 1858 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 22 mars 2024 1 528
24 août 2006 à 13:34
Bonjour Ludivine,

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
0
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
0
amine69500 Messages postés 418 Date d'inscription lundi 8 juin 2009 Statut Membre Dernière intervention 25 août 2013 12
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
0

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
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
0
Armojax Messages postés 1858 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 22 mars 2024 1 528
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...
0
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
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 !
0
Armojax Messages postés 1858 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 22 mars 2024 1 528
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...
0
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
0
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
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...)

??
0
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
j'entends par là, compléter rowsource = plagededonnéesNommée
après je sais pas ...
0
Armojax Messages postés 1858 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 22 mars 2024 1 528
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.
0
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
à 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?
0
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
0
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
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...
0
Armojax Messages postés 1858 Date d'inscription mercredi 19 janvier 2005 Statut Membre Dernière intervention 22 mars 2024 1 528
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...
0
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
la combobox c'est nickel
a+
0