Recherchev via combobox pour incrémenter plusieurs textbox
Bonjour,
j'ai eu beau chercher sur tous les forums, je n'ai pas trouvé la solution à mon point de blocage... Le sujet est traité mais mon expérience insuffisante sur VBA fait que je n'arrive pas à compiler plusieurs codes pour atteindre mon but...
je joins un fichier pour illustrer mon besoin:
Contexte: (ce qui est en vert fonctionne, ce qui est en rouge n'est pas encore codé)
j'ai simplifié mon fichier pour que ce soit plus clair. J'ai donc une base de donnée simple avec le "nom prénom" et l'intitulé d'une formation
Pour certaines personnes, elles peuvent avoir suivi plusieurs formations et donc apparaître sur plusieurs ligne
J'ai un USF qui a pour objectif d'être une synthèse par collaborateur: lorsque je cherche le collaborateur à partir de la combobox, dès que je clique sur mon bouton de recherche, j'aurai besoin que l'ensemble des formations suivies apparaissent dans mes textbox
Si quelqu'un peut m'accompagner sur cette recherche svp...
Bonjour,
Le code est dans la Sub évènementielle "ComboBox1_Change()" pour remplir les TextBox mais je pense q'une ListBox serait plus appropriée :
Private Sub UserForm_Initialize()
ComboBox1.ColumnHeads = True
ComboBox1.RowSource = "feuil1!A2:A900"
End Sub
Private Sub ComboBox1_Change()
Dim Plage As Range
Dim Cel As Range
Dim Adr As String
Dim I As Integer
With Worksheets("Feuil1"): Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With
Set Cel = Plage.Find(ComboBox1.Text, , xlValues, xlWhole)
If Not Cel Is Nothing Then
Adr = Cel.Address
ListBox1.Clear
Do
'attention, il faut gérer la possibilité qu'il y est plus de trois formations donc erreur avec trois TextBox
I = I + 1
Me.Controls("TextBox" & I).Text = Cel.Offset(, 1).Value
'ici, avec une ListBox qui me semble plus appropriée !
ListBox1.AddItem Cel.Offset(, 1).Value
Set Cel = Plage.FindNext(Cel)
Loop While Cel.Address <> Adr
End If
End Submerci pour la réactivité!!
J'ai transcris le code directement mais le message d'erreur 'do sans boucle' apparaît, je ne vois pas pourquoi.
J'ai ajouté la fin de commande End Sub, sans succès.. et End if (ayant vu un If sur les lignes plus haut) mais pas plus concluant...
erreur de ma part, j'ai fait un peu trop vite...
ça fonctionne, c'est parfait je vous remercie
Je vais voir de mon côté comment faire pour augmenter le nombre de formation possible,
si besoin je ne manquerai pas de vous solliciter!
Décidemment je répond vraiment trop vite...!
la listbox est effectivement bien plus appropiée
Toutefois, dans mon fichier d'origine, j'ai prévu d'ajouter les éléments de date à laquelle la formation a été passée et de ce fait j'avais prévu de copier le code en l'adaptant à la colonne suivante dans ma ma base de donnée et en ajoutant d'autres textbox en face de celles me faisant l'inventaire des intitulés de formation.
Peut on du coup imaginer faire apparaître, dans la listbox, la date à laquelle a été passée l'information, sachant que cette donnée sera fournie en colonne C (il s'agirait de concatener l'information des 2 colonnes B et C en fait...)
Re,
Le code ci-dessous défini 3 colonnes à la ListBox dont une cachée qui contient le numéro de la ligne où se trouve la valeur :
Private Sub UserForm_Initialize()
ComboBox1.ColumnHeads = True
ComboBox1.RowSource = "feuil1!A2:A900"
With ListBox1
'3 colonnes dans la ListBox dont la dernière cachée (=0) pour contenir le numéro de ligne si besoin d'avoir accès aux valeurs
.ColumnCount = 3
.ColumnWidths = "95;95;0"
End With
End Sub
Private Sub ListBox1_Click()
MsgBox "La valeur se trouve sur la ligne '" & ListBox1.Column(2, ListBox1.ListIndex)
End Sub
Private Sub ComboBox1_Change()
Dim Plage As Range
Dim Cel As Range
Dim Adr As String
Dim I As Integer
With Worksheets("Feuil1"): Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With
Set Cel = Plage.Find(ComboBox1.Text, , xlValues, xlWhole)
If Not Cel Is Nothing Then
Adr = Cel.Address
ListBox1.Clear
Do
'attention, il faut gérer la possibilité qu'il y est plus de trois formations donc erreur avec trois TextBox
'ici, avec une ListBox qui me semble plus appropriée !
With ListBox1
.AddItem Cel.Offset(, 1).Value
.Column(1, I) = Cel.Offset(, 2).Value 'la date en colonne C
.Column(2, I) = Cel.Row 'numéro de la ligne où se trouve les valeurs cherchées
End With
I = I + 1
Set Cel = Plage.FindNext(Cel)
Loop While Cel.Address <> Adr
End If
End Submerci à nouveau,
je vais mettre en oeuvre ce code au plus vite
Bonjour,
je suis toujours sur mon fichier et j'ai un souci avec le code suivant:
Private Sub CommandButton1_Click()
Dim Plage As Range
Set Plage = Sheets("Visites médicales").Range("F4:F900")
TextBox5 = Plage(1 + ComboBox1.ListIndex, 1)
Set Plage = Sheets("Effectif").Range("E2:E900")
TextBox2 = Plage(1 + ComboBox1.ListIndex, 1)
Set Plage = Sheets("Effectif").Range("C2:C900")
TextBox3 = Plage(1 + ComboBox1.ListIndex, 1)
Set Plage = Sheets("Effectif").Range("D2:D900")
TextBox4 = Plage(1 + ComboBox1.ListIndex, 1)
Cette commande me permet de remplir les textbox de mon userform avec les dates à partir de la valeur que j'inscrit dans la comboBox.
Mais, si dans les onglets concernés ("visites médicales", Effectif, ...) les personnes ne sont pas rangées dans le même ordre (alphabetique) alors la valeur que je retrouve dans les textbox n'est pas la bonne: la valeur qui s'inscrit ne dépend pas de la valeur en tant que telle mais de son emplacement (sa ligne) dans l'onglet...
Je n'arrive pas à fair en sorte que la recherche se fasse en fonction de la valeur et non pas de l'emplacement de la valeur dans le premier onglet
Si vous pouviez me donner à nouveau un coup de pouce...