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 :

Remplir CombBox sans doublons ni vide [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué Avatar de Vba14
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2019
    Messages : 440
    Points : 147
    Points
    147
    Par défaut Remplir CombBox sans doublons ni vide
    Bonjour à tous,

    Avec le code ci-dessous et à l' Initialize de mon UserForm, je remplie mes CombosBox avec des données de différentes feuilles de calcul.
    ça fonctionne bien, sauf que je me retrouve avec des doublons et des vides dans mes Combo.
    Pourriez-vous m'indiquer comment supprimer ce genre de désagrément si vous plaît ?
    Je vous en remercie par avance

    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
     
    Private Sub UserForm_Initialize()
    Dim LastLig1, LastLig2, LastLig3, LastLig4, LastLig5, LastLig6, LastLig7, LastLig8 As Long
    Application.ScreenUpdating = False
     
    Me.MultiPage1(0).Visible = True
    Me.MultiPage1(1).Visible = False
    Me.MultiPage1(2).Visible = False
    Me.MultiPage1(3).Visible = False
    Me.MultiPage1(4).Visible = False
    Me.MultiPage1(5).Visible = False
     
        LastLig1 = Sheets("Arch_Ville").Cells(Rows.Count, "F").End(xlUp).Row
        LastLig2 = Sheets("Arch_CU").Cells(Rows.Count, "G").End(xlUp).Row
        LastLig3 = Sheets("Arch_Bât").Cells(Rows.Count, "F").End(xlUp).Row
        LastLig4 = Sheets("Arch_Bât").Cells(Rows.Count, "G").End(xlUp).Row
        LastLig5 = Sheets("Général").Cells(Rows.Count, "F").End(xlUp).Row
        LastLig6 = Sheets("Général").Cells(Rows.Count, "G").End(xlUp).Row
        LastLig7 = Sheets("Arch_Dét").Cells(Rows.Count, "F").End(xlUp).Row
        LastLig8 = Sheets("Arch_Dét").Cells(Rows.Count, "G").End(xlUp).Row
     
        Me.ComboVille.RowSource = ("Arch_Ville!F4:F" & LastLig1)
        Me.ComboCU.RowSource = ("Arch_CU!G4:G" & LastLig2)
        Me.ComboBatVille.RowSource = ("Arch_Bât!F4:F" & LastLig3)
        Me.ComboBatCU.RowSource = ("Arch_CU!G4:G" & LastLig4)
        Me.ComboGenVille.RowSource = ("Général!F14:F" & LastLig5)
        Me.ComboGenCU.RowSource = ("Général!G14:G" & LastLig6)
        Me.ComboDetVille.RowSource = ("Arch_Dét!F4:F" & LastLig6)
        Me.ComboDetCU.RowSource = ("Arch_Dét!G4:G" & LastLig7)
     
     
    Application.ScreenUpdating = True
    End Sub
    Le savoir est le plus intellectuel des virus, dommage qu'il ne soit pas très contagieux.
    Adrien Verschaere
    Étudiant, France, 1997

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 222
    Points : 1 794
    Points
    1 794
    Par défaut
    Salut,

    Il y a plusieurs techniques, en utilisant les fonctionnalités d'Excel ou en pure VBA.
    En passant par les fonctionnalités d'Excel, tu peux d'abord mettre en place des filtres pour virer les blancs. Puis éliminer les doublons (méthode RemoveDuplicate de l'objet Range).

    en VBA pure, il faut faire différent tests:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Public Function IsBlanc(ByVal Value As String) As Boolean
        IsBlanc = Trim(Value) = VbNullString
    End Function
    La detection des doublons est un peut plus compliquée, tu peux utiliser une particularité des collections qui interdisent les clefs en doublons:
    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 Function GetUniqueValues(ByVal Rng As Excel.Range) As Collection
        Dim Col As Collection
        Set Col = New Collection
     
        Dim Cell As Excel.Range
        For Each Cell In Rng.Cells
            On Error GoTo Error
            Col.Add Cell.Value, CStr(Cell.Value)
            On Error GoTo 0
        Next
        Set GetUniqueValues = Col   '// retourne une collection de valeurs uniques
    Exit Function
    Error:
        Select Case Err.Number
        Case 457    '// Cette clé est déjà associée à un élément de cette collection
            Resume Next
        Case Else
            Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
        End Select
    End Function

  3. #3
    Membre habitué Avatar de Vba14
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2019
    Messages : 440
    Points : 147
    Points
    147
    Par défaut
    Bonjour deedolith,

    Merci beaucoup pour ta réponse.
    Où dois-je mettre ces codes ? Dans un module, à l'initialize de l'UserForm ?
    Et comment faire appelle de ces fonctions ?
    Je suis un peu perdu
    Merci par avance
    Le savoir est le plus intellectuel des virus, dommage qu'il ne soit pas très contagieux.
    Adrien Verschaere
    Étudiant, France, 1997

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 222
    Points : 1 794
    Points
    1 794
    Par défaut
    Ce sont des fonctions génériques, donc dans un module standard.

    Quand à les appeler, c'est comme n'importe quelle autre fonction.
    As-tu consulté un minimum de tutoriel avant de foncer tête baissée dans du code ?
    https://heureuxoli.developpez.com/office/word/vba-all/

  5. #5
    Membre habitué Avatar de Vba14
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2019
    Messages : 440
    Points : 147
    Points
    147
    Par défaut
    Bonjour le forum, bonjour deedolith,

    Oui j'ai consulté des tutoriels, mais rien qui ne ressemble à ce que tu me propose.
    Merci pour le lien, je vais y aller regarder de ce pas.
    A plus...
    Le savoir est le plus intellectuel des virus, dommage qu'il ne soit pas très contagieux.
    Adrien Verschaere
    Étudiant, France, 1997

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 222
    Points : 1 794
    Points
    1 794
    Par défaut
    Appeler une fonction, c'est la base de chez basique !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim Data As String
     
    If IsBlank(Data) Then
        MsgBox "Data is blank"
    End If
     
    Dim Result As Boolean
    Result = IsBlank(Data)
    If Result Then
        MsgBox "Data is blank"
    End If
    Ou est la difficulté ?

  7. #7
    Membre habitué Avatar de Vba14
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2019
    Messages : 440
    Points : 147
    Points
    147
    Par défaut
    Aucune. Juste un peu de fatigue
    Le savoir est le plus intellectuel des virus, dommage qu'il ne soit pas très contagieux.
    Adrien Verschaere
    Étudiant, France, 1997

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 855
    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 : 12 855
    Points : 28 774
    Points
    28 774
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    En vba si vous avez la version 365 vous pouvez utiliser la fonction Evaluate en imbriquant les fonction FILTRE et UNIQUE comme =UNIQUE(FILTRE(Tableau1[Texte];Tableau1[Texte]<>0))

    Attention qu'en VBA, il faudra la traduire en anglais soit =UNIQUE(FILTER(Tableau1[Texte],Tableau1[Texte]<>0))

    Voir un exemple de son utilisation dans ce billet titré VBA - EXCEL Comment renvoyer dynamiquement les valeurs uniques de la colonne d'un tableau (ListObject)
    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

  9. #9
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 977
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 977
    Points : 9 339
    Points
    9 339
    Par défaut
    Hello,
    pour remplir une ComboBox sans doublon en VBA on peut utiliser un dictionnaire de cette façon :
    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
    Private Sub UserForm_Initialize()
        Dim dict As Object
        Dim fruit
        Set dict = CreateObject("Scripting.Dictionary")
        With dict
        For Each fruit In Range("Fruits")
          If fruit.Value <> "" Then
               .Item(fruit.Value) = fruit.Value
          End If
        Next fruit
        For Each fruit In .Items
          Me.ComboBox1.AddItem fruit
        Next fruit
        End With
        Set dict = Nothing
    End Sub
    les données à remplir sont dans la plage nommée "Fruits". On remplit le dictionnaire avec les valeurs de la plage nommée. Le dictionnaire n'autorise pas de clés identiques donc pas de doublon et on évite de mettre une valeur vide. On relit ensuite le dictionnaire pour mettre ses valeurs dans la ComboBox.
    et voilà ce que cela donne :

    Nom : ComboSansDoublon.png
Affichages : 116
Taille : 26,5 Ko
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  10. #10
    Membre habitué Avatar de Vba14
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2019
    Messages : 440
    Points : 147
    Points
    147
    Par défaut
    Bonsoir à tous,

    Mon problème est à présent résolu. J'ai passé beaucoup de temps à rectifier certaines données, par exemple école ou ecole, musée ou musee.
    Maintenant je vais pouvoir m'atteler à autre chose.
    Encore mille mercis pour vous nombreux commentaires et exemples.
    J'ai adopté la solution de jurassik pork, plus facile à mettre en place pour moi.
    deedolith, j'ai gardé ta solution pour une autre application que je vais commencer.
    Bonne soirée à tous
    Bien amicalement
    Le savoir est le plus intellectuel des virus, dommage qu'il ne soit pas très contagieux.
    Adrien Verschaere
    Étudiant, France, 1997

  11. #11
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 977
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 977
    Points : 9 339
    Points
    9 339
    Par défaut
    Hello,
    A noter que dans mon code on peut remplacer la boucle de remplissage de la ComboBox par une seule instruction en utilisant la propriété List de la comboBox :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        'For Each fruit In .Items
        '  Me.ComboBox1.AddItem fruit
        'Next fruit
        ComboBox1.List = .Items()
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  12. #12
    Membre habitué Avatar de Vba14
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2019
    Messages : 440
    Points : 147
    Points
    147
    Par défaut
    Bonjour le forum, bonjour Ami calmant

    Je suis navré de répondre tardivement à ton dernier message.
    Merci pour cette précision
    Meilleures salutations
    Le savoir est le plus intellectuel des virus, dommage qu'il ne soit pas très contagieux.
    Adrien Verschaere
    Étudiant, France, 1997

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

Discussions similaires

  1. [XL-2007] Remplir combobox sans doublons et sans VBCRLF
    Par stdonat dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 14/01/2017, 15h07
  2. [XL-2010] USF / .Controls / tags / remplir Combobox sans doublon et classer
    Par GADENSEB dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 31/03/2015, 21h51
  3. [XL-MAC 2011] Remplissage Zone de liste déroulante sans doublons & non vides via VBA
    Par SuperKiwi dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 19/03/2014, 20h29
  4. 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
  5. remplir un tableau sans doublons ...
    Par ryo-san dans le forum C
    Réponses: 22
    Dernier message: 10/11/2005, 12h43

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