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 :

Vérifier l'existence d'un élément précis dans une listbox


Sujet :

Macros et VBA Excel

  1. #1
    Membre très actif
    Femme Profil pro
    Assistante
    Inscrit en
    Février 2016
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Assistante

    Informations forums :
    Inscription : Février 2016
    Messages : 166
    Par défaut Vérifier l'existence d'un élément précis dans une listbox
    Bonjour Le Forum,

    Je possède 2 listbox (multiselect), l'une avec des données, l'autre vide.

    Je sélectionne un ou plusieurs éléments dans ma première listbox et en cliquant sur un bouton, les élements se transfert dans la 2ème listbox et se suppriment de la première.

    J'ai une combobox qui filtre ma première listbox. Et selon mon choix, les éléments que j'ai transféré dans ma 2ème listbox réapparaissent dans la 1ère (c'est volontaire par rapport à mon projet, bref)

    Du coup, lorsque je clique sur mon bouton qui transfert l'éléments ou les éléments sélectionné(s) de ma 1ère listbox à ma 2ème, j'aimerais qu'un msgbox apparaissent en disant : l'élément ou les éléments sélectionné(s) sont déjà présents dans la 2ème liste.

    J'ai essayé un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    For i = ListboxQualif.ListCount - 1 To 0 Step -1
     
       If ListboxQualif2.ListIndex = ListboxQualif.Selected(i) Then 
        MsgBox "Cet élément est déjà présent": Exit Sub
        End If
     
           If ListboxQualif.Selected(i) = True Then
               ListboxQualif2.AddItem ListboxQualif.List(i)
               ListboxQualif.Selected(i) = True
                ListboxQualif.RemoveItem i
                End If
        Next i
    Mais ça ne fonctionne pas (à cause du .listindex je pense), il comprend juste qu'un élement (peu importe lequel) figure dans la 2ème liste.

    Merci beaucoup.

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour

    Je vais aller en ce qui me concerne directement à la question technique, seule concernée, de la vérification de ce qu'un article est ou non déjà présent dans une listbox.
    Méthode :
    - 1) donner à la propriété Text de la listbox la valeur de l'article à vérifier
    - 2) lire ensuite la propriété listindex de cette listbox --->> si = -1 -->> l'article n'y est pas . Si >=0, cet article y est déjà.
    Exemple :
    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
    ListBox1.AddItem "toto"
      ListBox1.AddItem "titi"
     
      ' on vérifie si toto y est déjà ou non :
     
      ListBox1.ListIndex = -1 ' de sorte à ce que rien n'y reste sélectionné)
      On Error Resume Next
      ListBox1.Text = "toto"
      If ListBox1.ListIndex = -1 Then
         MsgBox "toto non déjà dans la listbox"
      Else
         MsgBox "toto est déjà présent dans la listbox"
      End If
      On Error GoTo 0
     
     
      'voyons si "tutu" y figure
     
       ListBox1.ListIndex = -1 ' de sorte à ce que rien n'y reste sélectionné)
      On Error Resume Next
      ListBox1.Value = "tutu"
      If ListBox1.ListIndex = -1 Then
         MsgBox "tutu non déjà dans la listbox"
      Else
         MsgBox "tutu est déjà présent dans la listbox"
      End If
    On Error GoTo 0
    La gestion d'erreur est ici nécessaire (les On error ...)

  3. #3
    Membre expérimenté
    Homme Profil pro
    Pompier de service
    Inscrit en
    Février 2014
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Pompier de service

    Informations forums :
    Inscription : Février 2014
    Messages : 146
    Par défaut
    Bonjour,

    Autre méthode via une petite fonction, puisque la propriété List d'une ListBox renvoie un tableau de Variant, sous forme de (ligne, colonne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function In_Listbox(lblst As Variant, Col as Integer, recherche As Variant) As Boolean
     
        In_Listbox = False
     
        For i = LBound(lblst) To UBound(lblst)
            If lblst(i, Col) = recherche Then 'Si valeur trouvée
                In_Listbox = True
                Exit For
            End If
        Next
     
    End Function
    que tu appelle ensuite par In_Listbox(ListboxQualif2.list,0,"Toto") qui renvoie vrai ou faux si la valeur est présente ou non.

    Ca peut être utile, si tu utilises une ListBox à plusieurs colonnes (dont certaines éventuellement masquées), il suffit de passer le n° de colonne Col à la fonction.

  4. #4
    Membre très actif
    Femme Profil pro
    Assistante
    Inscrit en
    Février 2016
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Assistante

    Informations forums :
    Inscription : Février 2016
    Messages : 166
    Par défaut
    Bonjour,

    J'ai essayé vos deux solutions, mais je n'y arrive pas :s
    Comment faire pour ne pas dire "toto" mais "la sélection" (car je ne peux pas lister tous les éléments de ma listbox, il y en a + de 20 en fonction de chaque changement dans ma combobox.

    Où doisj-je placer ça dans mon code ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    In_Listbox(ListboxQualif2.list,0,"Toto")
    Merci pour le temps que vous m'accordez.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Pompier de service
    Inscrit en
    Février 2014
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Pompier de service

    Informations forums :
    Inscription : Février 2014
    Messages : 146
    Par défaut
    Simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    sChoixListe1 = ListboxQualif.Selected(i)
    If In_Listbox(ListboxQualif2.list,0,sChoixListe1) Then 
        MsgBox "Cet élément est déjà présent": Exit Sub
        End If
    Avec les For... Next de ton 1er message, pour traiter tous les éléments sélectionnés dans ta 1ère liste, puisque tu peux faire de la sélection multiple

  6. #6
    Membre très actif
    Femme Profil pro
    Assistante
    Inscrit en
    Février 2016
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Assistante

    Informations forums :
    Inscription : Février 2016
    Messages : 166
    Par défaut
    Merci beaucoup, mais j'ai un message d'erreur : "Type d'argument ByRef incompatible" sur "schoixliste1" de cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If In_Listbox(ListboxQualif2.List, 0, schoixliste1) Then
    Voici le code en entier :
    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
    Function In_Listbox(i As Long, lblst As Variant, Col As Integer, recherche As Variant) As Boolean
     
        In_Listbox = False
     
        For i = LBound(lblst) To UBound(lblst)
            If lblst(i, Col) = recherche Then 'Si valeur trouvée
                In_Listbox = True
                Exit For
            End If
        Next
     
    End Function
    Private Sub FlècheAjout_click()
     
    Dim i As Long
     
    For i = ListboxQualif.ListCount - 1 To 0 Step -1
     
    schoixliste1 = ListboxQualif.Selected(i)
     
    If In_Listbox(ListboxQualif2.List, 0, schoixliste1) Then
        MsgBox "Cet élément est déjà présent": Exit Sub
    End If
     
    If ListboxQualif.Selected(i) = True Then
       ListboxQualif2.AddItem ListboxQualif.List(i)
       ListboxQualif.Selected(i) = True
       ListboxQualif.RemoveItem i
    End If
    Next i
     
    End Sub
    Dans la fonction entre parenthèse j'ai rajouté "i As Long" car le i n'était pas déclaré, je ne sais pas s'il fallait bien faire comme ça :s

    Merci

  7. #7
    Membre expérimenté
    Homme Profil pro
    Pompier de service
    Inscrit en
    Février 2014
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Pompier de service

    Informations forums :
    Inscription : Février 2014
    Messages : 146
    Par défaut
    Ca semble logique vu que ListboxQualif.Selected(i) renvoie un booleen (vrai ou faux), et non la chaine à rechercher...

  8. #8
    Membre très actif
    Femme Profil pro
    Assistante
    Inscrit en
    Février 2016
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Assistante

    Informations forums :
    Inscription : Février 2016
    Messages : 166
    Par défaut
    Bonjour,

    Je ne sais pas ce que je dois faire du coup (je ne suis pas une experte en VBA..)
    Merci

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    Je ne sais pas ce que je dois faire du coup
    Tu peux essayer la proposition de unparia qui parait être une très bonne idée.
    eric

  10. #10
    Membre très actif
    Femme Profil pro
    Assistante
    Inscrit en
    Février 2016
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Assistante

    Informations forums :
    Inscription : Février 2016
    Messages : 166
    Par défaut
    Je l'ai essayé également mais ça ne fonctionne pas.
    C'est dans ma seconde listbox que je veux savoir si l'élément est déjà présente, afin de ne pas le déplacer de la 1ère LB à la 2ème une seconde fois.
    Et il ne faut pas "Toto", mais "LA sélection" de la 1ère LB.

    Je galère

  11. #11
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Et alors, Mél3790 ?
    le code exemple que je t'ai montré :
    - montre comment on vérifie si un article existe déjà dans UNE listbox, qu'elle soit Listbox1, listbmachin ou ce que tu voudras !
    - "toto" n'y est qu'un exemple de vérification d'existence. Tu peux le remplacer par tout ce que tu veux, autre chaine de caractères en dur ou variable, ou propriété de ceci ou de cela ...
    Où est donc ton problème ? Tu ne sais pas non plus, donc, parcourir en boucle les articles de ta première liste, y relever ceux qui sont sélectionnés et pour chacun d'entre eux, vérifier (mon code te le montre) s'il existe déjà dans l'autre liste ?
    Si c'est cela, je t'abandonne tout net car cela voudrait dire que tu ne sais pas non plus ce que fait le code que tu as mis dans ton tout premier message !
    Désolé, mais c'est ainsi.

  12. #12
    Membre très actif
    Femme Profil pro
    Assistante
    Inscrit en
    Février 2016
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Assistante

    Informations forums :
    Inscription : Février 2016
    Messages : 166
    Par défaut
    Effectivement je ne sais pas tout. Je l'ai dit, je ne suis pas une pro.
    Je pioche sur internet des codes qui peuvent m'aider et je les adapte.
    Là pour le coup, je n'arrive pas à l'adapter.
    J'ai essayé ceci :
    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
    Dim i As Integer
    Dim selection
     
    selection = ListboxQualif.Selected(i)
    ListboxQualif.AddItem = selection
     
     
    For i = ListboxQualif.ListCount - 1 To 0 Step -1
    If ListboxQualif.Selected(i) = True Then
    ListboxQualif2.AddItem ListboxQualif.List(i)
    ListboxQualif.Selected(i) = True
    ListboxQualif.RemoveItem i
    Else
      ListboxQualif.ListIndex = -1 ' de sorte à ce que rien n'y reste sélectionné)
      On Error Resume Next
      ListboxQualif.Text = selection
      If ListboxQualif2.ListIndex = -1 Then
         MsgBox "Cet élément n'est pas présent"
      Else
         MsgBox "Cet élément est déjà présent"
      End If
      On Error GoTo 0
    Exit For
    End If
    Next i
    Je pense que je tourne mal les choses.

    Et pas la peine de s’agacer ! on est pas tous des experts ! Si je viens demander de l'aide c'est justement parce que je suis bloquée.

    Merci d'avance,

  13. #13
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Vraiment désolé, mais :
    je ne m'agace pas du tout.
    Tout simplement :
    Je pioche sur internet des codes qui peuvent m'aider et je les adapte.
    Alors sans moi sur une telle voie.

  14. #14
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    @Mel :
    Au lieu de piquer des bouts de rustine à droite à gauche et de les assembler, la réponse à nombre de tes questions est ici :
    Lecture saine

    A lire également : UserForm

    Et comme tu es sur Mac : Un complément de lecture s'impose...

  15. #15
    Membre très actif
    Femme Profil pro
    Assistante
    Inscrit en
    Février 2016
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Assistante

    Informations forums :
    Inscription : Février 2016
    Messages : 166
    Par défaut
    J'ai dit que je n'étais pas une pro mais pas une neuneu non plus. Je sais ce que je recherche, et si j'arrive à adapter c'est que je comprend ...
    Les projets sur lesquels je travail c'est pour mon employeur, donc j'ai tout de même des bases...

    BREF
    Je ne suis pas venue me quereller.

    J'ai repris ce que unparia m'a proposé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ListboxQualif.ListIndex = -1
    On Error Resume Next
    ListboxQualif.Text = "toto"
    If ListboxQualif.ListIndex = -1 Then
    MsgBox "élement non présent"
    Else 'If ListboxQualif.ListIndex >= 0 Then
    MsgBox "élément déjà présent"
    End If
    On Error GoTo 0
    J'ai enlevé la première ligne que tu me proposais Unparia :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListboxQualif.AddItem "toto
    car le problème était que "toto" s'ajoutait dans la listbox, donc forcément j'avais le message : "élément présent".

    Donc avec tout ce que vous m'avez proposé, je devrais pouvoir faire le lien avec ma seconde listbox.

    Je reviendrais poster le code définitif.

    Merci pour votre aide. J'espère que vous m'accueillerez mieux la prochaine fois...

    Mél.

  16. #16
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Mel,
    Ne prends pas la mouche lorsque l'on vient t'aider. La meilleure méthode pour toi et de suivre un guide, pas d'ingerer un code tout fait.
    Tu as tout ce qu'il te faut dans mes liens.
    1- boucle sur ta listbox1
    2- si ligne sélectionnée, tu extraies sa valeur.
    Cette valeur c'est le "toto" de unparia.
    3- tu verifies grâce au code d'unparia si cette valeur est présente dans ta listbox2 en faisant :
    ListBox2.AddItem MaValeurTrouvee
    Etc....
    Tout y est, à toi d'essayer et de revenir, avec peut être un bout de code qui ne fonctionne pas.
    C'est comme ça qu'on apprend également.

    D'autant plus que tout ceci est relativement simple.
    Bonne soirée à toi.

  17. #17
    Membre très actif
    Femme Profil pro
    Assistante
    Inscrit en
    Février 2016
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Assistante

    Informations forums :
    Inscription : Février 2016
    Messages : 166
    Par défaut
    Bonjour tout le monde,
    Je reviens donc vers vous, j'ai réussi à bidouiller un code qui fonctionne, grâce à vos éléments, puis en reprenant des bases :
    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 FlècheAjout2_click()
     
    Dim i As Integer, J As Integer, K As Integer
     
    For K = ListboxQualif.ListCount - 1 To 0 Step -1
        If ListboxQualif2.ListCount = 0 Then
            If ListboxQualif.Selected(K) = True Then
                ListboxQualif2.AddItem ListboxQualif.List(K)
                ListboxQualif.Selected(K) = True
                ListboxQualif.RemoveItem K
              Exit For
            End If
        End If
    Next K
     
    For i = ListboxQualif.ListCount - 1 To 0 Step -1
    For J = ListboxQualif2.ListCount - 1 To 0 Step -1
        If Not ListboxQualif2.ListCount = 0 Then
            If ListboxQualif.Selected(i) = True Then
                If ListboxQualif2.List(J) = ListboxQualif.List(i) Then
                  MsgBox ListboxQualif.List(i) & " Existe dans la LB2"
                  Exit For 
                  ElseIf ListboxQualif.List(i) <> ListboxQualif2.List(J) Then
                  MsgBox ListboxQualif.List(i) & "Cet élément n'existe pas dans la LB2"
                  ListboxQualif2.AddItem ListboxQualif.List(i)
                  ListboxQualif.RemoveItem i
                  Exit For
                End If
            End If
        End If
    Next
    Next
    End Sub
    Par contre, en faisant le test, je fais un changement dans ma combobox puis je reviens sur la liste précédente, les items qui sont déjà présents dans la listboxqualif2 réapparaissent dans la 1ère listboxqualif (ce qui est normal par rapport à mon projet, comme je vous l'avez signalé). Par contre, dans ce cas, le code ne fonctionne plus. Il ne reconnait plus les items identiques de la listboxqualif à la listboxqualif2. Donc quand je clique sur mon bouton (FlècheAJout2) il me les ajoute dans la listboxqualif2 alors qu'ils y sont déjà ...
    Je ne comprend pas ...

    Du coup, j'ai revu mon projet, et je supprime les items de la listboxqualif, à chaque fois que je charge une liste dont j'ai déjà transféré des items sélectionnés dans la listboxqualif2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim m As Integer, n As Integer
     
    For m = ListboxQualif2.ListCount - 1 To 0 Step -1
    For n = ListboxQualif.ListCount - 1 To 0 Step -1
    If ListboxQualif2.List(m) = ListboxQualif.List(n) Then
    ListboxQualif.RemoveItem n
    End If
    Next
    Next
    J'espère que j'ai été claire dans mes explications :s

    Par contre, si vous avez des propositions pour le premier code, je suis preneuse, ça m'embête de le laisser tomber :s

    Merci !

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/05/2017, 22h16
  2. [XL-2010] Désélectionner les éléments sélectionnés dans une ListBox à sélection multiple
    Par modus57 dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 26/10/2016, 00h05
  3. Sélectionner un élément précis dans une combobox
    Par adamsmith dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 20/08/2009, 14h30
  4. Réponses: 5
    Dernier message: 18/09/2008, 15h02
  5. Réponses: 2
    Dernier message: 22/09/2006, 13h57

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