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

Macros et VBA Excel Discussion :

Creation d'une listbox sans doublons


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2017
    Messages : 57
    Par défaut Creation d'une listbox sans doublons
    Bonjour à tous,

    J'ai créé une ListBox dans laquelle plusieurs éléments se répètent, j'aimerais ne pas avoir de doublons dans cette ListBox. J'ai cherché un peu partout, mais je ne trouve rien de très simple. J'ai aussi tenté "If PlotForm.TimeList.ListIndex = -1 Then" mais cela ne fonctionne pas... Voici le morceau de code en question:

    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
    Dim i As Long
        Dim j As Long
        Dim Cell As Range
        Dim strTemp As String
     
        Sheets(LoggerParamChoiceTrends.ChoiceList.Text).Activate
     
        With ActiveSheet
            For Each Cell In Range([B10], [B10].End(xlToRight))
                Cell.Activate
                LoggerParamChoiceTrends.LoggerChoice.AddItem Split(Cell.Value, "@")(1)
            Next Cell
        End With
     
        'Sorts choices with alphabetical order
            With LoggerParamChoiceTrends.LoggerChoice
                For i = 0 To .ListCount - 1
                    For j = 0 To .ListCount - 1
                        If .List(i) < .List(j) Then
                            strTemp = .List(i)
                            .List(i) = .List(j)
                            .List(j) = strTemp
                        End If
                    Next j
                Next i
            End With
     
        Application.Goto Range("A1"), True
    Si quelqu'un peut m'éclairer, je suis preneur pour toute idée

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'ai cherché un peu partout, mais je ne trouve rien de très simple
    Tu n'as pas bien cherché alors
    Un exemple dans le chapitre II-G. ListBox du tutoriel Utiliser les contrôles dans un UserForm, en VBA Excel
    et une fonction "clé sur porte" dans ce blog Initialiser un ComboBox sans doublons et trié
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre confirmé Avatar de fuine0069
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Juillet 2017
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2017
    Messages : 33
    Par défaut
    Hello,

    Silkyroad avait déjà fait étape sur les list box, il y a aussi ajouté un élément pouvant limiter les doublons,
    ci dessous l'extrait de son code que tu peux adapter au tien.

    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
     
     
    Private Sub UserForm_Initialize()
        Dim Cell As Range
        Dim Unique As New Collection
        Dim Valeur As Range
        Dim i As Integer
     
        'Récupère la derniere ligne non vide dans la colonne A
        i = Range("A65536").End(xlUp).Row
     
        On Error Resume Next
        'boucle sur les cellules de la colonne A
        For Each Cell In Range("A1:A" & i)
            'Stocke les données dans une collection
            '(La collection n'accepte que des données uniques et permet donc
            ' de filtrer facilement les doublons).
            Unique.Add Cell, CStr(Cell)
        Next Cell
        On Error GoTo 0
     
        'Boucle sur le contenu de la collection pour alimenter la ListBox
        For Each Valeur In Unique
            Me.ListBox1.AddItem Valeur
        Next Valeur
    End Sub

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2017
    Messages : 57
    Par défaut
    Merci à tous les deux, fuine0069, j'ai essayé ta methode mais elle ne fonctionne pas, mes elements apparaissent toujours plusieurs fois...

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    fuine0069, j'ai essayé ta methode mais elle ne fonctionne pas, mes elements apparaissent toujours plusieurs fois...
    Et bien tu devrais revoir ta copie car ce code fonctionne parfaitement
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonsoir il y a aussi le dictionnaire
    de deux facon
    soit par le test de l'existence dans celui ci puis integration dans la listbox dans la meme boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub UserForm_Initialize()
        Dim Cell As Range
        Dim Unique As Object
        Set Unique = CreateObject("scripting.dictionary")
         For Each Cell In Range("A1:A" & Range("A65536").End(xlUp).Row)
            If Not Unique.exists(Cell.Value) Then
                Unique(Cell.Value) = ""
                ListBox1.AddItem Cell.Value
            End If
        Next Cell
    End Sub
    soit on laisse le flux faire tout seul
    en effet comme la collection le dictionnaire ne prends pas les doublons
    on rempli donc le dictionnaire comme avec la collection puis on injecte les cles dans la listbox (unique.keys)
    nul besoins de cocher la référence c'est en late binding pour les deux versions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private Sub UserForm_Initialize()
        Dim Cell As Range
        Dim Unique As Object
        Set Unique = CreateObject("scripting.dictionary")
        On Error Resume Next
        For Each Cell In Range("A1:A" & Range("A65536").End(xlUp).Row)
            Unique(Cell.Value) = ""
        Next Cell
        ListBox1.List = Unique.keys
    End Sub

    et maintenant juste pour rire parceque c'est bon pour la santé
    imaginons que nous travaillons avec excel version Vercingétorix
    que nous n'avons pas d'object(collection,dictionnaires etc...)
    alors on créé nous même le testeur

    mais c'est juste pour rire hein
    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
    Dim texte
    Private Sub UserForm_Initialize()
        Dim Cell As Range
          For Each Cell In Range("A1:A" & Range("A65536").End(xlUp).Row)
            If Not ceci_existe_deja(Cell.Value) Then
                          ListBox1.AddItem Cell.Value
            End If
        Next Cell
    End Sub
     
    Function ceci_existe_deja(valeur As String) As Boolean
    If texte Like "*" & valeur & ",*" Then
    ceci_existe_deja = True
    Else
    texte = texte & valeur & ","
    ceci_existe_deja = False
    End If
    End Function
    j'ai bu un peu trop de Perrier moi c'est fou
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Bonjour,

    La méthode la + rapide en PJ

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Private Sub UserForm_Initialize()
      Set f = Sheets("BD")
      Set mondico = CreateObject("Scripting.Dictionary")
      a = f.Range("A2:A" & f.[A65000].End(xlUp).Row)  ' tableau a(n,1) pour rapidité
      For i = LBound(a) To UBound(a)
       If a(i, 1) <> "" Then mondico(a(i, 1)) = ""
      Next i
      Me.ComboBox1.List = MonDico.keys
      '--avec tri
      'temp = mondico.keys
      'Tri temp, LBound(temp), UBound(temp)
      'Me.ComboBox1.List = temp
    End Sub
    Boisgontier
    http://boisgontierjacques.free.fr
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajouter du texte dans une ListBox sans sauter de ligne
    Par walid_kerkoub dans le forum Composants VCL
    Réponses: 2
    Dernier message: 03/03/2008, 15h42
  2. Comment remplir une liste déroulante avec une macro sans doublons
    Par alex.a dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 14/06/2007, 18h34
  3. ListBox sans Doublons
    Par pobrouwers dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 20/02/2007, 17h41
  4. Récupérer valeurs d'une colonne sans doublons
    Par paflolo dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 17/10/2006, 14h19
  5. Comment mettre à jour une ligne sans doublon via déclencheur
    Par fuelcontact dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/08/2004, 15h56

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