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 :

Combobox dans feuille sans doublon [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Dessinateur industriel
    Inscrit en
    Mai 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dessinateur industriel
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2011
    Messages : 35
    Points : 17
    Points
    17
    Par défaut Combobox dans feuille sans doublon
    Bonjour à toutes et à tous,

    Un problème me bloque depuis pas mal de temps et impossible d'adapter les macro trouvées dans différent thread..

    Celui-ci est tout simple :

    J'ai une colonne A composée de diverses valeurs. Exemple : XX1 XX2 XX3 ...
    Celles-ci ce répètent plusieurs fois dans la colonne A
    J'ai nommé la plage ou ce trouve les valeurs : Gamme

    Quand j'intègre "Gamme" à une combobox (Combobox1), ça marche mais tout il y a évidement les valeurs qui ce répètent.

    J'ai adapté une macro existante à mon 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
    14
    15
    Sub RemplirComboBox1()
        Dim Cell As Range
     
        'Supprime les données existantes dans le ComboBox
        Worksheets("Data").ComboBox1.Clear
     
        'Boucle sur les cellules de la plage Gamme pour
        'alimenter le ComboBox
        For Each Cell In Worksheets("Data").Range("Gamme")
            Worksheets("Data").ComboBox1 = Cell
            'remplissage sans doublon
            If Worksheets("Data").ComboBox1.ListIndex = -1 Then _
                Worksheets("Data").ComboBox1.AddItem Cell
        Next Cell
    End Sub
    En insérant ça dans la feuille "Data" cela ne marche pas.
    J'ai essayé différente solution mais la je bloque totalement...

    Merci pour vos réponses,
    Defter

  2. #2
    Membre chevronné Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Points : 2 131
    Points
    2 131
    Par défaut
    Pour ma part, je remplirais d'abord un dictionnaire à partir du range en évitant les doublons (grâce à Exists), puis je remplirais la combobox.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Dessinateur industriel
    Inscrit en
    Mai 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dessinateur industriel
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2011
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    Bonjour Zebreloup, et Bonne année !

    Merci pour ta réponse mais pourrais-tu être plus précis ? Je suis encore un Novice en VBA et j'avoue ne pas saisir complètement ta réponse.

    Cordialement,
    Defter

  4. #4
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 754
    Points : 9 396
    Points
    9 396
    Par défaut
    Bonjour,

    Une autre version en utilisant Instr

    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
    Dim Str As String
    Dim i As Integer
    Dim Str2() As String
     
    'on charge dans Str la liste unique des occurrences 
    For i = 1 To 100
        If InStr(Str, Range("A" & i).Value) = 0 Then
            If Str <> "" Then Str = Str & ","
            Str = Str & Range("A" & i).Value
        End If
    Next
     
    'Mise en place des occurrences dans une variable tableau
    Str2 = Split(Str, ",")
     
    'Insertion dans la combobox
    ComboBox1.Clear
    For i = 0 To UBound(Str2)
        ComboBox1.AddItem Str2(i)
    Next i

  5. #5
    Membre chevronné Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Points : 2 131
    Points
    2 131
    Par défaut
    Essaie ce code après avoir coché Microsoft Scripting Runtime dans les références :

    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
    Public Sub RemplirComboBox1()
        Dim cbx As ComboBox
        Dim gamme As Range
        Dim d As Dictionary
        Dim c As Range
        Dim v As Variant
     
        'Création du dictionnaire
        Set rg = Worksheets("Data").Range("Gamme")
        Set d = New Dictionary
     
        For Each c In rg
            'On n'ajoute la valeur de la cellule qui si elle n'existe pas déjà
            If Not d.Exists(c.Value) Then d.Add c.Value, c.Value
        Next c
     
        'Remplissage de la comboBox
        Set cbx = Worksheets("Data").ComboBox1
        cbx.Clear
     
        For Each v In d.Items
            cbx.AddItem v
        Next v
    End Sub
    @jfontaine : Bonne idée ! Il faut juste être sûr qu'il n'y a pas de virgules dans les cellules.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Dessinateur industriel
    Inscrit en
    Mai 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dessinateur industriel
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2011
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    Bonjour Jfontaine et merci .

    Merci Zebreloup !

    Mais question bête : Je copie ça ou ?
    Directement dans la feuille et je fais clic droit sur la combobox de la feuille et je la met dedans ?

    Je ne sais jamais ou mettre les macros ... :/ désolé x).

    Encore merci pour vos réponses,
    Cordialement,
    Defter

    Alors j'ai ajouté la macro dans la feuille "Data" et il me dit :

    Propriétée ou méthode non gérée par cet Objet
    Code Erreur 438
    ...

    J'ai coché Microsoft scipting runtime.

    Cordialement,
    Defter

  7. #7
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Bonjour à tous

    Ci-joint code de ZebreLoup modifié en utilisant une seule boucle
    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
    Public Sub RemplirComboBox1()
    Dim Cbx As ComboBox
    Dim c As Range
    Dim d As New Dictionary
     
    'Création du dictionnaire
    With Worksheets("Data")
        Set Cbx = .ComboBox1
        Cbx.Clear
        For Each c In Worksheets("Data").Range("Gamme")
            'On n'ajoute la valeur de la cellule qui si elle n'existe pas déjà
            If Not d.Exists(c.Value) And c.Value <> "" Then
                d.Add c.Value, c.Value
                Cbx.AddItem c.Value
            End If
        Next c
        Set d = Nothing
        Set Cbx = Nothing
    End With
    End Sub

  8. #8
    Membre chevronné Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Points : 2 131
    Points
    2 131
    Par défaut
    Tu pouvais mettre ce code dans un module. Si tu veux le mettre sur la feuille "Data", tu peux même remplacer les Worksheets("Data") par Me.
    En fait ça dépend d'où tu veux appeler cette macro.

    Pour ton erreur elle intervient sur quelle ligne ?

  9. #9
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    Bonjour,

    Pour les Combobox, astucieux et concis :

    Citation Envoyé par SilkyRoad
    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 j As Integer
     
        'Récupère les données de la colonne A...
        For j = 1 To Range("A65536").End(xlUp).Row
            ComboBox1 = Range("A" & j)
            '...et filtre les doublons
            If ComboBox1.ListIndex = -1 Then ComboBox1.AddItem Range("A" & j)
        Next j
    End Sub
    dans la FAQ : http://excel.developpez.com/faq/?pag...stIndexNegatif

    Cordialement,

    Ps : si le côté technique de la réponse = OK ou pas => pensez à cliquer sur les pouces et quand question résolue à la taguer résolue, et chaque action vous rapporte des points

    Didier

  10. #10
    Membre à l'essai
    Homme Profil pro
    Dessinateur industriel
    Inscrit en
    Mai 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dessinateur industriel
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2011
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    La ligne n'est pas précisée, quand je la test avec "Lecture" le message d'erreur apparaît sans plus de précision.

    Enfaite j'aimerai que cette macro s'exécute à l'ouverture du fichier, cela est il possible ?

    Merci pour ton suivis et pour ton aide.


    Cordialement,
    Defter

  11. #11
    Membre chevronné Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Points : 2 131
    Points
    2 131
    Par défaut
    @Ormonth : oui, c'est vrai, je n'avais pas pensé à demander pourquoi le premier code ne marchait pas.

    @Defter : Normalement, quand il y a un message d'erreur à l'exécution d'une macro, il te proposer de l'arrêter ou de déboguer. Si tu choisis cette dernière option, tu devrais te retrouver sur la ligne qui pose problème.

    De manière générale, on peut mettre son code sur les feuilles, dans un module ou dans un module de classe. J'exclue le module de classe pour le moment car je pense que tu n'en es pas encore là.
    Par principe (après, chacun fait comme il veut), j'essaie de mettre le code dans un module, sauf quand il s'agit de petites opérations concernant seulement une feuille et déclenchées par un évènement de cette feuille.
    Si tu ne sais pas ce qu'est un évènement, tu trouveras de bonnes explications en cherchant un peu dans les cours de ce site, mais en gros, c'est un code (une macro) qui se déclenche quand un évènement se produit (click sur un bouton, changement dans une feuille...). C'est là justement qu'on rejoint ta dernière question : en plus de toutes les feuilles de ton classeur, tu as par défaut un objet ThisWorkbook, qui possède l'évènement Open. Donc si dans ThisWorkbook tu places :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Workbook_Open()
    'Le code mis ici se déclenchera à l'ouverture du classeur
    End Sub
    Tu pourras exécuter qq chose à l'ouverture. Encore une fois, il vaut mieux créer une procédure dans un module et l'appeler dans cet évènement que de mettre directement ici le code complet de ce que tu veux faire.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Dessinateur industriel
    Inscrit en
    Mai 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dessinateur industriel
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mai 2011
    Messages : 35
    Points : 17
    Points
    17
    Par défaut
    Bonjour à tous,

    Excusez moi pour le manque de réponse, j'ai du m'absenter.

    J'ai finalement trouver une solution à mon problème sans utiliser de code,

    Avec la fonction INDEX et des conditions j'ai pu aboutir à ce que je cherchais,

    Merci pour l'attention porté au sujet

    Cordialement,
    Defter

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

Discussions similaires

  1. [AC-2002] Nombre aléatoire dans requète sans Doublons
    Par far34 dans le forum Access
    Réponses: 12
    Dernier message: 25/03/2014, 13h52
  2. [XL-2010] Copie de données entre deux feuilles sans doublons
    Par ElPibeOro dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 22/05/2013, 15h07
  3. Renseigner une liste sans doublon dans une feuille ou dans un userform
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 26/01/2009, 14h54
  4. Filtre sans doublons dans ComboBox
    Par Smox78 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 10/07/2008, 09h27
  5. [vba] - Combobox + Filtre Auto + Sans Doublons
    Par RegiO dans le forum Général VBA
    Réponses: 2
    Dernier message: 25/04/2007, 09h43

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