Afficher les selections multiple d'une Listbox dans une seule cellule
Bonjour à tous,
Nouvellement en stage en entreprise afin de cloturer mon master en qualité des produits de santé, une nouvelle tâche des plus ardues (pour moi) m'a été confiée.
On m'a chargé de réaliser un formulaire afin de simplifier le listing d'arrêt de commercialisation.
Grâce à de multiples tutoriels j'ai réussi à réaliser mon formulaire avec des boutons commandes me permettant de créer une nouvelle fiche, d'éditer une existante et un autre pour de sortir de mon formulaire. De ce côté là tout fonctionne très bien !
Le problème qui se présente est le suivant : On me demande d'ajouter à mon tableau la liste des services concernés par cet arrêt de commercialisation. Pour se faire j'ai créée une Listbox à sélection multiple contenant les noms de mes différents services via RawSources. Je voudrais que les services sélectionnés apparaissent dans une seule et même cellule de la colonne H et que l'intéraction avec mes boutons Nouvelle produit (command button 1) et Editer (commande button 2) soit possible.
Jusqu'à présent je n'ai réussi qu'a faire apparaitre les selections multiples dans LES dernières cases vides de ma colonne H et je suis bloqué. J'ai commencé VBA hier et beaucoup de choses me dépassent. Je ne sais pas si j'ai été clair dans ma demande.
Je souhaite que tous les services selectionnés aparraissent dans la meme cellule de la colonne H pour chaque produit.
Option Explicit
Dim Ws As Worksheet
'Pour le formulaire
Private Sub UserForm_Initialize()
Dim J As Long
Dim I As Integer
Set Ws = Sheets("Produits") 'Correspond au nom de votre onglet dans le fichier Excel
With Me.ComboBox1
For J = 2 To Ws.Range("A" & Rows.Count).End(xlUp).Row
.AddItem Ws.Range("A" & J)
Next J
End With
With Me.ComboBox2
For J = 2 To Ws.Range("B" & Rows.Count).End(xlUp).Row
.AddItem Ws.Range("B" & J)
Next J
End With
For I = 1 To 5
Me.Controls("TextBox" & I).Visible = True
Next I
End Sub
'Pour la liste d?roulante numéro d'arret de commercialisation
Private Sub ComboBox1_Change()
Dim Ligne As Long
Dim I As Integer
If Me.ComboBox1.ListIndex = -1 Then Exit Sub
Ligne = Me.ComboBox1.ListIndex + 2
ComboBox2 = Ws.Cells(Ligne, "B")
For I = 1 To 5
Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 2)
Next I
End Sub
'Pour le bouton Nouveau produit
Private Sub CommandButton1_Click()
Dim L As Integer
If MsgBox("Confirmez-vous l'insertion de ce nouveau produit?", vbYesNo, "Demande de confirmation d'ajout") = vbYes Then
L = Sheets("Produits").Range("a65536").End(xlUp).Row + 1 'Pour placer le nouvel enregistrement ? la premi?re ligne de tableau non vide
Range("A" & L).Value = ComboBox1
Range("B" & L).Value = ComboBox2
Range("C" & L).Value = TextBox1
Range("D" & L).Value = TextBox2
Range("E" & L).Value = TextBox3
Range("F" & L).Value = TextBox4
Range("G" & L).Value = TextBox5
End If
End Sub
'Pour le bouton Modifier
Private Sub CommandButton2_Click()
Dim Ligne As Long
Dim I As Integer
If MsgBox("Confirmez-vous la modification de ce produit ?", vbYesNo, "Demande de confirmation de modification") = vbYes Then
If Me.ComboBox1.ListIndex = -1 Then Exit Sub
Ligne = Me.ComboBox1.ListIndex + 2
Ws.Cells(Ligne, "B") = ComboBox2
For I = 1 To 5
If Me.Controls("TextBox" & I).Visible = True Then
Ws.Cells(Ligne, I + 2) = Me.Controls("TextBox" & I)
End If
Next I
End If
End Sub
'Pour le bouton Quitter
Private Sub CommandButton3_Click()
Unload Me
End Sub
Mon formulaire ressemble à ca pour le moment :
Je dois vraisemblablement utiliser mon command button 4 "OK" pour réaliser l'opération souhaitée (enfin je crois) mais malgré mes différentes recherches sur les forums je n'ai pas trouvé de topic me permettant de résoudre mon problème avec le peu de connaissance en VBA dont je dispose. Je pense être passé plusieurs fois devant la solution mais ma compréhension limité du langage VBA m'a empêché d'adapter les exemples vus à mon problème.
Mon tableau se présente comme ceci et l'objectif et de faire apparaitre chaque services concernés par l'arret dans la colonne H de la ligne correspondant à chaque produit.
Je vous remercie par avance de l'aide que vous pourrez m'apporter.
Cordialement,
Erwan.
Bonjour,
je ne vois pas dans le code la partie copie des sélections dans les cellules ?
Un exemple pour copier les sélections dans une seule cellule:
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) Then machaine = machaine & ListBox1.List(i) & vbLf
Next
machaine = Left(machaine, Len(machaine) - 1) ' pour supprimer le dernier vblf
Range("D9") = machaine
A+
Bonjour,
Il faut aussi restituer lors de la lecture
Private Sub UserForm_Initialize()
Dim J As Long
Dim i As Integer
Me.ListBox1.List = [tableau2].Value
Set Ws = Sheets("Produits") 'Correspond au nom de votre onglet dans le fichier Excel
With Me.ComboBox1
For J = 2 To Ws.Range("A" & Rows.Count).End(xlUp).Row
.AddItem Ws.Range("A" & J)
Next J
End With
With Me.ComboBox2
For J = 2 To Ws.Range("B" & Rows.Count).End(xlUp).Row
.AddItem Ws.Range("B" & J)
Next J
End With
For i = 1 To 5
Me.Controls("TextBox" & i).Visible = True
Next i
End Sub
'Pour la liste d?roulante numéro d'arret de commercialisation
Private Sub ComboBox1_Change()
Dim Ligne As Long
Dim i As Integer, temp
If Me.ComboBox1.ListIndex = -1 Then Exit Sub
Ligne = Me.ComboBox1.ListIndex + 2
ComboBox2 = Ws.Cells(Ligne, "B")
For i = 1 To 5
Me.Controls("TextBox" & i) = Ws.Cells(Ligne, i + 2)
Next i
'---
temp = Ws.Cells(Ligne, "h")
a = Split(temp, ",")
For i = 0 To Me.ListBox1.ListCount - 1: Me.ListBox1.Selected(i) = False: Next i
If UBound(a) >= 0 Then
For i = 0 To Me.ListBox1.ListCount - 1
If Not IsError(Application.Match(Me.ListBox1.List(i), a, 0)) Then
Me.ListBox1.Selected(i) = True
Else
Me.ListBox1.Selected(i) = False
End If
Next i
End If
End Sub
'Pour le bouton Modifier
Private Sub CommandButton2_Click()
Dim Ligne As Long
Dim i As Integer
Dim tmp
If MsgBox("Confirmez-vous la modification de ce produit ?", vbYesNo, "Demande de confirmation de modification") = vbYes Then
If Me.ComboBox1.ListIndex = -1 Then Exit Sub
Ligne = Me.ComboBox1.ListIndex + 2
Ws.Cells(Ligne, "B") = ComboBox2
For i = 1 To 5
If Me.Controls("TextBox" & i).Visible = True Then
Ws.Cells(Ligne, i + 2) = Me.Controls("TextBox" & i)
End If
Next i
'---
tmp = ""
For i = 0 To Me.ListBox1.ListCount - 1
If Me.ListBox1.Selected(i) = True Then
tmp = tmp & Me.ListBox1.List(i) & ","
End If
Next i
Ws.Cells(Ligne, "h") = tmp
End If
End Sub
Boisgontier
Merci beaucoup pour vos réponses ici aussi ! J'ai posté à plusieurs endroit et je n'avais pas activé les notifications par mail sur ce forum ! Ce soucis est résolu grâce à ta solution Jacques Boisgontier =D!