IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Discussion :

[DEBUTANT - VBA] Problèmes de ComboBox [FAQ]


Sujet :

VBA

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 10
    Points : 5
    Points
    5
    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 ?

  2. #2
    Membre éclairé
    Avatar de Catbull
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    542
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 542
    Points : 854
    Points
    854
    Par défaut
    Ceci devrait faire l'affaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    Elements(Index - 1) = Liste.List(Index)
    Cela vient-il peut-être du fait que j'ai mal appelé la fonction ?

  4. #4
    Membre éclairé
    Avatar de Catbull
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    542
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 542
    Points : 854
    Points
    854
    Par défaut
    Comment appelles-tu la fonction TrierControlListe?

    Tu passes en paramètre un contrôle de type ComboBox?

  5. #5
    Membre éclairé
    Avatar de Catbull
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    542
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  6. #6
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Merci infiniment, ton code marche parfaitement en ce qui concerne le tri et les vides, mais il ne s'occupe pas des doublons... ?

  7. #7
    Membre éclairé
    Avatar de Catbull
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    542
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 542
    Points : 854
    Points
    854
    Par défaut
    Un oublie de ma part. Modifies la fonction SetElements et ajoute la fonction isElement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  8. #8
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Grandiose, ca marche parfaitement !

    Mille mercis !

  9. #9
    Futur Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    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

  10. #10
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    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 ?

  11. #11
    HPJ
    HPJ est déconnecté
    Membre averti

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2003
    Messages : 260
    Points : 364
    Points
    364
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
            If Val(Elements(Index)) > Val(Elements(Index + 1)) Then

  12. #12
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
            If Val(Elements(Index)) > Val(Elements(Index + 1)) Then
    En effet, c'était en fait très simple...

    Merci bcp pour ton aide !

    A+

  13. #13
    Membre éclairé
    Avatar de Catbull
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    542
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 542
    Points : 854
    Points
    854
    Par défaut
    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..

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 30
    Points : 11
    Points
    11
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

Discussions similaires

  1. [debutant][jope] problèmes à l'installation
    Par johnAlpha33 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 04/12/2004, 13h06
  2. [Debutant(e)]problème de variable d'environnement
    Par tolsam dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 12/08/2004, 19h08
  3. [Debutant(e)] Problème fichier texte et vue
    Par solenn dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 21/07/2004, 09h23
  4. [Requete SQL en VBA] Problème avec la fonction FLOOR
    Par zubral dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/07/2004, 13h24
  5. [debutant][Gregoriancalendar] Problème avec le set
    Par britou dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 30/06/2004, 16h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo