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...
:lun:
Version imprimable
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...
:lun:
Salut,
colle cette procédure parmis les autres de ton userform :
Ensuite, quand tu as besoin de trier :Code:
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:
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...:aie:
sur qu'elle ligne et comment l'applique tu ce code ..?Citation:
Envoyé par CIBOOX
sur la ligneCitation:
Envoyé par bbil
j'ai place ce code dans Private Sub cbox2_Click() ( cbox2=combobox2)Code:ReDim MyData(NomCombo.ListCount - 1) ' NomComBo à remplacer
et tu as lu le commentaire de cette ligne ..?
Citation:
' 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:
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:
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:
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:
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
:aie: :aie:je reste bloquer sur la ligneCitation:
Envoyé par mortalino
erreur de compilation :sub ou fonction non defini :aie: :aie: :aie:Code:Call Tri(MyData)
Ben t'as gardé la procédure Tri ? (voir le premier message)Citation:
Envoyé par mortalino
Il doit être placé dans le code du UserForm
@++
bonsoir MichelCitation:
Envoyé par SilkyRoad
j'ai essaye ton code mais cette fois j'ai une erreur execution '70'
permission refusee:nono:
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 nonCitation:
Envoyé par mortalino
Oui, c'est ma faute :
Je teste ça pour voir ;)Code:
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:
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:bug:Code:MyData(i) = lecontrol.List(i)
Oui, c'est dût au "- 1" qui manquait :
Code:For i = 0 To lecontrol.ListCount - 1 ' *** Ici rajoute le -1
pourquoi rajoute tu la commande -1 ?????
:nono: :nono: :nono: cette fois je bug sur la ligne lecontrol.Clear erreur non repertoriee:aie:
Je rajoute la commande - 1 car les Index partent de 0.
Si ListCount = 2, pour avoir les valeurs, c'est .List(0) & .List(1)
Pour ton autre problème, là je sèche.
Mais en tout cas, avec des noms en dur (Combobox1), mon code fonctionne.
Bon courage,
++
ok mortalino je vais tenter d' appliquer le code tri avec le code procedure d ' ouskel' nor :D
en fait mon tableau commence a partir de la colonne c dans ma feuille excel :Citation:
Envoyé par SilkyRoad
'Colonne C ---> cbox1
'Colonne D ---> cbox2
'Colonne E ---> cbox3
'Colonne F ---> cbox4
Comment Faire Pour Qu'a Chaque Fois Que Je Click Sur Une Combobox Celle Ci Soit Trier ?
bonsoir
?????Citation:
Comment Faire Pour Qu'a Chaque Fois Que Je Click Sur Une Combobox Celle Ci Soit Trier ?
En général un ComboBox est trié lors de son remplissage.
Quel est l'intéret d'effectuer un tri lors de l'évenement Click?
bonne soirée
michel
en fait moi j' utilise la fonction combobox pour faire une consultation d' une base de données sur excel
je joins mon fichier pour mieux me faire comprendre
j' ai lié plusieurs combobox afin d'editer une fiche avec toute les valeurs de chaques combobox grace au combobox list index
je truc en plus que je tente de mettre en place c'est un tri pour chaque combobox
MAIS AVEC 1 J'AI UNE ERREUR 381 :aie: :aie:
COMMENT ADAPTER CE CODE?SACHANT QUE MON TABLEAU COMMENCE A COMPTER DE LA COLONNE CCode:
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 '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
COLONE C = CBOX 1
Autant pour moi. J'ai relu quelques post en arrière.
Je reparts sur l'erreur 381. Il serait plus confortable pour le lecteur que tu indiques l'erreur et non son N°. Ainsi tout le monde comprendrait tout de suite que tu as oublié un bout.
Je reste sur cette erreur, ta question suivante soulève d'autres problèmes. On verra plus tard.
On t'a précédemment précisé que pour utiliser une variable contrôle tu devais l'utiliser en indiquant ce qu'elle représente
Commence par corriger ça :
Et commence par dire ce que tu obtiensCode:
1
2
3
4
5
6
7
8
9
10
11 ReDim MyData(GRILLE.Controls(lecontrol.Name).ListCount) For i = 0 To GRILLE.Controls(lecontrol.Name).ListCount-1 MyData(i) = GRILLE.Controls(lecontrol.Name).List(i) Next i Call Tri(MyData) GRILLE.Controls(lecontrol.Name).Clear For i = 0 To UBound(MyData) GRILLE.Controls(lecontrol.Name).AddItem MyData(i) Next i Erase MyData
en aplliquant les modifications ci dessus j' ai sur le codel'erreur d' execution errur non repertoriee ( 80004005) :roll:Code:GRILLE.Controls(lecontrol.Name).Clear
Et si tu vérifies "lecontrol.Name" qu'y a-t-il dedans ? (Balade ta souris dessus)
je vois rien sur lecontrol.name mais i=34 c space non j'ai que 23 combobox:aie:Citation:
Envoyé par ouskel'n'or
Quand tu as un bug, la macro s'arrête sur une ligne et si tu balades ta souris sur les variables, tu as une infobulle qui te donne ce qu'il y a dedans... Ça c'est pour ceux qui ne savent pas utiliser Debug.print
Pour toi, ajoute, avant la ligne qui bugue,
et dans l'éditeur VB, tu vas dans "Affichage" et valide "Fenêtre exécution"Code:Debug.print Lecontrole.name
Faut comprendre que je n'ai pas ton appli et que je ne comprends pas (du tout) ton pb ;)
A+
oui je tente le debug print mais rien ne se passe
Si, moi j'ai un gros bug parce que tu as mis un e à la fin de Lecontrol :aie:Citation:
Envoyé par Tu
Une fois enlevé, j'ai Cbox4 dans la fenêtre exécution
Je regarde ton appli mais sois patient, on m'appelle "A TABLE !"
A+
yes je rectifie et cbox4 pose probleme :aie: :aie:
:frenchy: bon appp... :frenchy:
ta raison il fais faimmm !!!!!!!!:mouarf:
Déjà un élément de réponse : Tu utilises d'un côté "RowSouce" et de l'autre AddItem. Déjà, on sait qu'on ne peut pas compléter une liste, renseignée avec rowSource, avec AddItem. C'est ou l'un ou l'autre.
J'ai l'impression, en première analyse, que ton combo refuse le clear, qu'accepterait un combo chargé avec Additem, pour cette même raison.
Quant à le renseigner avec Additem ensuite...
Pour que les modifs que je pourrais faire, j'ai besoin que tu modifies ces lignes en excluant RowSource pour définir la plage.
Ça m'évitera de chercher, d'autant que je ne comprends pas pourquoi tu fais ça :aie:Code:
1
2
3
4
5
6
7 Private Sub cbox1_change() Dim c As Range 'La cellule If cbox1.ListIndex >= 0 Then 'Set c = Range(cbox1.RowSource).Cells(cbox1.ListIndex + 1) 'c.Activate End If End Sub
A+
NB - Si on ne peut pas utiliser AddItem dans une liste utilisant déjà RowSource, on peut changer la plage de référence.
NB2 - Pourquoi n'effectue ton classement dans un tableau plutôt qu'en passant pas la listbox ? Un tableau peut s'utiliser comme une plage avec RowSource ?
En fait j'utilise ce code pour me placer sur la ligne qui contient la valeur selectionnee dans mes combobox.....
Va pour add item si c plus simple :mouarf:
J avais remarque qu'avec rowsource je ne pouvez pas ajouter directement une nouvelle saisie alors si add item marche ça serait TROP FORT:king: :king: :king:
Et lis les règles du forum : On écrit en minuscules :mouarf:
avec des add item les combobox seront aussi liées ?:oops: