combobox alphabétique

josothy

XLDnaute Junior
bonjour,

je vais vous demander quelque chose qui a déja été demander mais j'ai un peu de mal a adapter les macro que j'ai trouver a mon prog. je voudrais que mon combobox soit trier par ordre alphabétique sans que sa change l'ordre de mes ligne dans la feuille.

Merci de votre attention
 

Pièces jointes

  • josothy.zip
    31.7 KB · Affichages: 33
  • josothy.zip
    31.7 KB · Affichages: 36
  • josothy.zip
    31.7 KB · Affichages: 35

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : combobox alphabétique

Bonjour,


Code:
Private Sub UserForm_Initialize()
  Dim temp()
  With Sheets("données")
    temp = Range(.[A2], .[A65000].End(xlUp))
  End With
  Call tri(temp, 1, UBound(temp, 1))
  Me.RechNom.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

JB
Formation Excel VBA JB
 

Dull

XLDnaute Barbatruc
Re : combobox alphabétique

Salut josothy, kjin:), Jacques:), le Forum

Une autre façon de faire

Code:
Private Sub UserForm_Initialize()
Dim X As Byte, Y As Byte
Dim temp As String
IniCombo
With RechNom
For X = 0 To .ListCount - 1
    For Y = 0 To .ListCount - 1
        If .List(X) < .List(Y) Then
            temp = .List(X)
            .List(X) = .List(Y)
            .List(Y) = temp
        End If
    Next Y
    Next X
End With
End Sub
Bonne Journée
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : combobox alphabétique

Temps :10 sec pour 1000 éléments

Code:
Private Sub UserForm_Initialize()
Dim X As Byte, Y As Byte
Dim temp As String
IniCombo
With RechNom
For X = 0 To .ListCount - 1
    For Y = 0 To .ListCount - 1
        If .List(X) < .List(Y) Then
            temp = .List(X)
            .List(X) = .List(Y)
            .List(Y) = temp
        End If
    Next Y
    Next X
End With
End Sub

Temps: 0,05 s pour 5000 éléments

Code:
Private Sub UserForm_Initialize()
  Dim temp()
  With Sheets("données")
    temp = Range(.[A2], .[A65000].End(xlUp))
  End With
  Call tri(temp, 1, UBound(temp, 1))
  Me.RechNom.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

JB
 

Hulk

XLDnaute Barbatruc
Re : combobox alphabétique

Hello les amis,

Bravo pour ces codes messieurs !

Perso, la seule différence entre vos deux codes que je constate, c'est que la version à Dull, n'a pas de doublons.

Mais les deux sont utiles et classes !

Cdt, Hulk.
 

Hulk

XLDnaute Barbatruc
Re : combobox alphabétique

Re,

Pardon me suis trompé, les deux sont identiques (point de vue résultat)

C'est que dans ma version je commence ma liste à A1, alors dans la version à Boisgontier, j'avais bien modifié Range(.[A1], .[A65000].End(xlUp))

Alors que dans la version à Dull, j'avais oublié de modifier
dans IniCombo le 1 To 1, et comme ma liste commencais à A1...

Bref, je me comprends, autant pour moi :D

Cdt, Hulk.
 

josothy

XLDnaute Junior
Re : combobox alphabétique

rebonjour,

Bon j'ai mis vos code dans mon prog et je me suis rendu compte que tout marchait bien pour le tri mais que quand apres je selectionnais un nom dans le combobox et que je voulais modifier les données ca s'enregistrait a la place d'un autre en gros sa l'écrasai et donc apres il y a deux ligne au meme nom et un nom qui a disparu.

J'espere que j'ai réussi a etre clair.

Bonne journée
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : combobox alphabétique

73 sec pour 1000 éléments

Code:
Private Sub UserForm_Initialize()
t = Timer
'IniCombo
Dim c As Range
Dim tablo()
Dim i As Integer, j As Integer
Dim temp As String
Dim present As Boolean
ReDim tablo(1 To 1)
tablo(1) = Cells(1, 1)
For Each c In Sheets("données").Range("A1:A" & Range("a65536").End(xlUp).Row)
    present = False
    For i = 1 To UBound(tablo)
        If tablo(i) = c Then present = True
    Next i
    If Not present Then
        ReDim Preserve tablo(1 To UBound(tablo) + 1)
        tablo(UBound(tablo)) = c
    End If
    For i = 1 To UBound(tablo)
        For j = 1 To UBound(tablo)
            If tablo(i) < tablo(j) Then
                temp = tablo(i)
                tablo(i) = tablo(j)
                tablo(j) = temp
            End If
        Next j
    Next i
Next c
MsgBox Timer() - t
RechNom.List = tablo
End Sub

JB
 

Discussions similaires

Réponses
13
Affichages
179

Statistiques des forums

Discussions
312 671
Messages
2 090 763
Membres
104 658
dernier inscrit
amomo