Programmer en vb
Bonjour et bienvenue,

vous venez de vous inscrire et vous souhaitez avoir accès aux différents forum.
il vous suffit alors de poster une présentation sur le forum "Présentation" ou divers sujets
votre accès aux autres forums sera automatiquement autorisé.

A vos claviers :

Merci d'avoir pris le temps de lire.
Merci pour votre inscription.

L'équipe de Programmer-en-VB
Qui est en ligne ?
Il y a en tout 1 utilisateur en ligne :: 0 Enregistré, 0 Invisible et 1 Invité

Aucun

Statistiques
Nous avons 120 membres enregistrésL'utilisateur enregistré le plus récent est TutoariiNos membres ont posté un total de 6300 messagesdans 706 sujets
Recherche dans les forums

Utiliser cette méthode afin de trouver rapidement les discussions disponible sur notre forum.


Utiliser le bouton résolu

Dans votre message d'origine
cliquer sur le bouton



Ensuite tout en bas sur
Modifier le titre du sujet
cliquer sur le bouton

Résolu !!!

Ensuite changer l’icône du sujet par le bouton

Voilà pas plus compliqué que cela.


Merci pour votre présence ou passage sur le site de programmer-en-vb

Partenaires

créer un forum



Annuaire referencement


Flux RSS

MSN 
Novembre 2018
LunMarMerJeuVenSamDim
   1234
567891011
12131415161718
19202122232425
2627282930  

Calendrier


Partagez
Aller en bas
avatar
grisan29
Modérateur
Modérateur
Localisation : BRETAGNE Nord 29
Messages : 838
Date d'inscription : 25/07/2013
http://pascalcuisines.fr

combobox sur userform qui tri

le Mar 21 Juin - 8:07
bonjour a tous et toutes

voici un code qui permet a une combobox posée sur un userform de faire le tri dans sa liste déroulante afin de choisir correctement sa ligne
il n'y a aucune action de prévu juste le tri de la colonne A à l'initialisation de l'useform


Code:
Private Sub UserForm_Initialize()
    Dim c As Variant, m As Object, temp()
    Set m = CreateObject("Scripting.Dictionary")
    For Each c In Range("a3:a" & Cells(Rows.Count, 1).End(xlUp).Row)
        m(c.Value) = c.Value
        Next c
        temp = m.items
        Call tri(temp, LBound(temp), UBound(temp))
        Me.ComboBox1.list = temp
    End Sub
    Sub tri(a, gauc, droi)
        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

_________________
Pascal
http://vbaddict.altervista.org/Fichier_upload/grisan29/13.php

Comment mettre votre sujet en résolu.
 
Dans votre message d'origine

cliquer sur le bouton



Ensuite tout en bas sur 
Modifier le titre du sujet 
cliquer sur le bouton 

Résolu !!!

avatar
IFFIC
Step_Three_VBA
Step_Three_VBA
Localisation : Sud Breizh ar mor
Messages : 443
Date d'inscription : 25/05/2013

Re: combobox sur userform qui tri

le Ven 1 Juil - 17:55
Bonjour Pascal et à tous, ou Bonsoir suivant l'heure,

Tu nous offres des exemples de procédure qui sont fort intéressants. Smile

Dommage que ceux passant par-là, comme je n'en doute en les copiant, oublient de te déposer un Merci.

Dans le cas présent, je dois mettre en garde sur ce code, car en ayant fait l'expérience pour des ComboBoxes ou des ListBoxes,
j'ai constaté que le résultat était imparfait. Notamment au niveau des X, Y et Z.

Bien que j'aie une sainte horreur de travailler sur des feuilles, je les utilise dans ce cas,
car le résultat est imparable et la perte d'une poignée de millisecondes n'est pas grave!

A noter que d'utiliser une valeur numérique pour définir les colonnes d'une feuille est plus confortable,
car il devient alors possible de les mettre en variante. "1" vaut mieux que "A"

Ce qui veut dire que l'on peut cibler à souhait l'emplacement des colonnes, leur longueur et le critère de tri.

Au passage, encore un coup de pieds à la foultitude "Set Maplage",  "Dim Derligne",
et autres qui sont foison dans les aides et qui nous embrouillent.

Voici ma façon de faire:
Si vous enlevez mes commentaires, il ne reste plus beaucoup d'écriture à se farcir.

Code:
Private Sub UserForm_Initialize() 'On charge le Combo à l'ouverture de l'USF(Ici, pour l'exemple)
COL_GAUCHE = 1: COL_DROITE = 2 'Les données étant en A et B (C.A.D. "Columns 1 et 2")
With ActiveSheet
Me.ComboBox1.List = .Range(Cells(1, COL_GAUCHE), Cells(.Columns(COL_DROITE).End(xlDown).Row, COL_DROITE)).Value
End With
Me.ComboBox1.ListIndex = 0 'Pour avoir la première ligne proposée
End Sub

Private Sub CommandButton2_Click() ' TRI ALPHABETIQUE
COL_GAUCHE = 6: COL_DROITE = 7 'On se sert de colonnes vides (Eventuellement dans une autre page)
With ActiveSheet
' On copie le contenu dans une feuille
        For i = 1 To Me.ComboBox1.ListCount
        .Cells(i, COL_GAUCHE).Value = Me.ComboBox1.List(i - 1, 0)
        .Cells(i, COL_DROITE).Value = Me.ComboBox1.List(i - 1, 1)
        Next i
' On fait le tri alphabétique suivant la colonne 6 et la 7 suivra
  .Range(Cells(1, COL_GAUCHE), Cells(.Columns(COL_DROITE).End(xlDown).Row, COL_DROITE)) _
  .Sort key1:=Range(Cells(1, COL_GAUCHE), (Cells(.Columns(COL_DROITE).End(xlDown).Row, COL_DROITE)))
' On charge le Combo, cette fois trié
  Me.ComboBox1.List = .Range(Cells(1, COL_GAUCHE), Cells(.Columns(COL_DROITE).End(xlDown).Row, COL_DROITE)).Value
 ' On efface cet écrit qui n'a plus lieu d'être
.Range(Cells(1, COL_GAUCHE), Cells(.Columns(COL_DROITE).End(xlDown).Row, COL_DROITE)).ClearContents
End With
Me.ComboBox1.ListIndex = 0 'Pour avoir la première ligne proposée
End Sub

Le Classeur pour tester est ici:
http://www.cjoint.com/c/FGbpTtagdnq

 Amicalement,

Yves
Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum