Remplacer CheckBox par ListBox

Bonjour,

J'ai un fichier avec un tas de CheckBox, je souhaiterais les remplacer par 1 ou 2 listbox par Userform.

Alimenter la listbox via des additem n'est pas le problème.

Ce que je n'arrive pas à faire c'est attribuer une destination pour chaque selection d'une listbox.

Actuellement, chaque Checkbox envoie un résultat vers une cellule précise, de façon à avoir des résultat en colonnes :

Private Sub CheckBox28_Click()
If CheckBox28.Value Then
 Sheets("Données").Range("AH3").Value = 1
 Else
 Sheets("Données").Range("AH3") = ""
 End If
End Sub

La mise à jour du tableau via le Userform se fait sur la ligne 3. Quand il y a une nouvelle saisie, cela vient insérer sur la ligne 3 et descend toutes les données précédentes vers le bas. Curieux mais bon.

Je ne veux pas changer le principe d'adresser une valeur vers une cellule d'une colonne, mais la manière de faire, afin de réduire la taille de la Userform. J'ai donc pensé qu'une listbox à selection multiple serait plus simple d'usage et prendra beaucoup moins de place. Et que les mises à jour du tableau se fasse par le bas, ligne 5, ligne 6, etc.

Private Sub UserForm_Initialize()
    With ListBox1
        .AddItem "A"  (Si selectionné, alors envoyer une valeur "AAA" dans la colonne AH, première cellule vide)
        .AddItem "B"  (Si selectionné, alors envoyer une valeur "BBB"dans la colonne AB,première cellule vide)
        .AddItem "C"  (Si selectionné, alors envoyer une valeur "CCC"dans la colonne AZ,première cellule vide)
    End With  
End Sub

Pour envoyer une selection vers une colonne, pas de problème.

Mais pour 2 ou 3 selections dans la même listbox, je sais pas.

Private Sub ListBox1_Click()
Dim i As Integer
i = 0
With Sheets("Liste")
    For i = 1 To Sheets("Liste").Range("A65536").End(xlUp).Row
    If Sheets("Liste").Range("B" & i).Value = ListBox1.Value Then
    End If
    Next i
End With
End Sub

Je suis débutant en VBA.

Merci de vos conseils.

bonjour,

pour utiliser la multisélection dans le ListBox vous devez d'abord cocher 1_fmMultiSelectMulti dans la propriété "Multiselect" de la Listbox

ensuite pour boucler sur tous les éléments du List box :

Private Sub cmdOk_Click() 'si le bouton s'appelle "cmdOk"
Dim i%
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) = True Then MsgBox ListBox1.List(i)
Next i
End Sub

Ne rien mettre dans Private Sub ListBox1_Click

A+


Pour d'autres question ultérieures joindre à chaque fois votre classeur de test...

OK, merci,

Ce code va envoyer toutes les selections vers le tableau, mais comment faire pour que dans la listbox, telle nom selectionné ira dans telle colonne, que telle autre selection ira dans un autre colonne une fois que le bouton CmdOK (par exemple) validera le formulaire, c'est le principale problème.

Dans ma logique, j'attribuerais une "étiquette" à un élément lors du additem "A"(par exemple), et que lorsque A serait selectionné, une valeur prédéfinie irait se coller dans la colonne qu'on lui avait attribué (l'étiquette).

Peut être avec un ColumnCount ou un Offset(0, 20) (Ecrire dans la 20ème colonnes)...

Hum... ça dépend !

Si ta liste est constante et les affectations également tu peux gérer ça dans un ListBox multicolonne sinon faire une table de correspondance dans une feuille de paramètres... ou gérer ça dans un Select Case...

[Rappel] : Pour d'autres questions ultérieures joindre à chaque fois votre classeur de test...

[EDIT] ...Offset c'est le mode crade !

A+

Merci,

Donc d'une manière détournée c'est possible, Select case fonctionne un peu comme IF Then, et du coup oui c'est assez simple à mettre en place, mais c'est un peu lourd.

Pas de fichier à montrer puisque j'essaie de comprendre le truc pour pouvoir l'écrire.

Je ferais des tests ce weekend.

C'est noté pour Offset ;o)

Daumst a écrit :

c'est un peu lourd

Au timer ça se discute à comparer avec des if à répétition, mais si t'es un cador une simple boucle sur un Array : YAPAFOTO !

Après tout dépend du nombre de sélections potentielles et du nombre de sélections effectives...

Mais là encore ça dépend si la liste est constante ou variable... et comment se fait l'arbitrage vers les colonnes cibles !

A+

Bonjour !

Mouais une boucle sur un Array, ce sera pour un peu plus tard, j'ai jeté un oeil sur la doc et effectivement il y a un truc exploitable, mais je suis pas encore à ce niveau.

Alors j'ai bricolé un fichier, qui grosso modo reprend ce que je cherche à faire. Il y aura en réalité 2 userform (2 pages en fait) et le bouton valider sera sur le 2ème userform. Je ne l'ais pas fait dans le fichier test.

Donc petites listes constantes, en additem, ça ne mérite même pas de monopoliser des colonnes.

Dans le fichier, tu as

  • la première ligne qui c'est faite par les 2 listbox en mode selection unique, Donc ça marche bien, juste un réglage à faire, mais ce n'est pas le sujet, donc je ne l'ai pas fait.
  • La seconde ligne quand je passe en mode multi les 2 listbox, plus rien ne s'écrit même si je selectionne 1 seul item par listbox.

Demain je testerais les select case et les if.

Si d'ici là quelquechose t'inspire....

50test.xlsm (22.25 Ko)
Daumst a écrit :

Alors j'ai bricolé un fichier, qui grosso modo reprend ce que je cherche à faire. Il y aura en réalité 2 userform (2 pages en fait) et le bouton valider sera sur le 2ème userform.

Je n'ai pas le vocabulaire adéquate, je sais. ;o)

Un userform multipage (2), et on valide après avoir rempli le deuxième onglet en fait.

Effectivement ce n'est pas du tout pareil que 2 userform et on valide sur le deuxième.

Boooon !

Faut que je me remette de mes émotions...

Tu as épluché un peu mon lien ?

Une solution en pièce jointe.

A+

63test-vg.xlsm (24.64 Ko)

Merci.

Oui j'ai bien sûr lu ton lien, mais je n'aurais jamais trouvé : numLigne, i + 8, cela correspond à quoi ? Le +3 je vois, mais le +8 non.

Je vois l'utilité pour autre chose, en balancant une macro après pour changer les VRAI selon les colonnes. Mais ça je gère.

Par ailleur cela n'écrit pas la valeur qui à été selectionnée du coup. Pour la répartition dans les colonnes c'est parfait, c'est là qu'entre en jeu les If ?

Ou faire une boucle avec vbNewLine qui compterait les lignes selectionnées et reverrait les valeurs :

Ce code renvoie bien les valeurs dans une MsgBox, on peut l'utiliser dans ta boucle ?

Private Sub OKButton_Click()
      Dim Msg As String
      Dim i As Integer
      Msg = "You selected" & vbNewLine
      For i = 0 To ListBox1.ListCount - 1
          If ListBox1.Selected(i) Then
              Msg = Msg & ListBox1.List(i) & vbNewLine
          End If
      Next i
      MsgBox Msg
      Unload UserForm1
  End Sub

Les if testent si l'item (i) à été sélectionné.

Si oui +3 ou +8 renvoient à la bonne colonne en fonction de la Listbox (La listbox2 commence colonne 8)

J'ai renvoyé True pour le fun, si tu veux renvoyer une valeur tu fais comme dans le lien que je t'ai donné...

Pour le ListBox2 ça donne :

For i = 0 To ListBox2.ListCount - 1
    If ListBox2.Selected(i) = True Then .Cells(numLigne, i + 8) = ListBox2.List(i)
Next i

A+

Mais c'est bien sûr (pour la colonne 8)

Remplacer Vrai n'aurais as été un problème, mais je n'aurais pas trouvé la solution finale en remplacant True par ListBox2.List(i)

Je te remercie bien bas.

Rechercher des sujets similaires à "remplacer checkbox listbox"