Tri d'une ListBox dans un UserForm

JNP

XLDnaute Barbatruc
Bonjour :),
Dans un UserForm, je crée une liste des feuilles de mon classeur en utilisant un "For Each" et en créant un item pour celles qui m'intéressent. Le problème est qu'elles arrivent dans l'ordre où elle sont et non par ordre alphabétique. En cherchant sur le forum, j'ai trouvé une macro, mais elle utilise une feuille de calcul pour trier la liste alors que je souhaiterais le faire directement dans mon "UserForm_Initialize". Ou alors, il me faudrait une solution pour classer les feuilles par ordre alphabétique avant de générer ma liste.
Merci d'avance :eek:
 

Catrice

XLDnaute Barbatruc
Re : Tri d'une ListBox dans un UserForm

Bonjour,

ci-joint un exemple traité dans un Fil précedent.


Public Function Liste(MaZone)
Dim Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
On Error Resume Next
For Each X In MaZone
Dic.Add X.Value, X.Row
Next
Liste = TrieTablo(Dic.Keys)
End Function



Public Function TrieTablo(tablo)
Dim i As Integer
Dim j As Integer
Dim temp
For i = 0 To UBound(tablo)
For j = 0 To UBound(tablo)
If tablo(i) < tablo(j) Then temp = tablo(i): tablo(i) = tablo(j): tablo(j) = temp
Next j
Next i
TrieTablo = tablo
End Function
 

Pièces jointes

  • Tri combo sans doublon avec Dictionnary.zip
    22.6 KB · Affichages: 88

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Tri d'une ListBox dans un UserForm

Bonjour,


Listes Triées

Private Sub UserForm_Initialize()
Dim temp()
temp = Range("liste3") ' liste tableau temp (1 To n,1 To 1) ou temp = Range([B2], [B2].End(xlDown))
Call tri(temp, 1, UBound(temp, 1))
Me.ListBox1.List = temp
End Sub

Sub tri(a(), gauc, droi) ' Quick sort
ref = a((gauc + droi) \ 2, 1)
g = gauc: d = droi
Do
Do While a(g, 1) < ref: g = g + 1: Loop
Do While ref < a(d, 1): d = d - 1: Loop
If g <= d Then
temp = a(g, 1): a(g, 1) = a(d, 1): a(d, 1) = temp
g = g + 1: d = d - 1
End If
Loop While g <= d
If g < droi Then Call tri(a, g, droi)
If gauc < d Then Call tri(a, gauc, d)
End Sub

Objet dictionary

JB
Formation Excel VBA JB
 

JNP

XLDnaute Barbatruc
Re : Tri d'une ListBox dans un UserForm

Merci beaucoup, j'ai finalement utilisé le code que vous m'avez proposé :
Function TrieTableau(Tableau)
Dim I As Integer
Dim J As Integer
Dim Temporaire
For I = 0 To UBound(Tableau)
For J = 0 To UBound(Tableau)
If Tableau(I) < Tableau(J) Then Temporaire = Tableau(I): Tableau(I) = Tableau(J): Tableau(J) = Temporaire
Next J
Next I
TrieTableau = Tableau
End Function

et j'ai retravaillé mon tri de feuille ainsi :
Private Sub UserForm_Initialize()
Dim N As Integer, Tableau() As String
Select Case Worksheets.Count
Case 4
ReDim Tableau(1)
N = 1
Case 5
ReDim Tableau(2)
N = 2
Case 6
ReDim Tableau(3)
N = 3
Case 7
ReDim Tableau(4)
N = 4
Case 8
ReDim Tableau(5)
N = 5
Case 9
ReDim Tableau(6)
N = 6
Case 10
ReDim Tableau(7)
N = 7
Case 11
ReDim Tableau(8)
N = 8
Case 12
ReDim Tableau(9)
N = 9
Case 13
ReDim Tableau(10)
N = 10
Case 14
ReDim Tableau(11)
N = 11
Case 15
ReDim Tableau(12)
N = 12
Case 16
ReDim Tableau(13)
N = 13
Case 17
ReDim Tableau(14)
N = 14
Case 18
ReDim Tableau(15)
N = 15
Case 19
ReDim Tableau(16)
N = 16
Case 20
ReDim Tableau(17)
N = 17
End Select
Dim Feuille As Worksheet, Elément As String, M As Integer
M = 1
For Each Feuille In ActiveWorkbook.Worksheets
If Left(Feuille.Name, 2) = "HS" And Feuille.Name <> "HSRéférence" Then
Elément = (Right(Feuille.Name, Len(Feuille.Name) - 2))
Tableau(M) = Elément
M = M + 1
End If
Next Feuille
Tableau = TrieTableau(Tableau)
For M = 1 To N
ListePersonnes.AddItem Tableau(M)
Next M
ListePersonnes.ListIndex = 0
End Sub

Et ça fonctionne!!!
Encore merci à tous :cool:
 

Discussions similaires

Réponses
4
Affichages
295

Statistiques des forums

Discussions
312 198
Messages
2 086 107
Membres
103 120
dernier inscrit
83400ren