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 :

Comment éviter les doublons dans une ComboBox


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Points : 984
    Points
    984
    Par défaut Comment éviter les doublons dans une ComboBox
    Bonjour à tous,

    Dans un formulaire (FrmOp), j'ai une ComboBox (Cb2) qui s'alimente avec les données ci-dessous provenant de la colonne A de la feuille "Données".
    Comme vous pouvez le constater, il y a des doublons dans la colonne et c'est normal, par contre je souhaiterai que dans ma ComboBox (Cb2) n'apparaisse qu'une seule fois chaque élément. Quel est le code pour cela ?
    Précision : On ne peut ajouter aucune données à partir de la ComboBox.
    Je vous remercie par avance
    ACEA
    Aide Classe Environnement
    Aide Classe Environnement
    Allocation
    Allocation
    Allocation
    Allocation
    Allocation
    Allocation
    J’entends et j’oublie,
    Je vois et je me souviens,
    Je fais et je comprends.
    Confucius

  2. #2
    Membre confirmé Avatar de zandru
    Homme Profil pro
    Ingénieur conception mécanique
    Inscrit en
    Mars 2008
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2008
    Messages : 507
    Points : 551
    Points
    551
    A lire :Les Règles

  3. #3
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Points : 984
    Points
    984
    Par défaut
    Bonjour zandru,

    J'ai fait ce code, mais la ComboBox reste vide
    Quel est le problème ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Cb2_Initialize()
    Dim Cell As Range
    'Supprime les données existantes dans le ComboBox
    FrmOp.Cb2.Clear
    'Boucle sur les cellules de la plage A1:A70 pour
    'alimenter le ComboBox
    For Each Cell In Sheets("Données").Range("A1:A70")
        FrmOp.Cb2 = Cell
        'remplissage sans doublon
        If FrmOp.Cb2.ListIndex = -1 Then
            FrmOp.Cb2.AddItem Cell
    Next Cell
    End Sub
    J’entends et j’oublie,
    Je vois et je me souviens,
    Je fais et je comprends.
    Confucius

  4. #4
    Membre confirmé Avatar de zandru
    Homme Profil pro
    Ingénieur conception mécanique
    Inscrit en
    Mars 2008
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2008
    Messages : 507
    Points : 551
    Points
    551
    Par défaut
    A première vue je ne vois pas.

    essai comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Cb2_Initialize()
    'Supprime les données existantes dans le ComboBox
    FrmOp.Cb2.Clear
    'Boucle sur les cellules de la plage A1:A70 pour
    'alimenter le ComboBox
    For lig=1 to 70
        FrmOp.Cb2 = Sheets("Données").cells(i,1)
        'remplissage sans doublon
        If FrmOp.Cb2.ListIndex = -1 Then
            FrmOp.Cb2.AddItem (Sheets("Données").cells(i,1))
        Endif
    Next
    End Sub
    C'est plus simple.
    A lire :Les Règles

  5. #5
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Points : 984
    Points
    984
    Par défaut
    Non ça ne marche pas non plus, la Combo reste vide.
    J'ai mis ce code dans le formulaire au niveau de la Combo
    J’entends et j’oublie,
    Je vois et je me souviens,
    Je fais et je comprends.
    Confucius

  6. #6
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour.

    Il n'y a pas d'évènement Initialize Pour une liste de choix. Mais il y en a un pour le userform. Il y a aussi Activate.
    Tu n'es même pas obligé d'utiliser un évènement...
    A toi de voir. Ce qui est sûr c'est qu'il faut exécuter les lignes de codes.

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  7. #7
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Points : 984
    Points
    984
    Par défaut
    Comment faire ??
    J’entends et j’oublie,
    Je vois et je me souviens,
    Je fais et je comprends.
    Confucius

  8. #8
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Dans un module standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Sub subSetCB2()
    Dim Cell As Range
    'Supprime les données existantes dans le ComboBox
    FrmOp.Cb2.Clear
    'Boucle sur les cellules de la plage A1:A70 pour
    'alimenter le ComboBox
    For Each Cell In Sheets("Données").Range("A1:A70")
        FrmOp.Cb2 = Cell
        'remplissage sans doublon
        If FrmOp.Cb2.ListIndex = -1 Then
            FrmOp.Cb2.AddItem Cell
    Next Cell
    End Sub
    ET tu appelles cette procédure quand tu en as besoin, par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Call subSetCB2
    FrmOp.Show
    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  9. #9
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Points : 984
    Points
    984
    Par défaut
    Bonjour pgz,

    J'ai mis en place le code que tu m'as donné, mais il y a un bug.
    Le message suivant apparait : "Erreur d'exécution '380' : Impossible de définir la propriété value. Valeur de propriété non valide" au niveau de la ligne en gras
    Peut-on m'expliquer le problème et surtout comment le résoudre ?
    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Sub SubSetCb2()
    Dim Cell As Range
    'supprime les données existantes dans le combobox
    FrmOp.Cb2.Clear
    'Boucle sur les cellules de la plage A2:A70 pour alimenter le Combo
        For Each Cell In Sheets("Données").Range("A2:A70")
        FrmOp.Cb2 = Cell
        'remplissage sans doublon
        If FrmOp.Cb2.ListIndex = -1 Then
            FrmOp.Cb2.AddItem Cell
            End If
        Next Cell
    End Sub
    Merci par avance
    J’entends et j’oublie,
    Je vois et je me souviens,
    Je fais et je comprends.
    Confucius

  10. #10
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Bonjour,

    essaye avec
    Si ne marche toujours pas, celà veut peut-être dire que FrmOp.Cb2 n'est finalement pas une ComboBox mais une ListBox ...
    ou que : étant bien une combobox, elle est en style DropDownList (auquel cas, bien évidemment ===>> impossible d'accéder à sa zone éditable ...!!!

    Si elle est en DropDownList et que tu tiens à conserver ce style, il va falloir procéder autrement : soit travailler en boucle (et ce sera long si ta liste est longue), soit tenter avec 2 fonctions de l'api de Windows (l'une pour extraire le hwnd de la combo et l'autre pour envoyer un message windows à la fenêtre de la combo ==>> je viens de le faire en essai depuis VB6 et celà fonctionne. Reste à savoir si mon extraction du hwnd sous VBA passera de la même manière), bien que je pense que oui ...)
    Si par contre ce style n'est pas nécessaire, change-le et tout ira bien.

  11. #11
    Membre éprouvé
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2007
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 896
    Points : 984
    Points
    984
    Par défaut
    Bonjour ucfoutu,

    ça marche, j'ai modifier le style qui était comme tu l'a deviné en DropDownList que j'avais mis par erreur.
    Merci beaucoup, voilà au moins un problème de règler, reste encore celui de l'alimentation de mes combo
    J’entends et j’oublie,
    Je vois et je me souviens,
    Je fais et je comprends.
    Confucius

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2017
    Messages : 35
    Points : 8
    Points
    8
    Par défaut
    bonjour j ai pratiquement le même probléme mais sauf que quand moi je lance le programme au niveau du formulaire n'apparaissent que les doublons sur la première rangé Nom : Capture.PNG
Affichages : 2333
Taille : 12,5 Ko

  13. #13
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonjour
    bien vu le test par le matchentry

    dommage que cela ne puisse pas fonctionner avec une listbox

    sinon pour les deux au plus simple et sans dico ou collection et même sans boucle de controle d'existence il y a ceci

    c'est valable pour les combo et listbox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim nodouble
    For i = 1 To 11
    If Not nodouble Like "*," & Cells(i, 1) & ",*" Then ListBox1.AddItem Cells(i, 1)
    nodouble = nodouble & "," & Cells(i, 1) & ","
    Next
    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

  14. #14
    Membre chevronné
    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
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonjour,

    La méthode qu'il ne FAUT PAS utiliser (3,5 sec pour 5000 items)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Private Sub UserForm_Initialize()
      For i = 1 To Sheets(1).[A65000].End(xlUp).Row
          Me.ComboBox1 = Sheets(1).Cells(i, "A")        ' on se positionne dans le combobox
          If Me.ComboBox1.ListIndex = -1 Then           ' Existe t-il?
             Me.ComboBox1.AddItem Sheets(1).Cells(i, "A")
          End If
       Next i
    End Sub
    La méthode la plus rapide (0,01 sec pour 5000 items):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    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
    End Sub
    Boisgontier
    http://boisgontierjacques.free.fr

  15. #15
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    oui Jacques le dico est bien plus rapide
    la collection l'est un peu plus aussi
    je trouvais cette démarche intéressante quand même
    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

  16. #16
    Membre chevronné
    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
    Points : 2 156
    Points
    2 156
    Par défaut
    >je trouvais cette démarche intéressante quand même

    Les boucles sur les objets d'un formulaire ralentissent considérablement le temps d'exécution.
    On peut faire pire: effectuer un tri directement sur un combobox (avec bubble sort e.g.)

    Boisgontier

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2017
    Messages : 35
    Points : 8
    Points
    8
    Par défaut
    honnêtement je ne suis pas un expert en programmation mais je n'arrive pas à me situe par rapport a vos correction et mon problème je suis même perdu

  18. #18
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    beaucoup d'entre elles te font ce que tu demande mais certaines sont plus lourdes et gourmande en ressources que d'autres c'est tout
    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

  19. #19
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2017
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2017
    Messages : 35
    Points : 8
    Points
    8
    Par défaut
    n'est t'il pas possible de m'aider a partir de ce que j ai déjà fait? car le mien fonctionne aussi bien mais il y a seulement des repetivites au niveau de la première valeur de la combo-box qui es intitulé ici "Fine" mais pour le reste sava. Comment es ce que je pourrais faire pour palier a ce problème à partir de ma syntaxe

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

Discussions similaires

  1. problème pour éviter les doublons dans une table
    Par bonnet85 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 19/02/2008, 04h35
  2. [vbexcel]Comment supprimer les doublons dans une combobox?
    Par Mugette dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 24/11/2005, 11h12
  3. Comment éviter les doublons dans ma table
    Par einegel dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/11/2004, 12h18
  4. Éviter les doublons dans une requete
    Par royrremi dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 03/08/2004, 19h37

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