Liste déroulante dans userform

Résolu/Fermé
Looping38 Messages postés 92 Date d'inscription samedi 22 octobre 2016 Statut Membre Dernière intervention 20 juillet 2020 - 31 mai 2018 à 17:44
 yoda - 5 juin 2018 à 18:07
Bonjour à tous et à toutes.
J'en reviens une fois de plus vers vous pour débloquer une situation.
J'ai fait des recherches sur la toile pour utiliser une liste déroulante dans un userform.
J'ai trouvé ceci :


Option Explicit
Dim Ws As Worksheet


'Pour le formulaire
Private Sub UserForm4_Initialize()
Dim J As Long
Dim I As Integer

ComboBox2.ColumnCount = 1

'Pour la liste d?roulante Civilit?
ComboBox2.List() = Array("", "M.", "Mme", "Mlle")
'Set Ws = Sheets("Liste clients") 'Correspond au nom de votre onglet dans le fichier Excel
'With Me.ComboBox1
' For J = 2 To Sheets("Liste clients").Range("C" & Rows.Count).End(xlUp).Row
' .AddItem Sheets("Liste clients").Range("C" & J)
' Next J
'End With
For I = 1 To 38
Me.Controls("TextBox" & I).Visible = True
Next I
End Sub
'Pour la liste d?roulante Code client
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 = Sheets("Liste clients").Cells(Ligne, "A")
For I = 1 To 38
Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 2)
Next I
End Sub



'Pour le bouton Nouveau contact
Private Sub CommandButton1_Click()
Dim L As Integer
If MsgBox("Confirmez-vous l'insertion de ce nouveau contact ?", vbYesNo, "Demande de confirmation d'ajout") = vbYes Then
L = Sheets("Liste clients").Range("a65536").End(xlUp).Row + 1 'Pour placer le nouvel enregistrement ? la premi?re ligne de tableau non vide
Range("A" & L).Value = ComboBox2
Range("B" & L).Value = TextBox_Prenom
Range("C" & L).Value = ComboBox1
Range("D" & L).Value = TextBox_Siret
Range("E" & L).Value = TextBox_APE
Range("F" & L).Value = TextBox_Num_SS
Range("G" & L).Value = TextBox_Raison_Sociale
Range("H" & L).Value = TextBox_Adresse
Range("I" & L).Value = TextBox_CP
Range("J" & L).Value = TextBox_Ville
Range("K" & L).Value = TextBox_Prenom
Range("L" & L).Value = ComboBox2
Range("M" & L).Value = TextBox_DDN
Range("N" & L).Value = TextBox_Prenom_cjt
Range("O" & L).Value = TextBox_Nom_Cjt
Range("P" & L).Value = TextBox_DDN_Cjt
Range("Q" & L).Value = TextBox_Prenom_enf1
Range("R" & L).Value = TextBox_Nom_enf1
Range("S" & L).Value = TextBox_DDN_Enf1
Range("T" & L).Value = TextBox_Prenom_enf2
Range("U" & L).Value = TextBox_Nom_enf2
Range("V" & L).Value = TextBox_DDN_Enf1
Range("W" & L).Value = TextBox_prenom_enf3
Range("X" & L).Value = TextBox_Nom_enf3
Range("Y" & L).Value = TextBox_DDN_Enf1
Range("Z" & L).Value = TextBox_Prenom_enf4
Range("AA" & L).Value = TextBox_nom_enf4
Range("AB" & L).Value = TextBox_DDN_Enf4
Range("AC" & L).Value = TextBox_Prenom_enf4
Range("AD" & L).Value = TextBox_Nom_enf5
Range("AE" & L).Value = TextBox_DDN_Enf5
Range("AF" & L).Value = ComboBox3
Range("AG" & L).Value = TextBox_Adresse
Range("AH" & L).Value = TextBox_CP
Range("AI" & L).Value = TextBox_Ville
Range("AJ" & L).Value = TextBox_Profession
Range("AK" & L).Value = TextBox_Statut
Range("AL" & L).Value = TextBox_Remu
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 + 2
Ws.Cells(Ligne, "B") = ComboBox2
For I = 1 To 38
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


Mais j'ai un plantage à la ligne
Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 2)

D'autre part, la liste déroulante de la combobox 2 ne fonctionne pas...
3 heures que je cherche.

Si quelqu'un pouvait m'aider...
Je joins un extrait du fichier

https://www.cjoint.com/c/HEFpPQwiQhM

Cordialement,
Martin

1 réponse

Bonjour

D'une part, ta boucle pour accéder aux textbox ne marche pas parce que leur nom n'est pas de la forme TextBox1, TextBox2, ...,donc tu ne peux pas utiliser Me.Controls("TextBox" & I)
Il faut soit utiliser le nom exact (ex: TextBox_Prenom.Text="QuelqueChose"), soit trouver une autre astuce pour indexer les textbox.
D'autre part, ton tableau a bien 38 colonnes, mais ton Userform4 a 30 textbox et 3 combobox, alors...

Essaye déjà de remédier à ça, pour la suite on verra

A+
0
Looping38 Messages postés 92 Date d'inscription samedi 22 octobre 2016 Statut Membre Dernière intervention 20 juillet 2020 1
1 juin 2018 à 09:34
Bonjour Yoda et merci de ton intervention.
J'ai fait les modifs de noms de textbox. J'ai toujours l'erreur de type "variable objet ou variable de bloc with" non définie" lorsque j'ouvre la liste déroulante Nom :
Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 2) )
.
L'erreur peut-elle venir du fait que le bout de VBA devait utiliser une liste déroulant alphanumérique (N° de client), alors que je souhaite faire appel au nom du client?
D'autre part, j'ai toujours le problème de liste prédéfinie (M, Mme, Mlle).
encore merci de ton aide.
Le fichier modifié
https://www.cjoint.com/c/HFbhDEPKhZM
0
Bonjour,

Excuses pour le retard.

Il y a encore des erreurs dans les noms des objets TextBox et ComboBox

Je remets ta liste dans l'ordre, tu verra toi même les erreurs
Il faut que la numerotation des TextBox se suive (sans trou, ex. il manque le 3, on saute de 31 à 36)
Il ne peut pas y avoir deux noms identiques (2 fois combobox2)

Range("C" & L).Value = ComboBox1 ' Nom
Range("A" & L).Value = ComboBox2 'civilités
Range("L" & L).Value = ComboBox2 ' Nom (Masqué derière la Combobox1)
Range("AF" & L).Value = ComboBox3 ' Situation familiale

Range("B" & L).Value = TextBox2 ' Prénom
Range("D" & L).Value = TextBox4 ' Siret
Range("E" & L).Value = TextBox5 'APE
Range("F" & L).Value = TextBox6 ' N° SS
Range("G" & L).Value = TextBox7 ' Raison sociale
Range("H" & L).Value = TextBox8 'Adresse
Range("AG" & L).Value = TextBox8 ' Adresse
Range("I" & L).Value = TextBox9 ' Code Postal
Range("AH" & L).Value = TextBox9 ' Code postal
Range("J" & L).Value = TextBox10 ' Ville
Range("AI" & L).Value = TextBox10 ' Ville
Range("K" & L).Value = TextBox11 ' Prénom (masqué derière la Textbox2)
Range("M" & L).Value = TextBox13 ' Date de naissance
Range("N" & L).Value = TextBox14 ' Prénom conjoint
Range("O" & L).Value = TextBox15 ' Nom conjoint
Range("P" & L).Value = TextBox16 ' DDN Conjoint
Range("Q" & L).Value = TextBox17 ' Prénom enf 1
Range("R" & L).Value = TextBox18 ' Nom enf 1
Range("S" & L).Value = TextBox19 ' DDN enf 1
Range("T" & L).Value = TextBox20 ' Prénom enf 2
Range("U" & L).Value = TextBox21 ' Nom enf 2
Range("V" & L).Value = TextBox22 ' DDN enf 2
Range("W" & L).Value = TextBox23 ' Prénom enf 3
Range("X" & L).Value = TextBox24 ' Nom enf 3
Range("Y" & L).Value = TextBox25 ' DDN enf 3
Range("Z" & L).Value = TextBox26 ' Prénom enf 4
Range("AA" & L).Value = TextBox27 ' Nom enf 4
Range("AB" & L).Value = TextBox28 ' DDN enf 4
Range("AC" & L).Value = TextBox29 ' Prénom enf 5
Range("AD" & L).Value = TextBox30 ' Nom enf 5
Range("AE" & L).Value = TextBox31 ' DDN enf 5
Range("AJ" & L).Value = TextBox36 ' Profession
Range("AK" & L).Value = TextBox37 ' Statut
Range("AL" & L).Value = TextBox38 ' Rémunération

Il faut initialiser Ws
Private Sub ComboBox1_Change()
Dim Ligne As Long
Dim I As Integer
Set Ws = Sheets("Liste Clients")
'
'ect...
'


Corrige ton code
A+
0
Looping38 Messages postés 92 Date d'inscription samedi 22 octobre 2016 Statut Membre Dernière intervention 20 juillet 2020 1
1 juin 2018 à 23:58
Bonsoir Yoda.
J'ai fait ce que tu m'a dis.
Ca plante toujours....

N'arrivant pas à faire fonctionner la liste déroulante des "Civilités" (combobox2), si je la remplace par une textBox, je dois commencer à 1, ou je peux lui donner la textBox37?
Si je dois commencer à 1, alors je dois renommer toutes les textbox.
La saisi d'un nouveau contact marche, à condition de ne pas saisir de nom commençant par la même lettre qu'un existant dans la liste, sinon plantage.
J'ai pas pu testé les autres boutons.
Merci d'avance de ta contribution
Voila le fichier MAJ.
https://www.cjoint.com/c/HFbv5yaHlWM
0
c'est déjà mieux
Juste une petite correction dans Sub ComboBox1_Change(), tu dois faire stopper ta boucle à 36 puisqu'il y a 36 textbox

    For i = 1 To 36
Me.Controls("TextBox" & i) = Ws.Cells(Ligne, i + 2)
Next i


En choisissant un nom dans combobox1 tu remplis toutes les textbox
Tu as une inversion entre civilité et prénom

pour la Sub CommandButton2_Click() tu dois faire stopper ta boucle à 36

        For i = 1 To 36
If Me.Controls("TextBox" & i).Visible = True Then
Ws.Cells(Ligne, i + 2) = Me.Controls("TextBox" & i)
End If
Next i


par contre les infos ne se mettent pas dans les bonnes cellules, vérifie bien les index de ligne et colonne

pour entrer un nouveau contact, commence par effacer toutes les textbox (c'est là que tu dois initialiser la combobox2 civilité) et sert toi du bouton modifier contact pour enregistrer les données à la fin du tableau.


voilà je te laisse travailler un peu
A+
0
Looping38 Messages postés 92 Date d'inscription samedi 22 octobre 2016 Statut Membre Dernière intervention 20 juillet 2020 1
2 juin 2018 à 09:37
Bonjour Yoda.
J'ai travaillé sur le fichier et apporté quelques modifs.
Ça marche plutôt bien sauf pour le bouton Modifier. En effet, lorsque j'apporte une modification à un client, cela ajoute un nouveau client sans en reprendre le nom.
Le fichier.
Merci.
https://www.cjoint.com/c/HFchLxchxCM
0