Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Général VBA
Général VBA Forum général VBA . Pour les logiciels spécifiques (Access, Excel, Word, ...), postez dans les bons sous forums.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/08/2004, 09h41   #1
Invité de passage
 
Inscription : mai 2004
Messages : 10
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 10
Points : 2
Points : 2
Envoyer un message via MSN à _Maniak
Par défaut [DEBUTANT - VBA] Problèmes de ComboBox

Bonjour,

Je cerche un code propre qui me permettrais de trier, enlever les doublons et les entrées vides d'une ComboBox.

Est-ce que qqn a ça ?
_Maniak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2004, 09h50   #2
Membre chevronné
 
Avatar de Catbull
 
Inscription : avril 2003
Messages : 542
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations forums :
Inscription : avril 2003
Messages : 542
Points : 767
Points : 767
Ceci devrait faire l'affaire :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Public Function TrierControlListe(Liste As ComboBox) As Integer
    Dim Elements() As String
 
    SetElements Elements, Liste
    TrierListe Elements
    PutElements Elements, Liste
End Function
 
Private Function TrierListe(ByRef Elements() As String)
    'ALGORITHME DE TRIE A BULLES
 
    Dim Index As Integer
    Dim tmpElement As String
 
    For Index = LBound(Elements) To UBound(Elements) - 1
        If Elements(Index) > Elements(Index + 1) Then
            tmpElement = Elements(Index)
            Elements(Index) = Elements(Index + 1)
            Elements(Index + 1) = tmpElement
 
            Index = Index - 2
            If Index = LBound(Elements) - 2 Then Index = LBound(Elements)
        End If
    Next Index
 
End Function
 
Private Function SetElements(ByRef Elements() As String, Liste As ComboBox)
    Dim Index As Integer
 
    ReDim Elements(Liste.ListCount - 1)
    For Index = 0 To Liste.ListCount - 1
        Elements(Index) = Liste.List(Index)
    Next Index
End Function
 
Private Function PutElements(ByRef Elements() As String, Liste As ComboBox)
    Dim Index As Integer
 
    Liste.Clear
    For Index = LBound(Elements) To UBound(Elements)
        If Trim(Elements(Index)) <> vbNullString Then Liste.AddItem Elements(Index)
    Next Index
End Function
__________________
CatBull - Modérateur VB
Catbull est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2004, 11h38   #3
Invité de passage
 
Inscription : mai 2004
Messages : 10
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 10
Points : 2
Points : 2
Envoyer un message via MSN à _Maniak
Merci, c'est vraiment super !

Toutefois, j'ai une erreur 381 : "Impossible de lire la propriété List. Index de la table de propriétés non valide.
Ca se trouve à cette ligne :

Code :
Elements(Index - 1) = Liste.List(Index)
Cela vient-il peut-être du fait que j'ai mal appelé la fonction ?
_Maniak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2004, 11h45   #4
Membre chevronné
 
Avatar de Catbull
 
Inscription : avril 2003
Messages : 542
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations forums :
Inscription : avril 2003
Messages : 542
Points : 767
Points : 767
Comment appelles-tu la fonction TrierControlListe?

Tu passes en paramètre un contrôle de type ComboBox?
__________________
CatBull - Modérateur VB
Catbull est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2004, 11h51   #5
Membre chevronné
 
Avatar de Catbull
 
Inscription : avril 2003
Messages : 542
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations forums :
Inscription : avril 2003
Messages : 542
Points : 767
Points : 767
Il faut modifier la fonction SetElements. Le premier élément d'un ComboBox est indexé à 0...

Code :
1
2
3
4
5
6
7
8
Private Function SetElements(ByRef Elements() As String, Liste As ComboBox)
    Dim Index As Integer
 
    ReDim Elements(Liste.ListCount - 1)
    For Index = 0 To Liste.ListCount - 1
        Elements(Index) = Liste.List(Index)
    Next Index
End Function
PS : C'est de ma faute, j'aurais du tester la fonction avant de poster...
__________________
CatBull - Modérateur VB
Catbull est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2004, 12h27   #6
Invité de passage
 
Inscription : mai 2004
Messages : 10
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 10
Points : 2
Points : 2
Envoyer un message via MSN à _Maniak
Merci infiniment, ton code marche parfaitement en ce qui concerne le tri et les vides, mais il ne s'occupe pas des doublons... ?
_Maniak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2004, 13h35   #7
Membre chevronné
 
Avatar de Catbull
 
Inscription : avril 2003
Messages : 542
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations forums :
Inscription : avril 2003
Messages : 542
Points : 767
Points : 767
Un oublie de ma part. Modifies la fonction SetElements et ajoute la fonction isElement :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Private Function SetElements(ByRef Elements() As String, Liste As ComboBox) As Integer
    Dim Index As Integer
 
    For Index = 0 To Liste.ListCount - 1
        If Not isElement(Elements, Liste.List(Index)) Then
            ReDim Preserve Elements(SetElements)
            Elements(SetElements) = Trim(Liste.List(Index))
            SetElements = SetElements + 1
        End If
    Next Index
End Function
 
Private Function isElement(ByRef Elements() As String, Element As String) As Boolean
    Dim Index As Integer
 
    On Error GoTo ListeVide
 
    isElement = True
    For Index = LBound(Elements) To UBound(Elements)
        If Elements(Index) = Trim(Element) Then Exit Function
    Next Index
 
ListeVide:
    isElement = False
End Function
__________________
CatBull - Modérateur VB
Catbull est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2004, 13h44   #8
Invité de passage
 
Inscription : mai 2004
Messages : 10
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 10
Points : 2
Points : 2
Envoyer un message via MSN à _Maniak
Grandiose, ca marche parfaitement !

Mille mercis !
_Maniak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2004, 14h58   #9
Invité de passage
 
Inscription : juillet 2004
Messages : 7
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 7
Points : 3
Points : 3
J'ai le même probléme et maintenant c'est résolu.
Catbull, tu devrais mettre ces quelques lignes sur la page consacrées aux codes sources car je pense que cela peur être intéressant pour d'autre menbre
Tcmat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2004, 10h32   #10
Invité de passage
 
Inscription : mai 2004
Messages : 10
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 10
Points : 2
Points : 2
Envoyer un message via MSN à _Maniak
Re !

Dis voir catbull, je viens de constater que si on a par exemple une valeur 716, et après une valeur 72, le 72 reste après...
N'y-a-til pas la possibilité de gérer ça ?
_Maniak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2004, 10h50   #11
HPJ
Membre confirmé
 
Inscription : mai 2003
Messages : 260
Détails du profil
Informations personnelles :
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : mai 2003
Messages : 260
Points : 239
Points : 239
Au lieu de tester une chaine de caractères il faut que tu testes leur valeur.
Le plus propre est de tout refaire avec un tableau d'Integer...
Le plus rapide:
Code :
        If Val(Elements(Index)) > Val(Elements(Index + 1)) Then
__________________
Avant de poser une question, merci de chercher dans les rubriques suivantes:
FAQ VB
Tutoriaux VB
Recherche avancée sur le forum
HPJ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2004, 10h58   #12
Invité de passage
 
Inscription : mai 2004
Messages : 10
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 10
Points : 2
Points : 2
Envoyer un message via MSN à _Maniak
Citation:
Envoyé par HPJ
Au lieu de tester une chaine de caractères il faut que tu testes leur valeur.
Le plus propre est de tout refaire avec un tableau d'Integer...
Le plus rapide:
Code :
        If Val(Elements(Index)) > Val(Elements(Index + 1)) Then
En effet, c'était en fait très simple...

Merci bcp pour ton aide !

A+
_Maniak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2004, 11h21   #13
Membre chevronné
 
Avatar de Catbull
 
Inscription : avril 2003
Messages : 542
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations forums :
Inscription : avril 2003
Messages : 542
Points : 767
Points : 767
En effet mon code tiens compte de l'ordre lexicographique et non de l'ordre numérique. La propriété Text renvoie un objet String..
__________________
CatBull - Modérateur VB
Catbull est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2006, 10h02   #14
Invité de passage
 
Inscription : novembre 2005
Messages : 30
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 30
Points : 4
Points : 4
Par défaut Passage de paramètres

Bonjour,
Je souhaite utiliser la fonction de tri mais que dois-je mettre en paramètres

Mon début de code :
Code :
1
2
3
4
5
6
7
 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Tblo1 As Variant
Tblo1 = Range("a1:a11")
Me.ComboBox1.Clear
Me.ComboBox1.List = Tblo1
TrierControlListe ()
Le code proposé pour trier ma liste commence par :

Code :
1
2
 
Public Function TrierControlListe(Liste As ComboBox) As Integer
Je ne sais pas quoi mettre car comprends pas (liste as combobox) as integer.

Merci pour le tuyau.
brethomeau est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h55.


 
 
 
 
Partenaires

Hébergement Web