Combobox en cascade 2 niv et resultat dans textbox
Bonjour a tous,
Besoin d'un gros coup de main pour coder cette macro, après plusieurs recherche je n'arrive pas a faire ce qu'il me plait !!!
Ce que je souhaite obtenir :
Dans une userform, faire une recherche en cascade via 2 combobox et afficher les resultats dans des textbox.
Pour cela j'ai une feuil excel avec 5 colonnes (A B C D E), et une userform avec 2 combobox et 5 textbox
Le fonctionnement :
Combobox1 filtre "année" colonne B de la feuil "base1"
Combobox2 filtre "ID" colonne A de la feuil "base1"
Les résultats qui s'affichent suite a la recherche :
TextBox1 = ID
TextBox2 = Année
TextBox3 = verif
TextBox4 = N°
TextBox5 = Prix
Je vous joint un fichier
Merci de votre aide !
CDT
Bonjour MrDeeJayFab, bonjour le forum,
En pièce jointe ton fichier modifié avec le code ci-dessous et un bouton pour lancer la recherche :
Private O As Worksheet 'déclare la variable O (Onglet)
Private TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)
Set O = Worksheets("base1") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
D(TV(I, 2)) = "" 'alimente le dictionnaire D avec les données en colonne 2 du tableau des valeurs TV
Next I 'prochaine ligne de la boucle
Me.ComboBox1.List = D.keys 'alimente la ComboBox1 avec la liste des éléments du dictionnaire D sans doublons
End Sub
Private Sub ComboBox1_Change() 'au changement dans la Combobox1
Dim I As Integer 'déclare la variable I (Incrément)
Me.ComboBox2.Clear 'vide la ComboBox2
'si la ComboBox1 est effacée, lance la procédure [Effac] et sort de cette procédure
If Me.ComboBox1.Value = "" Then Call Effac: Exit Sub
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
'si la valeur de la ComboBox1 est égale à la valeur de la donnée ligne I colonne 2 de TV,
'ajoute la donnée ligne I colonne 1 de TV à la ComboBox2
If CStr(TV(I, 2)) = Me.ComboBox1.Value Then Me.ComboBox2.AddItem TV(I, 1)
Next I 'prochaine ligne de la boucle
'si la ComboBox2 ne contient qu'un seul élément, affiche cet unique élément
'ce qui a pour conséquence de lancer la procédure Change de la ComboBox2
If Me.ComboBox2.ListCount = 1 Then Me.ComboBox2.ListIndex = 0
End Sub
Private Sub ComboBox2_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)
'si la ComboBox2 est effacée, lance la procédure [Effac] et sort de cette procédure
If Me.ComboBox2.Value = "" Then Call Effac: Exit Sub
For I = 2 To UBound(TV, 1) 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
'condition : si la valeur de la ComboBox1 est égale à la valeur de la donnée ligne I colonne 2 de TV,
'et si la valeur de la ComboBox2 est égale à la valeur de la donnée ligne I colonne 1 de TV
If CStr(TV(I, 2)) = Me.ComboBox1.Value And CStr(TV(I, 1)) = Me.ComboBox2.Value Then
For J = 1 To 5 'boucle 2 : sur les 5 colonnes du tableau des valeurs TV
Me.Controls("TextBox" & J).Value = TV(I, J) 'renvoie dans la TextBox de la boucle, la donnée ligne I colonne J de TV
Next J 'prochaine colonne de la boucle 2
End If 'fin de la condition
Next I 'prochaine ligne de la boucle 1
End Sub
Public Sub Effac()
Dim J As Byte 'déclare la variable J (incrément)
For J = 1 To 5 'boucle sur les 5 textboxes de l'UserForm1
UserForm1.Controls("TextBox" & J).Value = "" 'efface la TextBox de la boucle
Next J 'prochaine colonne de la boujcle 2
End SubLe fichier :
Bonjour Mr ThauThème,
Votre macro va a merveille !
je l'ai adapter a mon fichier en remplaçant :
Ce code Me.Controls("TextBox" & J).Value = TV(I, J) 'renvoie dans la TextBox de la boucle, la donnée ligne I colonne J de TV
PAR
Me.Controls("TextBox1") = Sheets("base").Cells(I, "C")
etc
etc
etc
J'ai utilisé ce code afin de faire apparaitre les colones que je souhaitées avoir dans mes textbox !
Merci encore ! !