[VBA] activer en auto des elements d'une list

Résolu/Fermé
dric83 - 21 juin 2010 à 17:19
 dric83 - 23 juil. 2010 à 16:41
Bonjour à tous,

Grâce à ce lien j'ai réussi à trouver ce que je voulais
http://boisgontierjacques.free.fr/pages_site/formulairemultiSelection.htm

Voir le 2eme en partant du bas :
"Choix multiples dans une ListeBox"
(fichier exemple à télécharger)
http://boisgontierjacques.free.fr/fichiers/Formulaire/FormSelectionMult.xls


C'est exactement ce que je cherchais mais il manque juste une petite chose :

Imaginons que j'ai déjà sélectionné une première fois dans ma liste les éléments que je souhaite, je valide, la liste apparait dans la case jaune.
Mais si je souhaite juste rajouter quelque chose, il faut que je re-sélectionne TOUS les éléments que j'avais déjà sélectionné : fastidieux lorsque la liste est très longue.
J'aimerai que si des éléments existent dans la case jaune, ils soient déjà sélectionnés dans la liste...

Mais comment faire .... ??

MERCI à ceux qui auront une idée et voudront bien la partager !! :)

Bonne soirée.

Cédric


code :

Dim f, mondico

Sub UserForm_Initialize()
  Set f = Sheets("bd")
  Set mondico = CreateObject("Scripting.Dictionary")
  Me.choix.List = Range(f.[A2], f.[b65000].End(xlUp)).Value
  Me.choix.MultiSelect = fmMultiSelectMulti
End Sub

Private Sub Choix_Change()
 'mondico.RemoveAll
 'Me.RésultatListBox1.Clear
 For k = 0 To Me.choix.ListCount - 1
   If Me.choix.Selected(k) = True Then
     temp = Me.choix.List(k, 0) & " " & Me.choix.List(k, 1)
     mondico(temp) = temp
   End If
 Next k
 Me.RésultatListBox1.List = mondico.items
End Sub

Private Sub cmdValider_Click()
  [E1] = Join(mondico.items, Chr(10))
  Unload Me
End Sub


A voir également:

6 réponses

Bonjour lermite !

Merci beaucoup pour la réponse et désolé de ne pas avoir répondu plus tot.
J'ai enfin un peu de temps pour me remettre sur ce sujet.

J'ai fait d'autres modifications pour optimiser et présenter à mon gout.

Mais j'ai essayé de créer cette fameuse boucle et je t'avoue ... :-/ ca fonctionne pas.

Aurais tu un peu plus à me dire ?
Voila à quoi ressemble maitenant ma macro :


Dim f, mondico

Sub UserForm_Initialize()
  Set f = Sheets("bd")
  Set mondico = CreateObject("Scripting.Dictionary")
  Me.choix.List = Range(f.[A2], f.[b65000].End(xlUp)).Value
  Me.choix.MultiSelect = fmMultiSelectMulti
End Sub

Private Sub Choix_Change()
 mondico.RemoveAll
 Me.RésultatListBox1.Clear
 For k = 0 To Me.choix.ListCount - 1
   If Me.choix.Selected(k) = True Then
     temp = Me.choix.List(k, 0)
     mondico(temp) = temp
   End If
 Next k
 Me.RésultatListBox1.List = mondico.items
End Sub

Private Sub cmdValider_Click()
  [E1] = Join(mondico.items, "/")
  Unload Me
End Sub



Maintenant mes resultats sont sur la meme ligne et chaque élément est séparé du suivant par un slash

MERCI beaucoup en tous cas !!

Cédric
1
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
29 juin 2010 à 14:07
J'aurais difficile de suivre, ça dépend où tu mémorise les sélections précédantes.
1
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 306
Modifié par michel_m le 29/06/2010 à 14:37
erreur: message annulé
excusez moi
:-x
1
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
Modifié par lermite222 le 29/06/2010 à 15:16
En relisant ta réponse je comprend que tu mémorise les sélection dans E1.. séparer par un slach (/)
Alors essaye avec...
Dim L As Integer, TB  
    TB = Split(Range("E1"), "/")  
    For k = choix.ListCount - 1 To 0 Step -1 'Si ont enlève des lignes le liscount change.  
        For L = 0 To UBound(TB)  
            If choix.List(k) = TB(L) Then  
                choix.RemoveItem (k)  
                Exit For  
            End If  
        Next L  
    Next k

Faudra peut-être supprime le exit For (je sais pas tester)
A+

L'expérience instruit plus sûrement que le conseil. (André Gide)
Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Un mois plus tard je m'y replonge !!!

Merci beaucoup lermite222 car grace à toi j'ai trouvé la solution :

Dim L As Integer, TB
        TB = Split(Range("E1"), "/")
        For L = 0 To UBound(TB)
            UserForm1.RésultatListBox1.addItem TB(L)
        Next L


MERCI encore et bonne continuation
1
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
21 juin 2010 à 18:37
Bonjour,
Après ta ligne...
 Me.choix.MultiSelect = fmMultiSelectMulti

Ce qui, entre parenthèses pourrait être déterminer dans le design.
Il faut repasser en revue toutes les lignes de la liste et faire une comparaison avec ta feuille et quand c'est déja sélectionner mettre Selected à True.
(Avec une boucle comme tu fais pour la sélection)
A+
0