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
58nouveau-projet.xlsm (76.13 Ko)

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 , par contre je n'arrive pas à déconcatener ces données dans les colonnes comme lors de l'ajout d'un nouveau contact (qui me génère d'ailleur un message d'erreur "cette cellule contient des données voulez vous les remplacer"). En fait la finalité est que je veux récupérer les données de ma listbox sous forme de colonne (1 sélection listbox = 1 colonne) et sans message d'erreur en ajout comme en modification de données.

'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
Rechercher des sujets similaires à "recuperer donnees dune listbox userform"