BONSOIR !!!!
J'ai un userform avec plusieurs combobox liées entres elles
Je cherche un code qui me permettrai,pour n'importe quelle combobox de classer les valeurs par trie croissant...
![]()
BONSOIR !!!!
J'ai un userform avec plusieurs combobox liées entres elles
Je cherche un code qui me permettrai,pour n'importe quelle combobox de classer les valeurs par trie croissant...
![]()
Salut,
colle cette procédure parmis les autres de ton userform :
Ensuite, quand tu as besoin de trier :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Sub Tri(ByRef Liste() As String) Dim i As Long, j As Long Dim Temp As String For i = LBound(Liste) To UBound(Liste) - 1 For j = i + 1 To UBound(Liste) If Liste(i) > Liste(j) Then Temp = Liste(j) Liste(j) = Liste(i) Liste(i) = Temp End If Next j Next i End Sub
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Dim MyData() As String Dim i As Long ReDim MyData(NomComBo.ListCount - 1) ' NomComBo à remplacer For i = 0 To NomComBo.ListCount ' NomComBo à remplacer MyData(i) = NomCombo.List(i) ' NomComBo à remplacer Next i Call Tri(MyData) NomComBo.Clear ' NomComBo à remplacer For i = LBound(MyList) To UBound(MyList) NomComBo.AddItem MyList(i) ' NomComBo à remplacer Next i Erase MyData
@++
en aplliquant ton code j'ai une erreur 424 objet requis...![]()
sur qu'elle ligne et comment l'applique tu ce code ..?Envoyé par CIBOOX
sur la ligneEnvoyé par bbil
j'ai place ce code dans Private Sub cbox2_Click() ( cbox2=combobox2)
Code : Sélectionner tout - Visualiser dans une fenêtre à part ReDim MyData(NomCombo.ListCount - 1) ' NomComBo à remplacer
et tu as lu le commentaire de cette ligne ..?
' NomComBo à remplacer
oui j'ai bien remplacer nomcombo par cbox2 mais cette fois j' ai l'erreur 381: impossible de lire la propriete liste.Index de table de proprietes non valide
de plus j'ai un userform avec 23 combobox liées alors je tente un code style " la procedure " d' ouskel 'nor ( oui !!!! ouskel'nor m' avais aider a installer un code qui indexe et lie toutes les combobox cbox voir ma discusion "alleger codes combobox")afin d'alleger mes codes ......
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Sub laprocedure(Lindex) Dim lecontrol As Object For Each lecontrol In GRILLE.Controls If InStr(lecontrol.Name, "cbox") = 1 Then GRILLE.Controls(lecontrol.Name).ListIndex = Lindex End If Next End Sub
Salut,
une simple boucle sur tes objets dans mon code provoquera le tri de TOUTES tes combobox.
Bien entendu, ce sera plus ou moins long suivant le nombre de données, si c'est trop long, il te faudra faire un module de classe avec un évènement commun.
Pour ce qui est de mon code, la procédure Tri reste la même, seul la seco nde partie du code change :
@++
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 Dim MyData() As String Dim i As Long Dim ctl As Control For Each ctl In Me.Controls If TypeOf ctl Is ComboBox Then ReDim MyData(ctl.ListCount - 1) For i = 0 To ctl.ListCount MyData(i) = ctl.List(i) Next i Call Tri(MyData) ctl.Clear For i = LBound(MyList) To UBound(MyList) ctl.AddItem MyList(i) Next i Erase MyData End If Next ctl
EN FAIT j' aimerai que le tri soit integrer dans le code procedure
Beh un copier coller, + la boucle en moins, et c'est bon :
@++
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 Sub laprocedure(Lindex) Dim lecontrol As Object For Each lecontrol In GRILLE.Controls If InStr(lecontrol.Name, "cbox") = 1 Then GRILLE.Controls(lecontrol.Name).ListIndex = Lindex Dim MyData() As String Dim i As Long ReDim MyData(lecontrol.ListCount - 1) For i = 0 To lecontrol.ListCount MyData(i) = lecontrol.List(i) Next i Call Tri(MyData) lecontrol.Clear For i = LBound(MyList) To UBound(MyList) lecontrol.AddItem MyList(i) Next i Erase MyData End If Next lecontrol End Sub
bonjour
tu peux tester cette adaptation
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 Private Sub UserForm_Initialize() 'Les données à aficher dans les combobox sont contenues 'dans les colonnes A à D. 'Colonne A ---> cbox1 'Colonne B ---> cbox2 'Colonne C ---> cbox3 'Colonne D ---> cbox4 Dim m As Byte Dim j As Integer, i As Integer, x As Integer Dim Temp As String 'boucle pour remplir les combobox For m = 1 To 4 x = Cells(65536, m).End(xlUp).Row 'Remplissage combobox Me.Controls("cbox" & m).List() = _ Range(Cells(1, m), Cells(x, m)).Value 'Tri croissant dans les ComboBox With Me.Controls("cbox" & m) For i = 0 To .ListCount - 1 For j = 0 To .ListCount - 1 If .List(i) < .List(j) Then Temp = .List(i) .List(i) = .List(j) .List(j) = Temp End If Next j Next i End With Next m End Sub
michel
![]()
je reste bloquer sur la ligneEnvoyé par mortalino
erreur de compilation :sub ou fonction non defini
Code : Sélectionner tout - Visualiser dans une fenêtre à part Call Tri(MyData)![]()
![]()
![]()
Ben t'as gardé la procédure Tri ? (voir le premier message)Envoyé par mortalino
Il doit être placé dans le code du UserForm
@++
bonsoir MichelEnvoyé par SilkyRoad
j'ai essaye ton code mais cette fois j'ai une erreur execution '70'
permission refusee![]()
oui et je reste toujours bloque !!!! lorsque que je suis en debugage et je click sur la ligne jaune j' ai une info bulle i=34 c space nonEnvoyé par mortalino
Oui, c'est ma faute :
Je teste ça pour voir
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 Sub laprocedure(Lindex) Dim lecontrol As Object For Each lecontrol In GRILLE.Controls If InStr(lecontrol.Name, "cbox") = 1 Then GRILLE.Controls(lecontrol.Name).ListIndex = Lindex Dim MyData() As String Dim i As Long ReDim MyData(lecontrol.ListCount - 1) For i = 0 To lecontrol.ListCount MyData(i) = lecontrol.List(i) Next i Call Tri(MyData) lecontrol.Clear For i = LBound(MyData) To UBound(MyData) ' *** CHGT ICI lecontrol.AddItem MyData(i) ' *** CHGT ICI Next i Erase MyData End If Next lecontrol End Sub![]()
Arf, encore une ch'tite erreur de ma part, désolé, voici donc le bon code :
testé, c'est bon.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 Sub laprocedure(Lindex) Dim lecontrol As Object For Each lecontrol In GRILLE.Controls If InStr(lecontrol.Name, "cbox") = 1 Then GRILLE.Controls(lecontrol.Name).ListIndex = Lindex Dim MyData() As String Dim i As Long ReDim MyData(lecontrol.ListCount - 1) For i = 0 To lecontrol.ListCount - 1 ' *** Ici rajoute le -1 MyData(i) = lecontrol.List(i) Next i Call Tri(MyData) lecontrol.Clear For i = LBound(MyData) To UBound(MyData) ' *** Change MyList en MyData lecontrol.AddItem MyData(i) ' *** Change MyList en MyData Next i Erase MyData End If Next lecontrol End Sub
@++
en modifiant je me retrouve toujours en debugage sur la ligneavec i =34
Code : Sélectionner tout - Visualiser dans une fenêtre à part MyData(i) = lecontrol.List(i)![]()
Oui, c'est dût au "- 1" qui manquait :
Code : Sélectionner tout - Visualiser dans une fenêtre à part For i = 0 To lecontrol.ListCount - 1 ' *** Ici rajoute le -1
pourquoi rajoute tu la commande -1 ?????
![]()
![]()
cette fois je bug sur la ligne lecontrol.Clear erreur non repertoriee
![]()
Partager