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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

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