Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Simplifier le Tri Alphabétique d'un ComboBox.

  • Initiateur de la discussion Initiateur de la discussion YANN-56
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

YANN-56

XLDnaute Barbatruc
Bonsoir à tous,

L'exemple joint montre le bon résultat de la méthode, mais je trouve que c'est une usine à gaz!

Avec une ListView; il suffit de lui dire qu'elle soit "Sorted", et c'est tout!
J'ai fouillé pour voir s'il était possible avec un ComboBox de faire aussi simple, mais en vain.

(Je ne manipule pas trop bien ce dernier)

Si cela n'est pas; tant pis! Je ferai avec. Tout en automatisant, bien sûr ce tri.

Merci à vous de me dire s'il y a autres façons expéditives, ou non.

Yann
 

Pièces jointes

Re : Simplifier le Tri Alphabétique d'un ComboBox.

bonsoir,

Proposition:
Code:
Private Sub CommandButton2_Click()
    ComboBox1.Clear
    With Range(Cells(1, 1), Cells(65536, 1).End(xlUp))
        .Sort key1:=.Cells(1, 1), Order1:=xlAscending, Header:=xlNo
        ComboBox1.List = .Value
    End With
End Sub

Tri de la plage source, si tu veux la conserver dans son état original:
1 - soit tu lui rajoutes une colonne avec un ordre de ligne (1,2,3,....) sur laquelle tu pourras la re - trier au sortir du userForm.

2 - soit tu en fais une copie à l'initialisation du userform dans une endroit quelconque de la feuille, copie que tu trieras à volonté.

A+
 
Re : Simplifier le Tri Alphabétique d'un ComboBox.

Bonjour Yann56,
il est déconseillé d'utiliser un tri de ce type car il est vraiment très lent (teste sur une plage de 500 lignes et tu comprendras).
Si tu veux utiliser un algo te permettant le tri, est préférable de passer par un Quick sort :

Code:
Private Sub CommandButton2_Click()
Dim temp(), DerLig&
    ComboBox1.Clear
    DerLig = Range("A" & Rows.Count).End(xlUp).Row
    For i = 1 To DerLig
    ReDim Preserve temp(1 To DerLig)
    temp(i) = Cells(i, 1)
    Next i
    Call tri(temp, LBound(temp), UBound(temp))
    ComboBox1.List = temp
End Sub
Sub tri(a, gauc, droi) ' Quick sort
  ref = a((gauc + droi) \ 2)
  g = gauc: d = droi
  Do
    Do While a(g) < ref: g = g + 1: Loop
    Do While ref < a(d): d = d - 1: Loop
    If g <= d Then
      temp = a(g): a(g) = a(d): a(d) = 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

Regarde ici sur le site de JB des exemples de tri.

Sinon, j'aime bien la solution de Hasco🙂.
Si tu veux éviter la copie temporaire de ta plage, tu peux la stocker dans un array et la restituer à la fin :
Code:
Private Sub CommandButton2_Click()
a = Range(Cells(1, 1), Cells(65536, 1).End(xlUp))
    ComboBox1.Clear
    With Range(Cells(1, 1), Cells(65536, 1).End(xlUp))
        .Sort key1:=.Cells(1, 1), Order1:=xlAscending, Header:=xlNo
        ComboBox1.List = .Value
    End With
Cells(1, 1).Resize(UBound(a)) = a
End Sub
A+
 
Re : Simplifier le Tri Alphabétique d'un ComboBox.

Merci Hasco🙂 pour la promptitude et la pertinence de ta réponse,

En réalité, le chargement du ComboBox est issu d'une ListView présente dans un autre USF.

J'avais jusqu'à présent procédé, comme tu le fais sur la feuille, par le tri préalable de cette dernière.
(USF_2.ListView1.SortKey = 2, par exemple.... Le Combo étant chargé des SubItem(3)

Mais, là, ayant plusieurs ComboBoxes cela devient un roman dans mon code.

Ce que je n'ai pas dit, est que le but final est d'éviter les doublons dans les Comboxes.

Donc, mon idée était de classer alphabétiquement les Items (D'où sujet de ma question),
puis de supprimer ceux identiques à leur précédent.

Je pense ne pas pouvoir simplifier la méthode en passant outre ce que j'ai appelé "Usine à gaz".

Grace à toi je vais faire utile, sans perdre mon temps à chercher où il n'y a pas lieu de le faire.

Merci encore, et bonne soirée à toi,

Amicalement,

Yann

Pardon David84🙂 ,je n'avais pas vu ton post.
Ma réponse reste dans le même esprit que celle que j'ai faite à Hasco.
Plein de bonnes chose à toi en cette soirée.
 
Dernière édition:
Re : Simplifier le Tri Alphabétique d'un ComboBox.

Re🙂
Ce que tu demandes est vraiment différent de l'exemple présenté dans ton fichier.
Pour pouvoir te répondre avec précision il faudrait un fichier exemple correspondant à ta demande.
De toutes les façons, le type de tri utilisé n'est pas le plus rapide (loin s'en faut) et le quick sort me semble plus adapté (si bien sûr tu as une plage de traitement qui devient conséquente).
A+
 
Re : Simplifier le Tri Alphabétique d'un ComboBox.

Re david, Hasco, et à ceux qui passeront par ici,

Tu as raison, mais je ne cherchais au départ que le tri Alphabétique du ComboBox.

Je vais construire un exemple avec une ListView, et tenter de soumettre concrètement ma recherche.

J'espère ne pas être trop dérangé, et pouvoir le faire rapidement.

Merci encore, et à plus tard,

Yann
 
Re : Simplifier le Tri Alphabétique d'un ComboBox.

Re à tous,

Voici donc après un apéro sympa; mon Classeur reconstruit.
(Pour moi, il est un peu trop tard de le faire quant à ma tronche!🙄)

Le rêve serait de charger, sans doublon, les Comboboxes, et de surcroit en un tri alphabétique.

Avec en plus l'interdiction totale de toucher par un Tri la ListView!!!!

Interdiction de fumer! Je récupère les copies dans une heure! 😛😛😛

Amicalement, avec un grand sourire,

Yann

P.S. Diantre! Que vais-je avoir l'air idiot si l'on m'offre une solution!
Mes "Merci" seront à l'échelle de ma confusion!
 
Re : Simplifier le Tri Alphabétique d'un ComboBox.

Re David,

"Je t'avais bien dit qu'il fallait ajouter de l'eau!!!" 😱

Désolé: Mon étourderie maladive.

Entre temps, j'ai balancé le Classeur intermédiaire, et j'en suis à ce dernier.

J'ai trouvé comme astuce d'utiliser une ListView non visible qui elle sait faire un tri sans complications.

Je charge donc les ComboBoxes sans doublons, et classés par ordre alphabétique.

Je n'ai pas encore testé avec une longue liste, mais je pense que la rapidité doit être acceptable.

Qu'en penses-tu?

Amicalement, et au plaisir de te lire,

Yann
 

Pièces jointes

Re : Simplifier le Tri Alphabétique d'un ComboBox.

Bonjour YANN-56, Hasco, David84,

Un exemple ici qui me semble rapide en gardant le filtre sans doublon d'Excel.


Edit : j'ai oublié de corriger le Iif(t=0, ... ) qui est tout naze en plaçant correctement le .offset(,2 * t) au bon endroit, mais bon le principe est là.
 

Pièces jointes

Dernière édition:
Re : Simplifier le Tri Alphabétique d'un ComboBox.

Bonsoir à tous
j'ai mis au point ce système général qui s'avère très pratique pour les ComboBox
J'en suis à 3 problèmes réglés avec ça !

P.S. Au premier abord ça peut paraître usine à gaz, mais pas là ou on l'utilise :
VB:
Dim Paquet() As Variant
Paquet = PaquetSsDbl(Range("A1:A" & Cells(65536, 1).End(xlUp).Row))
ComboBox1.List = Paquet(0)
Et en prime on retrouve facilement après choix les numéro de lignes d'origine dans Paquet(1)(ComboBox1.ListIndex + 1)
pas besoin de ré-chercher l'information à mettre à jour par exemple.

Cordialement
 

Pièces jointes

Dernière édition:
Re : Simplifier le Tri Alphabétique d'un ComboBox.

Bonjour,

Softmama:
Cela me convainc d'accepter d'écrire sur une feuille, ainsi qu'il a été suggéré ci-dessus.
(Qui au passage t'a valu un "Like" de Hasco. Ce qui est une référence!)

Dranreb:
Bigre de Bigre, me voici bordé! Je vais avoir m'occuper pour mes soirées d'hiver!😛
Quand j'aurai tout compris; je pense que je serai un peu plus grand!🙂

Je ne vais pas manquer d'éplucher ce grand morceau de symphonie codissimantesque.
(Qui au passage t'a valu un "Like" de Staple. Ce qui est, itou, une référence!)

J'ai donc solutions à ma question.

Hasco, david84, Softmama, Dranreb:🙂🙂🙂🙂

Je vous en remercie tous très sincèrement,

Amicalement,

Yann

P.S. Je vais tester l'ensemble dans mon application en cours,
et je déposerai ici un exemple adapté à une ListView Source.
Au cas où cela puisse servir à quelqu'un.
 
Re : Simplifier le Tri Alphabétique d'un ComboBox.

Re à tous,

Voici appliqué dans le cas d'une Source ListeView (Si cela pouvait servir à quelqu'un)

L'astuce est d'ajouter une Colonne qui va garder en mémoire l'état initial de celle-ci.
(J'avais dans mon cas besoin de le conserver pour autres visualisations ultérieures)

Ceci est certainement un gros bidouillage, qui ne correspond qu'à un besoin ponctuel!

J'aurai, en tous les cas, beaucoup appris quant à l'utilisation d'une Feuille "Source" et son Tri Alpha.
J'ai même découvert "RowSource"! C'est vous dire combien vous m'avez bien aidé.
Il est évident que je m'y référerai pour les besoins futurs.

Amicalement, en vous renouvelant mes remerciements.🙂

Yann
 

Pièces jointes

Re : Simplifier le Tri Alphabétique d'un ComboBox.

Bonjour,

2 de plus (à partir du fichier fourni et sans développement excessif ):
  1. pour le premier cas, utilisation de la seconde liste pour trier et une autre façon classique pour ne pas avoir de doublon (ComboBox).
  2. pour le second, utilisation de la seconde liste pour trier et une autre façon (Dictionary) pour ne pas avoir de doublon.
Le rajout d'une multitude de lignes permet de constater que l'initialisation (ligne par ligne) de la ListView prédomine et que le second cas est plus rapide pour l'élimination des doublons.
(Pas testé les autres propositions dans ce cadre et pas cherché si l'on peut initialiser une ListView autrement).
 

Pièces jointes

Dernière édition:
Re : Simplifier le Tri Alphabétique d'un ComboBox.

Bonjour tout le monde,
ci-joint proposition combinant un dictionnaire et un quick sort :

Code:
Private Sub UserForm_Initialize()
Dim i&, j&, DerLig&, Mondico, a, temp
Set Mondico = CreateObject("Scripting.Dictionary")
For i = 1 To 2
  DerLig = Cells(Rows.Count, i).End(xlUp).Row
  a = Range(Cells(2, i), Cells(DerLig, i)) '
  For j = LBound(a) To UBound(a)
    If a(j, 1) <> "" Then Mondico(a(j, 1)) = ""
  Next j
  '--tri
  temp = Mondico.keys
  Call Tri(temp, LBound(temp), UBound(temp))
  Controls("ComboBox" & i).List = temp: temp = "": Mondico.RemoveAll
  Next i
End Sub

Sub Tri(a, gauc, droi) ' Quick sort
Dim ref, g, d, temp
  ref = a((gauc + droi) \ 2)
  g = gauc: d = droi
  Do
     Do While a(g) < ref: g = g + 1: Loop
     Do While ref < a(d): d = d - 1: Loop
     If g <= d Then
        temp = a(g): a(g) = a(d): a(d) = 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
A+
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…