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 :

pas de doublons ni de vides dans liste déroulante [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 26
    Par défaut pas de doublons ni de vides dans liste déroulante
    Bonjour,

    Je sais que ce sujet a été traité plusieurs fois mais je n'arrive pas à appliquer à mon fichier les codes déjà proposés . (je suis débutante)
    J'ai une feuille de calcul déjà remplie (environ 80 lignes) et j'ai décidé pour la suite de la saisie de faire un formulaire de saisie. J'ai mis une liste déroulante qui va chercher les données de ma colonne "C" de la ligne 5 à 200 (déjà partiellement remplie). Mais celle-ci comporte plusieurs fois les même données et aussi la fin de la liste déroulante est vide car pour l'instant je n'ai pas 200 lignes remplies donc c'est normal. Les utilisateurs doivent povoir sélectionner des anciennes données déjà existantes mais aussi pouvoir en rajouter.
    J'ai essayé de mettre le code ci-dessous en l'adaptant à mon fichier en changeant le nom des variables mais il ne se passe rien du tout...
    1) Ou dois-je mettre le code? Dans le code de la feuille de calcul en cours? Dans le code du formulaire? dans un module?
    2) J'ai renseigné la rowsource de ma listbox comme cela:CONTENUS_ARMOIRES!C5:C200. Peut être cela interfère avec le code?
    3) Me suis-je trompée en changeant le nom des variables?

    Voici le code que j'ai utilisé:
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    Private Sub Nouveau_dossier_Initialize()
        Dim Cell As Range
        Dim Tableau()
        Dim TempTab As Variant
        Dim i As Integer, j As Integer
        Dim boolVerif As Boolean
     
        ReDim Tableau(1 To 1)
        Tableau(1) = Cells(1, 1)
     
        'Boucle sur les données de la colonne A, dans la Feuil1
        For Each Cell In Worksheets("CONTENUS_ARMOIRES").Range("C6:C" & _
                            Worksheets("CONTENUS_ARMOIRES").Range("C65536").End(xlUp).Row)
            boolVerif = False
     
            'Vérifie si le contenu de la cellule existe déjà dans le tableau
            For i = 1 To UBound(Tableau)
                'Si la donnée existe déjà dans le tableau
                If Tableau(i) = Cell Then
                    boolVerif = True
                    Exit For
                End If
            Next i
     
            'Si la donnée n'existe pas dans le tableau, on augmente la taille du tableau
            'et on ajoute la donnée.
            If boolVerif = False Then
                ReDim Preserve Tableau(1 To UBound(Tableau) + 1)
                Tableau(UBound(Tableau)) = Cell
            End If
     
            'Tri le contenu du tableau par ordre croissant.
            For i = 1 To UBound(Tableau)
                For j = 1 To UBound(Tableau)
                    If Tableau(i) < Tableau(j) Then
                        TempTab = Tableau(i)
                        Tableau(i) = Tableau(j)
                        Tableau(j) = TempTab
                    End If
                Next j
            Next i
        Next Cell
     
        'Alimente le ComboBox
        domaine1.List = Tableau
     
    End Sub

    Merci d'avance pour votre aide et vos lumières

  2. #2
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 80
    Par défaut
    Salut csophie49 !



    Donc je réitère ma question : est-ce l'ensemble de ton code ou non ? Car si c'est le cas, il te faut peut-être lancé une instance excel, ouvrir ton fichier excel ou le créer si il n'existe pas, au cas où ton formulaire n'est pas sur le même fichier. Et puis je trouve bizare de déclarer Cell de type Range :/
    En fait Cell est considéré comme étant une méthode, et donc l'utiliser comme variable peut créer certains problèmes. On va dire qu'il est préférable de choisir un nom de variable disons "neutre", comme cellule tout simplement par exemple ?!

    Généralement, les méthodes, procédures et fonctions commencent par une majuscule, donc je te conseillerais de saisir tes variables tout en miniscules pour les distinguer plus facilement !!

    Et sinon est-ce que tu as la source du code que tu réutilises ? J'aimerais bien le voir avant les modifications, pour savoir si c'est toi qui aurait pu faire des erreurs en le modifiant, ou si ta source avait déjà des erreurs ?!?

    Peace

  3. #3
    Membre averti
    Inscrit en
    Août 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 26
    Par défaut
    Bonjour,

    Voici le code original:
    Il vient de ce site d'ailleur http://excel.developpez.com/faq/index.php?page=Controle

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    Private Sub UserForm_Initialize()
        Dim Cell As Range
        Dim Tableau()
        Dim TempTab As Variant
        Dim i As Integer, j As Integer
        Dim boolVerif As Boolean
     
        ReDim Tableau(1 To 1)
        Tableau(1) = Cells(1, 1)
     
        'Boucle sur les données de la colonne A, dans la Feuil1
        For Each Cell In Worksheets("Feuil1").Range("A1:A" & _
                            Worksheets("Feuil1").Range("A65536").End(xlUp).Row)
            boolVerif = False
     
            'Vérifie si le contenu de la cellule existe déjà dans le tableau
            For i = 1 To UBound(Tableau)
                'Si la donnée existe déjà dans le tableau
                If Tableau(i) = Cell Then
                    boolVerif = True
                    Exit For
                End If
            Next i
     
            'Si la donnée n'existe pas dans le tableau, on augmente la taille du tableau
            'et on ajoute la donnée.
            If boolVerif = False Then
                ReDim Preserve Tableau(1 To UBound(Tableau) + 1)
                Tableau(UBound(Tableau)) = Cell
            End If
     
            'Tri le contenu du tableau par ordre croissant.
            For i = 1 To UBound(Tableau)
                For j = 1 To UBound(Tableau)
                    If Tableau(i) < Tableau(j) Then
                        TempTab = Tableau(i)
                        Tableau(i) = Tableau(j)
                        Tableau(j) = TempTab
                    End If
                Next j
            Next i
        Next Cell
     
        'Alimente le ComboBox
        ComboBox1.List = Tableau
     
    End Sub
    C'est compliqué tout ça pour moi donc je te fais confiance

  4. #4
    Membre Expert Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Par défaut
    bonjour csophie49 GarnierFlorian le forum essai comme cela tu remplis pas par row source. ma combobox se nomme cbx1 adapte

    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
    Private Sub UserForm_Initialize()
    Dim c As Range, i As Long, j As Long, temp As String
      For Each c In Range("c5:c" & Range("c65536").End(xlUp).Row)
       cbx1 = c
        If cbx1.ListIndex = -1 And cbx1 <> "" Then cbx1.AddItem c
      Next c
      For i = 0 To cbx1.ListCount - 1
      For j = 0 To cbx1.ListCount - 1
          If cbx1.List(i) < cbx1.List(j) Then
           temp = cbx1.List(i)
           cbx1.List(i) = cbx1.List(j)
          cbx1.List(j) = temp
       End If: Next j: Next i
         cbx1.ListIndex = -1
    End Sub

  5. #5
    Membre averti
    Inscrit en
    Août 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 26
    Par défaut
    Bonjour Laetitia,

    J'ai fais comme tu as dis, mais il ne se passe rien. Ma liste déroulante est vide du coup (car j'ai enlever la rowsource).

    Mon userform s'appelle Nouveau_dossier
    Ma liste déroulante s'appelle domaine1
    Ma feuille de calcul s'appelle CONTENUS_ARMOIRES

    Ce qui donne:
    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
    Private Sub Nouveau_dossier_Initialize()
    Dim c As Range, i As Long, j As Long, temp As String
      For Each c In Range("c5:c" & Range("c65536").End(xlUp).Row)
       domaine1 = c
        If domaine1.ListIndex = -1 And domaine1 <> "" Then domaine1.AddItem c
      Next c
      For i = 0 To domaine1.ListCount - 1
      For j = 0 To domaine1.ListCount - 1
          If domaine1.List(i) < domaine1.List(j) Then
           temp = domaine1.List(i)
           domaine1.List(i) = domaine1.List(j)
          domaine1.List(j) = temp
       End If: Next j: Next i
         domaine1.ListIndex = -1
    End Sub
    Je mets en pièce jointe carrément mon fichier si cela peut aider.

    Merci de votre aide.
    Fichiers attachés Fichiers attachés

  6. #6
    Membre Expert Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Par défaut
    bonjour ton code il faut pas mettre dans ton user

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub Nouveau_dossier_Initialize()
    mais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub UserForm_Initialize()
    eventuellement si ca marche pas je regarderais ton fichier!!!

    ps je viens de regardais par curiosite le code il faut le mettre dans ton userform & pas dans la feuille!!!

    re, exemple concret avec le code deja dans l'user

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    Private Sub UserForm_Initialize()
    Dim c As Range, i As Long, j As Long, temp As String
      For Each c In Range("c5:c" & Range("c65536").End(xlUp).Row)
       domaine1 = c
        If domaine1.ListIndex = -1 And domaine1 <> "" Then domaine1.AddItem c
      Next c
      For i = 0 To domaine1.ListCount - 1
      For j = 0 To domaine1.ListCount - 1
          If domaine1.List(i) < domaine1.List(j) Then
           temp = domaine1.List(i)
           domaine1.List(i) = domaine1.List(j)
          domaine1.List(j) = temp
       End If: Next j: Next i
         domaine1.ListIndex = 0
    End Sub
    Private Sub parcourir_Click()
    Liens.Text = Application.GetOpenFilename("Tous,*.*", , "Choisir un fichier ...")
    DoEvents
    End Sub
    Private Sub valider_Click()
    ligne = 103
    Do While Cells(ligne, 1) <> ""
    ligne = ligne + 1
    Loop
    Cells(ligne, 1) = armoire
    Cells(ligne, 2) = étagère
    Cells(ligne, 3) = domaine1
    Cells(ligne, 4) = domaine2
    Cells(ligne, 5) = contenu
    Cells(ligne, 6) = entreprise
    Cells(ligne, 7) = année
    Cells(ligne, 8) = nom_du_dossier
    Cells(ligne, 9) = aspect_du_dossier
    Cells(ligne, 10) = cd_rom
    Cells(ligne, 11) = emplacement_cd_rom
    Cells(ligne, 12) = Liens
    armoire = ""
    étagère = ""
    domaine1 = ""
    domaine2 = ""
    contenu = ""
    entreprise = ""
    année = ""
    nom_du_dossier = ""
    aspect_du_dossier = ""
    cd_rom = ""
    emplacement_cd_rom = ""
    Liens = ""
    nouveau_dossier.Hide
    End Sub

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

Discussions similaires

  1. interdire champ vide dans liste déroulante
    Par ddracoon dans le forum IHM
    Réponses: 7
    Dernier message: 22/08/2022, 14h04
  2. Interdire saisie "vide" "" dans liste de choix
    Par pasclaire dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/03/2010, 13h37
  3. [AC-2003] Colonne qui apparait vide dans liste
    Par nicburger dans le forum VBA Access
    Réponses: 2
    Dernier message: 07/04/2009, 10h49
  4. pas de sélection dans liste déroulante (cantine)
    Par mystikgirl30 dans le forum IHM
    Réponses: 2
    Dernier message: 05/03/2007, 11h50
  5. doublons dans liste déroulante
    Par nicolovitch dans le forum Access
    Réponses: 2
    Dernier message: 27/07/2006, 12h17

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