Menibelus
XLDnaute Nouveau
Bonjour,
J'essai de mettre en place une listbox en place avec un combox de recherche et j'aurai besoin de votre aide car je suis un peu perdu, ma list box ne se rempli pas et je ne trouve pas pourquoi ?
Je souhaite que ma listbox1 soit rempli avec les valeurs de mon tableau C1:I400 de la feuille Cfg
Ci-dessous mon code ou plutôt celui que j'ai adapté d'une exemple trouvé sur le web.
J'essai de mettre en place une listbox en place avec un combox de recherche et j'aurai besoin de votre aide car je suis un peu perdu, ma list box ne se rempli pas et je ne trouve pas pourquoi ?
Je souhaite que ma listbox1 soit rempli avec les valeurs de mon tableau C1:I400 de la feuille Cfg
Ci-dessous mon code ou plutôt celui que j'ai adapté d'une exemple trouvé sur le web.
VB:
Private O As Worksheet 'déclare la variable O (Onglet)
Private TC As Variant 'déclare la variable TC (Tableau de Cellules)
Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Dim I As Integer 'déclare la variable I (Incrément)
Dim D As Object 'déclare la variable J (incrément)
Dim T As Variant 'déclare la variable T (Tableau)
Me.ListBox1.ColumnCount = 5 'définit le nombre de colonnes de la ListBox1
Me.ListBox1.ColumnWidths = "0;60;50;40;30;" 'définit la largeur des tois premières colonne de la ListBox1 (zéro signifie que la première sera cachée)
Set O = Sheets(DATASOURCEFEUIL) 'définit l'onglet O
TC = O.Range("C1").CurrentRegion 'définit la tableau de cellule TC
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TC, 1) 'boucle sur toutes les lignes du tableau TC (en partant de la 2ème ligne)
If TC(I, 1) <> "" Then D(TC(I, 1)) = "" 'si la valeur ligne I colonne 7 de TC n'est pas nulle, alimente le dictionnaire D
Next I 'prochaine ligne de la boucle
T = D.keys 'récupère dans le tableau D les éléments du dictionaire D sans doublon
Call tri(T, LBound(T), UBound(T)) 'lance la procédure de tri alphabétique du tableau D
Me.Cmd_search.List = T 'alimente la ComboBox1 d'une liste triée et sans doublon
End Sub
Private Sub Cmd_search_Change() 'au changement dans la ComboBox1
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)
With Me.ListBox1 'prend en compte la ListBox1
.Clear 'efface le contenu
For I = 1 To UBound(TC, 1) 'boucle 1 : sur toutes les lignes du tableau TC (en partant de la 1ère ligne)
If TC(I, 1) = Me.Cmd_search.Value Then 'condition : si la valeur ligne I colonne 1 de TC est égale à la valeur de la ComboBox1
.AddItem I 'ajoute le numéro de ligne dans la colonne 0 cachée
For J = 1 To 9 'boucle 2 : sur les 9 autres colonnes de la ListBox
.Column(J, .ListCount - 1) = TC(I, J) 'ajoute les données du tableau
Next J 'prochaine colonne de la boucle 2
End If 'fin de la conditon
Next I 'prochaine ligne de la boucle 1
If .ListCount = 1 Then 'condition : si la ListBox1 ne contient qu'un seul élément
Me.TextBox_name.Value = .Column(1, 0) 'affiche le modèle dans la Textbox1
Me.ComboBox_fonct.Value = .Column(2, 0) 'affiche l'année dans la TextBox2
Else 'sinom
Me.TextBox_name.Value = "" 'efface la Textbox1
Me.ComboBox_fonct.Value = "" 'efface la Textbox2
End If 'fin de la condition
End With 'fin de la prise en compte de la ListBox1
End Sub
Private Sub TextBox_name_Click() 'au clic dans la ListBox1
With Me.ListBox1 'prend en compte la ListBox1
Me.TextBox_name.Value = .Column(1, .ListIndex) 'affiche le modèle de l'élément sélectionné dans la Textbox1
Me.ComboBox_fonct.Value = .Column(2, .ListIndex) 'affiche le modèle de l'élément sélectionné dans la Textbox2
End With 'fin de la prise en compte de la ListBox1
'si tu dois sélectionner ou récupérer une donnée le numéro de ligne de l'élément sélectionné est stocké dans la ligne 0 de lá ListBox1
'tu peux, par exemple, utiliser une variable LI : Li = Me.ListBox1(0, Me.ListBox.ListIndex)
End Sub
Sub tri(a, gauc, droi) ' Quick sort, tiré du site de Jacques BOISGONTIER : http://boisgontierjacques.free.fr/pages_site/Dictionnaire.htm
ref = a((gauc + droi) \ 2)
g = gauc: D = droi
Do
Do While a(g) < ref: g = g + 1: Loop
Do While ref < a(D): D = D - 1: Loop
If g <= D Then
temp = a(g): a(g) = a(D): a(D) = temp
g = g + 1: D = D - 1
End If
Loop While g <= D
If g < droi Then Call tri(a, g, droi)
If gauc < D Then Call tri(a, gauc, D)
End Sub
Private Sub CommandButton_enregister_Click()
If TextBox_name.Value = "" And ComboBox_fonct = "" And TextBox_d_deb = "" Then
Dd = MsgBox("Merci de renseigner" & Chr(10) & Chr(10) & "- Nom," & Chr(10) & "- Prénom," & Chr(10) & "- Fonction", 48, "Erreur")
Else 'Si Ok
ligne_insertion = Sheets(DATASOURCEFEUIL).Range("D65000").End(xlUp).Row + 1
Sheets(DATASOURCEFEUIL).Cells(ligne_insertion, 4) = TextBox_name.Value
Sheets(DATASOURCEFEUIL).Cells(ligne_insertion, 5) = ComboBox_fonct.Value
Sheets(DATASOURCEFEUIL).Cells(ligne_insertion, 6) = CDate(TextBox_d_deb.Value)
MsgBox "votre agent à bien été ajouté", vbOKOnly + vbInformation, "CONFIRMATION"
End If
End Sub
Private Sub Cmd_Recherche_Click()
If Not Cmd_search.Value = "" Then
Dim no_ligne As Integer
no_ligne = Cmd_search.ListIndex + 2
ComboBox_fonct.Value = Cells(no_ligne, 5)
TextBox_name.Value = Cells(no_ligne, 4)
TextBox_d_deb = Cells(no_ligne, 6)
Else
End If
CommandButton_enregister.Enabled = False
End Sub
Private Sub Cmd_change_Click()
If Not Cmd_search.Value = "" Then
Sheets("Cfg").Select
modif = Cmd_search.ListIndex + 2
Cells(modif, 5) = ComboBox_fonct.Value
Cells(modif, 4) = TextBox_name.Value
Cells(modif, 6) = TextBox_d_deb
MsgBox ("Modification effectuée")
Else
MsgBox ("Veuillez sélectionner le Nom & Prénom de la personne à modifier")
End If
Unload Usf_Pers
Usf_Pers.Show
End Sub
Private Sub CommandButton_annuler_Click()
Unload Me
End Sub
Pièces jointes
Dernière édition: