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

Résolu
dric83 -  
 dric83 -
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


6 réponses

  1. dric83
     
    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
  2. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    J'aurais difficile de suivre, ça dépend où tu mémorise les sélections précédantes.
    1
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    erreur: message annulé
    excusez moi
    :-x
    1
  4. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. dric83
     
    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
  7. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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