Remplir une listbox par ordre alphabétique
Résolu/Fermé
Co_nexion
Messages postés
328
Date d'inscription
lundi 5 mars 2012
Statut
Membre
Dernière intervention
15 juillet 2015
-
Modifié par Co_nexion le 21/03/2012 à 15:21
Co_nexion Messages postés 328 Date d'inscription lundi 5 mars 2012 Statut Membre Dernière intervention 15 juillet 2015 - 5 avril 2012 à 09:54
Co_nexion Messages postés 328 Date d'inscription lundi 5 mars 2012 Statut Membre Dernière intervention 15 juillet 2015 - 5 avril 2012 à 09:54
A voir également:
- Remplir une listbox par ordre alphabétique
- Excel trier par ordre alphabétique - Guide
- Classer les applications par ordre alphabétique iphone - Guide
- Organigramme a remplir word - Guide
- Remplir et signer pdf - Guide
- Ordre meilleur ami snap - Forum Snapchat
8 réponses
f894009
Messages postés
17185
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
15 avril 2024
1 701
22 mars 2012 à 15:51
22 mars 2012 à 15:51
Bonjour ccm81
Merci pour le code de tri. Probleme, il n'aura pas les entetes de colonne.
Pour avoir les entetes il faut passer par .RowSource= address de plage
Ici:
Feuille1:
Entete: A1 a C1 a modifier pour 10 colonnes
Plage: de donnees A2 a Cx
Feuille2
Entete ideme Feuille1: A1 a C1
Plage trie pour RowSource: A2 a Cx pour pouvoir donner les address de plage afin d'avoir les entetes.
Code a copier dans l'UserForm
'Nombre de colonnes a adapter--->passer a 10
Const nbcol = 3
'Nombre de colonnes a adapter
Const nbcol = 3
Private Sub UserForm_Initialize()
'Nombre de colonnes
ListBox.ColumnCount = nbcol
'largeur Colonnes a adapter
ListBox.ColumnWidths = "50 pt;50 pt;50 pt"
'Entete colonne
ListBox.ColumnHeads = True
Call tri
End Sub
'Code ccm81 adapte pour les besoins de Co_nexion
Public Sub tri()
Dim plage As String
Dim lifin As Long
Dim Tablo As Variant, mini As Variant, tempo As Variant
Dim n As Long, i As Long, j As Long, c As Long, rangmini As Long
lifin = Sheets(1).Range("A2").End(xlDown).Row
plage = "A2:C" & lifin
Tablo = Sheets(1).Range(plage).Value
n = UBound(Tablo, 1)
For i = 1 To n - 1
mini = Tablo(i, 1)
For j = i + 1 To n
If Tablo(j, 1) < mini Then
rangmini = j
mini = Tablo(rangmini, 1)
End If
Next j
For c = 1 To nbcol
tempo = Tablo(i, c)
Tablo(i, c) = Tablo(rangmini, c)
Tablo(rangmini, c) = tempo
Next c
Next i
Worksheets("Feuil2").Activate
Worksheets("Feuil2").Range(Cells(2, 1), Cells(11, "c")).Value = Tablo
Me.ListBox.RowSource = Sheets("Feuil2").Range(Cells(2, 1), Cells(lifin, "c")).Address
End Sub
Bonne suite
Merci pour le code de tri. Probleme, il n'aura pas les entetes de colonne.
Pour avoir les entetes il faut passer par .RowSource= address de plage
Ici:
Feuille1:
Entete: A1 a C1 a modifier pour 10 colonnes
Plage: de donnees A2 a Cx
Feuille2
Entete ideme Feuille1: A1 a C1
Plage trie pour RowSource: A2 a Cx pour pouvoir donner les address de plage afin d'avoir les entetes.
Code a copier dans l'UserForm
'Nombre de colonnes a adapter--->passer a 10
Const nbcol = 3
'Nombre de colonnes a adapter
Const nbcol = 3
Private Sub UserForm_Initialize()
'Nombre de colonnes
ListBox.ColumnCount = nbcol
'largeur Colonnes a adapter
ListBox.ColumnWidths = "50 pt;50 pt;50 pt"
'Entete colonne
ListBox.ColumnHeads = True
Call tri
End Sub
'Code ccm81 adapte pour les besoins de Co_nexion
Public Sub tri()
Dim plage As String
Dim lifin As Long
Dim Tablo As Variant, mini As Variant, tempo As Variant
Dim n As Long, i As Long, j As Long, c As Long, rangmini As Long
lifin = Sheets(1).Range("A2").End(xlDown).Row
plage = "A2:C" & lifin
Tablo = Sheets(1).Range(plage).Value
n = UBound(Tablo, 1)
For i = 1 To n - 1
mini = Tablo(i, 1)
For j = i + 1 To n
If Tablo(j, 1) < mini Then
rangmini = j
mini = Tablo(rangmini, 1)
End If
Next j
For c = 1 To nbcol
tempo = Tablo(i, c)
Tablo(i, c) = Tablo(rangmini, c)
Tablo(rangmini, c) = tempo
Next c
Next i
Worksheets("Feuil2").Activate
Worksheets("Feuil2").Range(Cells(2, 1), Cells(11, "c")).Value = Tablo
Me.ListBox.RowSource = Sheets("Feuil2").Range(Cells(2, 1), Cells(lifin, "c")).Address
End Sub
Bonne suite
f894009
Messages postés
17185
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
15 avril 2024
1 701
4 avril 2012 à 16:02
4 avril 2012 à 16:02
Re,
https://www.cjoint.com/?BDeqbonfhYt
Modif faciles a trouver. A essayer
https://www.cjoint.com/?BDeqbonfhYt
Modif faciles a trouver. A essayer
Co_nexion
Messages postés
328
Date d'inscription
lundi 5 mars 2012
Statut
Membre
Dernière intervention
15 juillet 2015
5 avril 2012 à 09:54
5 avril 2012 à 09:54
Effectivement... Merci beaucoup f894009 & bonne journée
ccm81
Messages postés
10851
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
16 avril 2024
2 404
Modifié par ccm81 le 21/03/2012 à 16:28
Modifié par ccm81 le 21/03/2012 à 16:28
bonjour à tous
1. transfert de la plage dans tablo
2. tri (selection) de tablo
3. tranfert de tablo dans la listtbox1
RQ. on peut s'affranchir de la casse avec la fonction Ucase à appliquer dans la partie tri de tablo
bonne suite
1. transfert de la plage dans tablo
2. tri (selection) de tablo
3. tranfert de tablo dans la listtbox1
tablo = Range("A1:A9").Value n = UBound(tablo, 1) For i = 1 To n - 1 mini = tablo(i, 1) For j = i + 1 To n - 1 If tablo(j, 1) < mini Then rangmini = j mini = tablo(rangmini, 1) End If Next j tempo = tablo(i, 1) tablo(i, 1) = mini tablo(rangmini, 1) = tempo Next i For i = 1 To n ListBox1.List() = tablo Next i
RQ. on peut s'affranchir de la casse avec la fonction Ucase à appliquer dans la partie tri de tablo
bonne suite
Co_nexion
Messages postés
328
Date d'inscription
lundi 5 mars 2012
Statut
Membre
Dernière intervention
15 juillet 2015
21 mars 2012 à 16:28
21 mars 2012 à 16:28
Bonjour,
Etant vraiment débutant dans le vaste monde du vba, je vous avoue que je ne sais pas ou incorporer ce bout de code par rapport à la première partie de mon code. En effet, la première partie du code (voir plus haut) me sert à amener les données dans la listbox tout en alimentant une entête.
Merci de votre aide
Etant vraiment débutant dans le vaste monde du vba, je vous avoue que je ne sais pas ou incorporer ce bout de code par rapport à la première partie de mon code. En effet, la première partie du code (voir plus haut) me sert à amener les données dans la listbox tout en alimentant une entête.
Merci de votre aide
ccm81
Messages postés
10851
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
16 avril 2024
2 404
Modifié par ccm81 le 21/03/2012 à 17:19
Modifié par ccm81 le 21/03/2012 à 17:19
au vu de ton code, je ne comprend pas bien ce que tu veux faire
celui que je t'ai proposé remplit une listbox1 (à 1 seule colonne) avec le contenu de la plage "A1:A9" )
la seule chose que tu as à faire c'est
- un copier/coller du code
- mettre un Me. devant mes ListBox1 (s'il s'agit bien de la ListMox1 de ta UserForm
- changer la plage qui va servir à remplir cette ListBox1 via tablo
tablo = sheets("CDD").Range(.....).Value
RQ1. tu ne dois pas utiliser RowSource qui lierait ta listbox à une plage, la source de ta Listbox1, c'est tablo!
RQ2. il y a une boucle inappropriée à la fin de mon code
remplacer
bonne suite
celui que je t'ai proposé remplit une listbox1 (à 1 seule colonne) avec le contenu de la plage "A1:A9" )
la seule chose que tu as à faire c'est
- un copier/coller du code
- mettre un Me. devant mes ListBox1 (s'il s'agit bien de la ListMox1 de ta UserForm
- changer la plage qui va servir à remplir cette ListBox1 via tablo
tablo = sheets("CDD").Range(.....).Value
RQ1. tu ne dois pas utiliser RowSource qui lierait ta listbox à une plage, la source de ta Listbox1, c'est tablo!
RQ2. il y a une boucle inappropriée à la fin de mon code
remplacer
For i = 1 To n ListBox1.List() = tablo Next ipar
ListBox1.List() = tablo
bonne suite
Co_nexion
Messages postés
328
Date d'inscription
lundi 5 mars 2012
Statut
Membre
Dernière intervention
15 juillet 2015
22 mars 2012 à 10:58
22 mars 2012 à 10:58
Merci beaucoup pour ces explications.
Je vais essayer tout ca au plus vite ;)
Je vais essayer tout ca au plus vite ;)
Co_nexion
Messages postés
328
Date d'inscription
lundi 5 mars 2012
Statut
Membre
Dernière intervention
15 juillet 2015
22 mars 2012 à 11:21
22 mars 2012 à 11:21
Re,
Je viens d'essayer le code et malheureseument ca ne marche pas. Je pense avoir oublié quelque chose ou être totalement passé à côté.
Voila comment j'ai intégré ton code mais peut être est ce là mon erreur...
Je viens d'essayer le code et malheureseument ca ne marche pas. Je pense avoir oublié quelque chose ou être totalement passé à côté.
Voila comment j'ai intégré ton code mais peut être est ce là mon erreur...
Private Sub UserForm_Initialize() With Sheets("CDD").Range("A1") Me.ListBox1.RowSource = "CDD!A1:J" & Sheets("CDD").Cells(1, 1).End(xlDown).Row NbLigne = WorksheetFunction.CountA(Columns("C:C")) Me.ListBox1.Tablo = Sheets("CDD").Range(Cells(2, 1), Cells(NbLigne, 10)).Address End With Dim Tablo As Variant, Tempo As Variant, i As Long, j As Long Worksheets("CDD").Activate 'à défaut d'instancier la feuille Tablo = Sheets("CDD").Range("A1:J").Value n = UBound(Tablo, 1) For i = 1 To n - 1 mini = Tablo(i, 1) For j = i + 1 To n - 1 If Tablo(j, 1) < mini Then rangmini = j mini = Tablo(rangmini, 1) End If Next j Tempo = Tablo(i, 1) Tablo(i, 1) = mini Tablo(rangmini, 1) = Tempo Next i Me.ListBox1.List() = Tablo End Sub
f894009
Messages postés
17185
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
15 avril 2024
1 701
22 mars 2012 à 12:17
22 mars 2012 à 12:17
Bonjour Co_nexion et ccm81
Votre souhait est-il bien celui-ci:
Afficher dans une listbox de 10 colonnes des informations,avec un tri par ordre alphabetique sur la premiere colonne ( les autres infos doivent suivre le tri), provenant d'une plage de cellules sans faire le tri sur cette plage de cellules.
ccm81 vous a fourni un code pour une listbox a une seule colonne. Pour l'instant que ce code modifie par vous, ne marche pas, cela n'a pas d'importance.
Il faut exprimer clairement ce que vous souhaitez.
Merci
Votre souhait est-il bien celui-ci:
Afficher dans une listbox de 10 colonnes des informations,avec un tri par ordre alphabetique sur la premiere colonne ( les autres infos doivent suivre le tri), provenant d'une plage de cellules sans faire le tri sur cette plage de cellules.
ccm81 vous a fourni un code pour une listbox a une seule colonne. Pour l'instant que ce code modifie par vous, ne marche pas, cela n'a pas d'importance.
Il faut exprimer clairement ce que vous souhaitez.
Merci
Co_nexion
Messages postés
328
Date d'inscription
lundi 5 mars 2012
Statut
Membre
Dernière intervention
15 juillet 2015
22 mars 2012 à 12:22
22 mars 2012 à 12:22
Oui c'est tout à fait ce que vous résumez.
- Afficher une listbox de dix colonnes (avec entête)
- Faire un tri alphabétique dans la première colonne (les infos des autres colonnes suivant évidemment ce tri)
- Pas de tri sur le tableur excel
Merci pour votre aide
- Afficher une listbox de dix colonnes (avec entête)
- Faire un tri alphabétique dans la première colonne (les infos des autres colonnes suivant évidemment ce tri)
- Pas de tri sur le tableur excel
Merci pour votre aide
f894009
Messages postés
17185
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
15 avril 2024
1 701
22 mars 2012 à 12:50
22 mars 2012 à 12:50
Re,
Dernier detail, cette listbox est sur une feuille de calcul ou un UserForm??
Cela a une importance pour vos desir d'entete de colonnes.
Dernier detail, cette listbox est sur une feuille de calcul ou un UserForm??
Cela a une importance pour vos desir d'entete de colonnes.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
ccm81
Messages postés
10851
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
16 avril 2024
2 404
22 mars 2012 à 14:18
22 mars 2012 à 14:18
ça devrait ressembler à ça
https://www.cjoint.com/?0Cwosea6qEO
bonne suite
https://www.cjoint.com/?0Cwosea6qEO
bonne suite
Co_nexion
Messages postés
328
Date d'inscription
lundi 5 mars 2012
Statut
Membre
Dernière intervention
15 juillet 2015
22 mars 2012 à 14:24
22 mars 2012 à 14:24
Mon entreprise me bloque l'accès, n'aurait tu pas un autre moyen pour que je le consulte.
Merci d'avance
Merci d'avance
ccm81
Messages postés
10851
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
16 avril 2024
2 404
Modifié par ccm81 le 22/03/2012 à 15:12
Modifié par ccm81 le 22/03/2012 à 15:12
voila le code
RQ. on peut s'affranchir de la casse avec la fonction UCase
bonne suite
Const nbcol = 10 Public Sub UserForm_Initialize() Dim plage As String Dim lifin As Long Dim Tablo As Variant, mini As Variant, tempo As Variant Dim n As Long, i As Long, j As Long, c As Long, rangmini As Long lifin = Sheets("CDD").Range("A1").End(xlDown).Row plage = "A1:J" & lifin Tablo = Sheets("CDD").Range(plage).Value n = UBound(Tablo, 1) For i = 1 To n - 1 mini = Tablo(i, 1) For j = i + 1 To n If Tablo(j, 1) < mini Then rangmini = j mini = Tablo(rangmini, 1) End If Next j For c = 1 To nbcol tempo = Tablo(i, c) Tablo(i, c) = Tablo(rangmini, c) Tablo(rangmini, c) = tempo Next c Next i UserForm1.ListBox1.List() = Tablo UserForm1.Show End Sub
RQ. on peut s'affranchir de la casse avec la fonction UCase
bonne suite
Co_nexion
Messages postés
328
Date d'inscription
lundi 5 mars 2012
Statut
Membre
Dernière intervention
15 juillet 2015
22 mars 2012 à 15:51
22 mars 2012 à 15:51
Re,
Merci beaucoup de m'accorder ton aide.
Je viens d'essayer de prendre le code et malheureusement le tri ne marche pas et de plus l'entete est vide. Par contre la listbox est alimentée.
Aurais-tu une idée de la source du problème ?
Encore merci
Merci beaucoup de m'accorder ton aide.
Je viens d'essayer de prendre le code et malheureusement le tri ne marche pas et de plus l'entete est vide. Par contre la listbox est alimentée.
Aurais-tu une idée de la source du problème ?
Encore merci
ccm81
Messages postés
10851
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
16 avril 2024
2 404
23 mars 2012 à 09:29
23 mars 2012 à 09:29
bonjour
comme les entêtes de colonnes nous obligent à lier la listbox à une plage d'une feuille, il n'y a plus tellement besoin de programmer !!!
il te faut faire comme préconise f894009
1. copier ta plage de données dans une feuille
2. trier cette plage selon la colonne 1
3. nommer cette plage plageLB1 par exemple
3. dans les propriétés de la listbox1, lier directement cette plage à la rowsource
bonne journée
comme les entêtes de colonnes nous obligent à lier la listbox à une plage d'une feuille, il n'y a plus tellement besoin de programmer !!!
il te faut faire comme préconise f894009
1. copier ta plage de données dans une feuille
2. trier cette plage selon la colonne 1
3. nommer cette plage plageLB1 par exemple
3. dans les propriétés de la listbox1, lier directement cette plage à la rowsource
bonne journée
f894009
Messages postés
17185
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
15 avril 2024
1 701
21 mars 2012 à 15:54
21 mars 2012 à 15:54
Bonjour,
Il serait plus simple de faire votre tri sur vos cellules par programme
exemple ci-dessous fait avec l'enregistreur de macro
Sub Macro4()
Range("A1:C7").Select
ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("A1:A7"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Feuil1").Sort
.SetRange Range("A1:C7")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
Bonne suite
Il serait plus simple de faire votre tri sur vos cellules par programme
exemple ci-dessous fait avec l'enregistreur de macro
Sub Macro4()
Range("A1:C7").Select
ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("A1:A7"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Feuil1").Sort
.SetRange Range("A1:C7")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
Bonne suite
Co_nexion
Messages postés
328
Date d'inscription
lundi 5 mars 2012
Statut
Membre
Dernière intervention
15 juillet 2015
21 mars 2012 à 16:02
21 mars 2012 à 16:02
Bonjour,
Si j'ai bien compris ce que vous me dites, c'est de trier mes données directement dans mon tableur excel. Mais je ne souhaite faire un tri que dans la listbox tout en gardant ses caractéristiques (premier code)...
Merci en tout cas pour la rapidité
Si j'ai bien compris ce que vous me dites, c'est de trier mes données directement dans mon tableur excel. Mais je ne souhaite faire un tri que dans la listbox tout en gardant ses caractéristiques (premier code)...
Merci en tout cas pour la rapidité
f894009
Messages postés
17185
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
15 avril 2024
1 701
21 mars 2012 à 16:15
21 mars 2012 à 16:15
Re,
Vous pouvez copier cette zone sur une autre feuille et faire le tri.
Autrement votre listbox a combien de colonnes??
Vous pouvez copier cette zone sur une autre feuille et faire le tri.
Autrement votre listbox a combien de colonnes??
Co_nexion
Messages postés
328
Date d'inscription
lundi 5 mars 2012
Statut
Membre
Dernière intervention
15 juillet 2015
21 mars 2012 à 16:20
21 mars 2012 à 16:20
Ma listbox a 10 colonnes mais je ne souhaite que trier la premiere
Modifié par Co_nexion le 22/03/2012 à 16:46
Merci mille fois pour ton code cependant je bloque toujours et ca m'enerve de ne pas y arriver !!!
Alors voila j'ai repris ton code de cette manière sachant que
- Ma feuille se nomme "CDD"
- Ma listbox se nomme listbox1
-Mes dix colonnes vont de A à J
Je pense que je dois faire une erreur au niveau de plage. Je n'ai également pas compris pourquoi tu me parlais de deux feuilles dans ta démonstration précédente. En tout cas un grand merci, j'en apprends beaucoup grâce à vous !
Pour info "erreur d'éxécution 9", l'indice n'appartient pas à la sélection
Modifié par f894009 le 22/03/2012 à 17:02
Tablo = Sheets(CDD).Range(plage).Value
manque les "" si c'est a cet endroit qu'il marque l'erreur
Worksheets("CDD").Range(Cells(2, 1), Cells(11, "c")).Value = Tablo
Me.ListBox1.RowSource = Sheets("CDD").Range(Cells(2, 1), Cells(lifin, "j")).Address
Il faut changer de feuille pour copier les donnees triees sinon reecriture sur les donnees d'origine
Feuille1:
Entete: A1 a C1 a modifier pour 10 colonnes
Plage: de donnees A2 a Cx
Feuille2:
Entete ideme Feuille1: A1 a C1
Plage trie pour RowSource: A2 a Cx pour pouvoir donner les address de plage afin d'avoir les entetes.
22 mars 2012 à 21:36
Cette fois il n'y a plus de bug le userform se lance mais rien ne s'affiche dans la listbox...
23 mars 2012 à 08:05
Pouvez vous mettre votre fichier a dispo?
23 mars 2012 à 09:58
Une simple question : comment puis je mettre le fichier à votre disposition ?