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é
    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é
    A lire :Les Règles

  3. #3
    Membre éprouvé
    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é
    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é
    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
    Expert éminent
    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é
    Comment faire ??
    J’entends et j’oublie,
    Je vois et je me souviens,
    Je fais et je comprends.
    Confucius

  8. #8
    Expert éminent
    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é
    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  
    Bonjour,

    essaye avec
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    FrmOp.Cb2 = Cell.Value


    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é
    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
    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é

  13. #13
    Inactif  
    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é
    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  
    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é
    >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
    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  
    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
    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

###raw>template_hook.ano_emploi###