Récupérer les données dune listbox dans un userform
Bonsoir le forum,
Dans le but de pouvoir modifier mes saisies au travers d'un formulaire, je souhaiterais en sélectionnant le numéro de matricule (combobox1) retrouver les valeurs de cette ligne dans mon useform pour ensuite pouvoir les modifier. tout va sauf pour les listbox ou
je bloque et n'arrive pas à récupérer les valeurs précédemment rentrées pour ensuite pouvoir les modifier .
pouvez vous m'aider ?
'Pour la liste déroulante Code client récupère les infos
Private Sub ComboBox1_Change()
Dim Ligne As Long
Dim i As Integer
If Me.ComboBox1.ListIndex = -1 Then Exit Sub
Ligne = Me.ComboBox1.ListIndex + 3
For i = 1 To 8
Me.Controls("TextBox" & i) = Ws.Cells(Ligne, i + 1)
Next i
End Sub
'ajouter le Nouvel intervenant à ma bdd
Private Sub CommandButton1_Click()
Dim Ws As Worksheet
Dim L As Integer
Dim i As Integer
Dim mobilite As String
Dim domaine As String
Dim lastRow As Long
If MsgBox("Confirmez-vous l'insertion de ce nouveau contact ?", vbYesNo, "Demande de confirmation d'ajout") = vbYes Then
L = Sheets("bdd").Range("A" & Rows.Count).End(xlUp).Row + 1 'Pour placer le nouvel enregistrement ? la premi?re ligne de tableau non vide
Range("A" & L).Value = CDbl(ComboBox1)
Range("B" & L).Value = TextBox1
Range("C" & L).Value = TextBox2
Range("D" & L).Value = TextBox3
Range("E" & L).Value = TextBox4
Range("F" & L).Value = TextBox5
Range("G" & L).Value = TextBox6
Range("H" & L).Value = TextBox7
Range("I" & L).Value = TextBox8
'test'
Set Ws = Worksheets("bdd")
For i = 0 To Me.ListBox1.ListCount - 1
If Me.ListBox1.Selected(i) Then
domaine = domaine & Me.ListBox1.List(i) & ";"
End If
Next
Ws.Range("j" & L).Value = domaine
'aide forum pour placer les choix multiselect des zone de liste dans colonne différente
Ws.Cells(Application.Rows.Count, "j").End(xlUp).TextToColumns Destination:=Ws.Cells(Application.Rows.Count, "j").End(xlUp).Offset(0, 2), _
DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(Array(1, 1), Array(2, 1), Array(3, 1)), TrailingMinusNumbers:=True
For i = 0 To Me.ListBox2.ListCount - 1
If Me.ListBox2.Selected(i) Then
mobilite = mobilite & Me.ListBox2.List(i) & ";"
End If
Next
Ws.Range("K" & L).Value = mobilite
'aide forum pour placer les choix multiselect des zone de liste dans colonne différente
Ws.Cells(Application.Rows.Count, "k").End(xlUp).TextToColumns Destination:=Ws.Cells(Application.Rows.Count, "k").End(xlUp).Offset(0, 4), _
DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(Array(1, 1), Array(2, 1), Array(3, 1))
'test'
Unload Me
UserForm1.Show
Else
'rien
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 contact ?", vbYesNo, "Demande de confirmation de modification") = vbYes Then
If Me.ComboBox1.ListIndex = -1 Then Exit Sub
Ligne = Me.ComboBox1.ListIndex + 3
For i = 1 To 8
If Me.Controls("TextBox" & i).Visible = True Then
Ws.Cells(Ligne, i + 1) = Me.Controls("TextBox" & i)
End If
Next i
End If
Unload Me
UserForm1.Show
End Sub
Bonjour,
Comme tu concatènes les domaines de compétences :
If Me.ListBox1.Selected(i) Then
domaine = domaine & Me.ListBox1.List(i) & ";"
End If
le plus simple à mon avis est de récupérer avec un Split() et sélectionner ensuite les différents éléments.
Je ne suis pas sûr que d'utiliser plusieurs colonnes soit très ergonomique si tout passe par le formulaire, ça alourdi la base inutilement.
Ici, j'utilise une Sub commune au deux ListBox afin de ne pas réécrire deux fois le même code.
Remplace la procédure évènementielle "Private Sub ComboBox1_Change()" par tout le code ci-dessous :
Private Sub ComboBox1_Change()
Dim Ligne As Long
Dim I As Integer
Dim J As Integer
Dim Tbl
If Me.ComboBox1.ListIndex = -1 Then Exit Sub
Ligne = Me.ComboBox1.ListIndex + 3
For I = 1 To 8
Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 1)
Next I
SelectListBox ListBox1, Ws.Cells(Ligne, 10)
SelectListBox ListBox2, Ws.Cells(Ligne, 11)
End Sub
Sub SelectListBox(Lst As MSForms.ListBox, Chaine As String)
Dim Tbl
Dim I As Integer
Dim J As Integer
'dé-sélectionne tout
For I = 0 To Lst.ListCount - 1: Lst.Selected(I) = False: Next I
'splite sur la chaine
Tbl = Split(Chaine, ";")
'boucle sur le tableau et la ListBox afin de sélectionner les choix
For I = 0 To UBound(Tbl) - 1
For J = 0 To Lst.ListCount - 1
If Lst.List(J) = Tbl(I) Then Lst.Selected(J) = True
Next J
Next I
End Sub
Bonjour theze,
Un grand merci pour ton retour. Je vais tester tout ça . J ai besoin d utiliser plusieurs colonne car je devrais traiter les données de manière isolé par la suite dans le cadre d une autre procédure . (J ai d ailleurs un message d erreur qui apparaît du genre "les cellules contiennent déjà des données mais ça je verrais plus tard). Je reviens vers toi le plus rapidement possible le temps pour moi d appréhender tout ça ( à mon niveau une ligne de code = pluisieurs heure de travail, mais grâce à des personnes comme toi ça avance
À très très vite
merveilleux !!!!!!!!!!
rebonjour Theze,
j'ai modifié mon code modification. Elle se fait bien pour les colonnes 10 et 11
'Pour le bouton Modifier
Private Sub CommandButton2_Click()
Dim Ligne As Long
Dim I As Integer
Dim domaine As String
Dim L As Integer
Dim mobilite As String
If MsgBox("Confirmez-vous la modification de ce contact ?", vbYesNo, "Demande de confirmation de modification") = vbYes Then
If Me.ComboBox1.ListIndex = -1 Then Exit Sub
Ligne = Me.ComboBox1.ListIndex + 3
For I = 1 To 8
If Me.Controls("TextBox" & I).Visible = True Then
Ws.Cells(Ligne, I + 1) = Me.Controls("TextBox" & I)
End If
Next I
For I = 0 To Me.ListBox1.ListCount - 1
If Me.ListBox1.Selected(I) = True Then
domaine = domaine & Me.ListBox1.List(I) & ";"
End If
Next
Ws.Cells(Ligne, 10).Value = domaine
Ws.Cells(Ligne, 10).End(xlUp).TextToColumns Destination:=Ws.Cells(Ligne, 10).End(xlUp).Offset(0, 2), _
DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(Array(1, 1), Array(2, 1), Array(3, 1)), TrailingMinusNumbers:=True
For I = 0 To Me.ListBox2.ListCount - 1
If Me.ListBox2.Selected(I) = True Then
mobilite = mobilite & Me.ListBox2.List(I) & ";"
End If
Next
Ws.Cells(Ligne, 11).Value = mobilite
Ws.Cells(Application.Rows.Count, "k").End(xlUp).TextToColumns Destination:=Ws.Cells(Application.Rows.Count, "k").End(xlUp).Offset(0, 4), _
DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(Array(1, 1), Array(2, 1), Array(3, 1))
End If
Unload Me
UserForm1.Show
End Sub
Bonjour,
Donc si je comprend bien, tu veux stocker les choix dans une colonne avec concaténation et dispatcher dans les autres !
Ci-dessous, le code pour ajouter un nouvel enregistrement. Testes et reviens me dire ce qu'il faut corriger :
'ajouter le Nouvel intervenant à ma bdd
Private Sub CommandButton1_Click()
Dim Ws As Worksheet
Dim L As Integer
Dim I As Integer
Dim mobilite As String
Dim domaine As String
Dim Tbl
If MsgBox("Confirmez-vous l'insertion de ce nouveau contact ?", vbYesNo, "Demande de confirmation d'ajout") = vbNo Then Exit Sub
L = Sheets("bdd").Range("A" & Rows.Count).End(xlUp).Row + 1 'Pour placer le nouvel enregistrement ? la premi?re ligne de tableau non vide
Range("A" & L).Value = CDbl(ComboBox1)
Range("B" & L).Value = TextBox1
Range("C" & L).Value = TextBox2
Range("D" & L).Value = TextBox3
Range("E" & L).Value = TextBox4
Range("F" & L).Value = TextBox5
Range("G" & L).Value = TextBox6
Range("H" & L).Value = TextBox7
Range("I" & L).Value = TextBox8
Set Ws = Worksheets("bdd")
'si au minimum un choix a été fait dans la liste...
If Me.ListBox1.ListIndex = -1 Then MsgBox "Faire un choix dans la liste des domaines de compétences !": Exit Sub
'récup des choix
For I = 0 To Me.ListBox1.ListCount - 1
If Me.ListBox1.Selected(I) Then domaine = domaine & Me.ListBox1.List(I) & ";"
Next
'splite dans un tableau...
Tbl = Split(domaine, ";")
'et dispatche dans les colonnes
With Ws
.Range("j" & L).Value = domaine
.Range(.Cells(L, 12), .Cells(L, 12 + UBound(Tbl))).Value = Tbl
End With
'idem...
If Me.ListBox2.ListIndex = -1 Then MsgBox "Faire un choix dans la liste des mobilités !": Exit Sub
For I = 0 To Me.ListBox2.ListCount - 1
If Me.ListBox2.Selected(I) Then mobilite = mobilite & Me.ListBox2.List(I) & ";"
Next I
Tbl = Split(mobilite, ";")
With Ws
.Range("K" & L).Value = mobilite
.Range(.Cells(L, 15), .Cells(L, 15 + UBound(Tbl))).Value = Tbl
End With
Unload Me
UserForm1.Show
End Sub
Bonjour,
Alors tout d'abord un grand grand grand merci pour ta didactique. Chaque message est un cours passionnant
Oui ça fonctionne et ça simplifie le code sans message d'erreur ...... ça c'est fait.
If Me.ListBox1.ListIndex = -1 Then MsgBox "Faire un choix dans la liste des domaines de compétences !": Exit Sub
ce message box n'apparait pas mais pas d'importance.
J'ai tenté de reprendre ce code pour mon "sub" modifier la ligne, mais bien évidemment ça bloque .... je suppose que avant de relancer la procédure que tu as écrite pour chaque listbox, il faut au préalable effacer les données inscrite dans les cellule de destination ???
'Pour le bouton Modifier
Private Sub CommandButton2_Click()
Dim Ligne As Long
Dim I As Integer
Dim domaine As String
Dim L As Integer
Dim mobilite As String
Dim Tbl
If MsgBox("Confirmez-vous la modification de ce contact ?", vbYesNo, "Demande de confirmation de modification") = vbYes Then
If Me.ComboBox1.ListIndex = -1 Then Exit Sub
Ligne = Me.ComboBox1.ListIndex + 3
For I = 1 To 8
If Me.Controls("TextBox" & I).Visible = True Then
Ws.Cells(Ligne, I + 1) = Me.Controls("TextBox" & I)
End If
Next I
End If
Unload Me
UserForm1.Show
End Sub
Bonjour,
Comme je te l'ai proposé dans un post plus haut, une procédure commune à l'ajout d'un nouveau contact et pour la modification d'un contact "Sub Inscrire()".
Remplaces les Sub "CommandButton1_Click()" et "CommandButton2_Click()" par tout le code ci-dessous :
'ajouter le Nouvel intervenant à ma bdd
Private Sub CommandButton1_Click()
Dim L As Integer
If MsgBox("Confirmez-vous l'insertion de ce nouveau contact ?", vbYesNo, "Demande de confirmation d'ajout") = vbNo Then Exit Sub
L = Sheets("bdd").Range("A" & Rows.Count).End(xlUp).Row + 1 'Pour placer le nouvel enregistrement ? la premi?re ligne de tableau non vide
Inscrire L
End Sub
'Pour le bouton Modifier
Private Sub CommandButton2_Click()
Dim Ws As Worksheet
Dim L As Long
Dim C As Integer
If MsgBox("Confirmez-vous la modification de ce contact ?", vbYesNo, "Demande de confirmation de modification") = vbNo Then Exit Sub
If Me.ComboBox1.ListIndex = -1 Then Exit Sub
L = Me.ComboBox1.ListIndex + 3
Set Ws = Worksheets("bdd")
With Ws
C = .Cells(L, .Columns.Count).End(xlToLeft).Column
.Range(.Cells(L, 1), .Cells(L, C)).Value = ""
End With
Inscrire L
End Sub
Sub Inscrire(L As Long)
Dim Ws As Worksheet
Dim I As Integer
Dim mobilite As String
Dim domaine As String
Dim Tbl
Range("A" & L).Value = CDbl(ComboBox1)
Range("B" & L).Value = TextBox1
Range("C" & L).Value = TextBox2
Range("D" & L).Value = TextBox3
Range("E" & L).Value = TextBox4
Range("F" & L).Value = TextBox5
Range("G" & L).Value = TextBox6
Range("H" & L).Value = TextBox7
Range("I" & L).Value = TextBox8
Set Ws = Worksheets("bdd")
'si au minimum un choix a été fait dans la liste...
If Me.ListBox1.ListIndex = 0 Then MsgBox "Faire un choix dans la liste des domaines de compétences !": Exit Sub
'récup des choix
For I = 0 To Me.ListBox1.ListCount - 1
If Me.ListBox1.Selected(I) Then domaine = domaine & Me.ListBox1.List(I) & ";"
Next
'splite dans un tableau...
Tbl = Split(domaine, ";")
'et dispatche dans les colonnes
With Ws
.Range("j" & L).Value = domaine
.Range(.Cells(L, 12), .Cells(L, 12 + UBound(Tbl))).Value = Tbl
End With
'idem...
If Me.ListBox2.ListIndex = 0 Then MsgBox "Faire un choix dans la liste des mobilités !": Exit Sub
For I = 0 To Me.ListBox2.ListCount - 1
If Me.ListBox2.Selected(I) Then mobilite = mobilite & Me.ListBox2.List(I) & ";"
Next I
Tbl = Split(mobilite, ";")
With Ws
.Range("K" & L).Value = mobilite
.Range(.Cells(L, 15), .Cells(L, 15 + UBound(Tbl))).Value = Tbl
End With
Unload Me
UserForm1.Show
End Sub
A cette Sub, il suffit de lui passer comme argument le numéro de ligne et pour la modification, de vide la ligne juste avant, ce qui se fait ici :
With Ws
C = .Cells(L, .Columns.Count).End(xlToLeft).Column
.Range(.Cells(L, 1), .Cells(L, C)).Value = ""
End With
Pour les messages de contrôle des ListBox, c'est la valeur 0 et non -1 !
Bonjour,
Merci pour le retour je fais ça dès que possible et te dis . Merci. Excellente journée
Rebonjour theze,
bon j'ai appliqué et ça ne fonctionne pas je cherche mais je patauge un peu .... J'ai modifié le
Dim L As Integer
par
Dim L As long
dans
Private Sub CommandButton1_Click()
j'ai fait une erreur à la base comme tu l'as d'ailleurs fait remarquer sur l'incrémentation de la première ligne de ma base de données qui ne doit pas être non vide .... mais vide
L = Sheets("bdd").Range("A" & Rows.Count).End(xlUp).Row + 1 'Pour placer le nouvel enregistrement ? la premi?re ligne de tableau non vide
????
Ensuite j'ai des problèmes avec l'ajout des données quand bizaremment les 2 premiers items de ma listbox1 sont sélectionnés. Cela m'ouvre automatiquement les msgbox installé pour la modification. Idem qd je sélectionne le premier item de la listbox2.
Enfin, pour modifier le données d'une seule list box je dois modifier les 2 et cela me génère des entrées supplémentaires dans ma bdd.
merci de ton aide et ta patience
Bonjour,
j'ai fait une erreur à la base comme tu l'as d'ailleurs fait remarquer sur l'incrémentation de la première ligne de ma base de données qui ne doit pas être non vide .... mais vide
Désolé, je ne saisi pas ce que tu veux dire !
Ensuite j'ai des problèmes avec l'ajout des données quand bizaremment les 2 premiers items de ma listbox1 sont sélectionnés. Cela m'ouvre automatiquement les msgbox installé pour la modification. Idem qd je sélectionne le premier item de la listbox2.
Là, il faut que je regarde d'où vient le couac !
Enfin, pour modifier le données d'une seule list box je dois modifier les 2 et cela me génère des entrées supplémentaires dans ma bdd.
Je ne comprend pas, quand tu choisis de modifier un enregistrement, au préalable tu as chargé les valeurs de cet enregistrement dans le formulaire en cliquant dans la ComboBox et donc, les champs ne sont pas vides si ils étaient renseignés auparavant, tu n'as donc pas à re-saisir tous les champs puisqu'ils contiennent déjà des valeurs, il te faut juste modifier les champs concernés et les valeurs qui ne sont pas modifiées seront à nouveau inscrites dans la base !
Bonjour,
Pour le premier point, il m est impossible de démarrer mon formulaire avec une bdd vierge. Le formulaire ne se lance "message d erreur". Il ne se lance que si A3 est renseigné. (Ex.:matricule =1).
Pour le reste je pense que le troisième couac est du au deuxième.
Merci et excellente journée à toi
Re,
Le mieux alors est de ne pas vider les champs, les valeurs inscrites seront remplacées le cas échéant. Il en est de même pour les messages, car dans les ListBox, si les valeurs sont surlignées, elles ne sont pas pour autant prises en compte dans la boucle si il n'y a pas eu de clic sur au moins l'un d'entre eux enfin, c'est ce que je pense et encore, c'est pas toujours vrai, je me pencherai dessus pour en connaître la raison.
Indentes ton code, il est plus simple à lire :
'ajouter le Nouvel intervenant à ma bdd
Private Sub CommandButton1_Click()
Dim L As Long
If MsgBox("Confirmez-vous l'insertion de ce nouveau contact ?", vbYesNo, "Demande de confirmation d'ajout") = vbNo Then Exit Sub
L = Sheets("bdd").Range("A" & Rows.Count).End(xlUp).Row + 1 'Pour placer le nouvel enregistrement ? la premi?re ligne de tableau non vide
Inscrire L
End Sub
'Pour le bouton Modifier
Private Sub CommandButton2_Click()
Dim Ws As Worksheet
Dim L As Long
Dim C As Integer
If MsgBox("Confirmez-vous la modification de ce contact ?", vbYesNo, "Demande de confirmation de modification") = vbNo Then Exit Sub
If Me.ComboBox1.ListIndex = -1 Then Exit Sub
L = Me.ComboBox1.ListIndex + 3
Inscrire L
End Sub
Sub Inscrire(L As Long)
Dim Ws As Worksheet
Dim I As Integer
Dim mobilite As String
Dim domaine As String
Dim Tbl
Range("A" & L).Value = CDbl(ComboBox1)
Range("B" & L).Value = TextBox1
Range("C" & L).Value = TextBox2
Range("D" & L).Value = TextBox3
Range("E" & L).Value = TextBox4
Range("F" & L).Value = TextBox5
Range("G" & L).Value = TextBox6
Range("H" & L).Value = TextBox7
Range("I" & L).Value = TextBox8
Set Ws = Worksheets("bdd")
'récup des choix
For I = 0 To Me.ListBox1.ListCount - 1
If Me.ListBox1.Selected(I) Then domaine = domaine & Me.ListBox1.List(I) & ";"
Next
'splite dans un tableau...
Tbl = Split(domaine, ";")
'et dispatche dans les colonnes
With Ws
.Range("j" & L).Value = domaine
.Range(.Cells(L, 12), .Cells(L, 12 + UBound(Tbl))).Value = Tbl
End With
For I = 0 To Me.ListBox2.ListCount - 1
If Me.ListBox2.Selected(I) Then mobilite = mobilite & Me.ListBox2.List(I) & ";"
Next I
Tbl = Split(mobilite, ";")
With Ws
.Range("K" & L).Value = mobilite
.Range(.Cells(L, 15), .Cells(L, 15 + UBound(Tbl))).Value = Tbl
End With
Unload Me
UserForm1.Show
End Sub