Private Sub ComboBox1_Change() '------------------------------------------------------------ ' Au changement de "value" de la combobox1 ' On recherche tous les enregistrements qui correspondent ' et on les affiche dans la comboBox2 '------------------------------------------------------------ Debug.Print "Valeur sélectionnée :" & Me.ComboBox1.Value ' Variables [ne pas changer] Dim arrResult() As String ' Initialisation des Variables [ A MODIFIER ] Dim MaFeuille As Worksheet Set MaFeuille = ThisWorkbook.Sheets(1) Dim MaPlage As String MaPlage = "G2:G20" Dim colonneValeurs As Integer colonneValeurs = 8 Dim colonneValeurs2 As Integer colonneValeurs2 = 9 'On remet la combobox2 à "vide" Me.ComboBox2.Clear 'Recherche des valeurs correspondantes x = FindAll(Me.ComboBox1.Value, MaFeuille, MaPlage, arrResult()) If x = True Then nbC = UBound(arrResult) Debug.Print nbC & " resultats trouvés " For i = 1 To nbC Me.ComboBox2.AddItem MaFeuille.Cells((arrResult(i)), colonneValeurs) & "-" & MaFeuille.Cells((arrResult(i)), colonneValeurs2) Next Else Debug.Print "Aucune correspondance trouvée !" End If End Sub Function FindAll(ByVal sText As String, ByRef oSht As Worksheet, ByRef sRange As String, ByRef arMatches() As String) As Boolean ' -------------------------------------------------------------------------------------------------------------- ' FindAll - To find all instances of the1 given string and return the row numbers. ' If there are not any matches the function will return false ' -------------------------------------------------------------------------------------------------------------- On Error GoTo Err_Trap Dim rFnd As Range ' Range Object Dim iArr As Integer ' Counter for Array Dim rFirstAddress ' Address of the First Find ' ----------------- ' Clear the Array ' ----------------- Erase arMatches Set rFnd = oSht.Range(sRange).Find(what:=sText, LookIn:=xlValues, lookAt:=xlPart) If Not rFnd Is Nothing Then rFirstAddress = rFnd.Address Do Until rFnd Is Nothing iArr = iArr + 1 ReDim Preserve arMatches(iArr) arMatches(iArr) = rFnd.Row 'rFnd.Address pour adresse complete ' rFnd.Row Pour N° de ligne Set rFnd = oSht.Range(sRange).FindNext(rFnd) If rFnd.Address = rFirstAddress Then Exit Do ' Do not allow wrapped search Loop FindAll = True Else ' ---------------------- ' No Value is Found ' ---------------------- FindAll = False End If ' ----------------------- ' Error Handling ' ----------------------- Err_Trap: If Err <> 0 Then MsgBox Err.Number & " " & Err.Description, vbInformation, "Find All" Err.Clear FindAll = False Exit Function End If End Function Private Sub UserForm_Initialize(): ComboBox1.Text = " " ValeurUne = Range("A2").End(xlDown).Row ComboBox1.RowSource = "A2:A" & ValeurUne End Sub
Essaye (frappe quelque-chose dans la zone d'édition de la combo) et constates (avec ton code).Je sais parfaitement ce que fait mon code... pas de soucis...
Par ailleurs et surtout : imagine qu'il s'amuse à frapper "toto" dans la zone d'édition dans la zone d'édition l'évènement Change serait déclenché à la frappe de "t" (pour rechercher ... "t"), puis de "o"....On peut ajouter un control sur le nombre de caractères..
Le code fonctionne quand il est exécuté dans un classeur indépendantc'est l'avantage de ce code.
quand je l'exécute dans un classeur contenant un autre userform- Est-ce que ce userform est affiché également à l'écran ?
me.show 'c'est la même chose que : userform1.show
il ne fonctionne pas.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionUserForm1.Show vbModeles UserForm2.Show vbModeles
Dim Feuil1 As Worksheet Set Feuil1 = ThisWorkbook.Sheets(1)
Une question, avant de poursuivre je peux utiliser la même méthode dans le module de récupération des variables combox2, pour faire récuperer des valeurs dans des textBox et faire des calculsOui bien sur.
Option Explicit Private fait As Boolean, cols_a_afficher, a Private Sub ComboBox1_Click() Dim i As Long, j As Long, toto If fait Then With ComboBox2 .Clear .ColumnCount = UBound(cols_a_afficher) + 2 toto = Split(ComboBox1.List(ComboBox1.ListIndex, 1), Chr(1)) For i = 0 To UBound(toto) .AddItem ComboBox1.List(ComboBox1.ListIndex, 0) For j = 0 To UBound(cols_a_afficher) .List(i, j + 1) = a(toto(i), Columns(cols_a_afficher(j)).Column) Next Next End With End If ComboBox1.ListIndex = -1 End Sub Private Sub UserForm_Activate() Dim sh As Worksheet, plage As Range, derlig As Long, premlig As Long, dercol As String, premcol As String cols_a_afficher = Array("B", "D", "E") Dim i As Long, ou As Long dercol = cols_a_afficher(UBound(cols_a_afficher)) premlig = 4 premcol = "A" With ComboBox1 .ColumnCount = 2 .ColumnWidths = "20;0" Set sh = Workbooks("jordane.xlsm").Sheets("Feuil1") derlig = sh.Range("A" & Rows.Count).End(xlUp).Row Set plage = sh.Range(premcol & premlig & ":" & dercol & derlig) a = plage ComboBox2.ColumnCount = 1 ComboBox2.Clear For i = 1 To UBound(a) ComboBox2.Text = a(i, 1) ou = ComboBox2.ListIndex ComboBox2.Text = "" If ou = -1 Then .AddItem a(i, 1) ComboBox2.AddItem a(i, 1) DoEvents .List(.ListCount - 1, 1) = i Else .List(ou, 1) = .List(ou, 1) & Chr(1) & i End If Next fait = True End With End Sub