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 :

Limiter le nombre de sélection dans un listbox


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Inscrit en
    Juillet 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 13
    Par défaut Limiter le nombre de sélection dans un listbox
    Bonjour à tous,

    Existe-t-il une façon de bloquer/limiter le nombre de sélections que l'utilisateur peut faire dans un listbox multiselect ?

    Merci pour votre aide !

    Blord

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 9
    Par défaut
    Bonjour.
    Voici ce que je propose :
    Dans cet exemple, si l'utilisateur choisit plus de 3 items dans le formulaire que j'ai appelé UserForm1, alors un message d'erreur s'affiche et il ne peut poursuivre.

    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
    Private Sub CommandButton1_Click()
    With UserForm1.ListBox1
    a = 0
    For I = 0 To .ListCount - 1
    If .Selected(I) = True Then
    a = a + 1
    End If
    Next I
     
    If a > 3 Then
    MsgBox "Vous ne pouvez pas sélectionner autant d'items"
    Else
    MsgBox "OK"
    ' et suite du code...
    End If
     
    End With
    End Sub
    J'espère avoir pu un peu t'aider.

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Bonjour,
    dans ListBox_clik tester le nombre de ListBox.selected(i).
    A+
    Edit:
    Désolé Nanou28, je n'avais pas eu l'occasion de lire ton poste et tu à tout à fait raison.
    Edit2 : sauf que ce devrait être dans..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub ListBox1_Click()

  4. #4
    Membre habitué
    Inscrit en
    Juillet 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 13
    Par défaut
    Bonjour à vous 2,

    J'ai testé le code, mais ça ne fonctionne pas... Merci quand même de votre aide...

    Blord

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonsoir, Blord,

    ça "ne fonctionne pas", probablement parce que l'essentiel t'a échappé (rendre False la sélection si > max)

    Je t'aurais volontiers dit comment corriger/compléter ton propre code sur la base de ce qui t'a été dit, mais je ne suis pas non plus d'accord avec le principe d'une boucle "vérificatrrice" du nombre de lignes déjà sélectionnées avant d'en sélectionner une nouvelle. Un tel principe est d'une gourmandise proportionnelle au nombre d'articles de ta listbox !

    VB est quand même capable de compter et de savoir où il en est, non ?...

    Essaye ceci, sans en changer le moindre petit iota , même si certains aspects t'échapperont peut-être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub ListBox1_Click()
      Static nb As Integer
      Dim choisi As Integer, max As Integer
      max = 2 ' tu mets ici la valeur que tu veux (nombre maxi de sélmections autorisées)
      choisi = ListBox1.ListIndex
      If ListBox1.Selected(choisi) = False Then nb = nb - 1: Exit Sub
      If nb >= max Then ListBox1.Selected(choisi) = False
      nb = nb + 1
    End Sub
    Voilà ! pas la moindre boucle.

  6. #6
    Membre habitué
    Inscrit en
    Juillet 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 13
    Par défaut
    Bonjour ucfoutu, le forum,

    Je veux bien ne pas comprendre le code, c'est effectivement de moindre importance si j'arrive à le faire fonctionner .... :-)

    (Il est par contre souvent utile de comprendre le code afin de toujours progresser en VBA...)

    Voir le fichier exemple ci-joint ou j'ai créé un userform avec un listbox multiselect avec le code...

    On peut sélectionner le nombre d'items que l'on veut ???

    Merci de m'aider....

    Blord
    Fichiers attachés Fichiers attachés

  7. #7
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Désolé, mais je n'ouvre (comme de nombreux autres) jamais un fichier xls non créé par moi-même (surtout sur la machine depuis laquelle je te réponds).
    Tout problème peut faire l'objet de son exposé et des quelques lignes de code qui le concernent.

  8. #8
    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 Blord Nanou28 LeForestier l' ami ucfoutu le forum
    peut etre un truc comme ca limiter a 3 select..

    Option Explicit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub ListBox1_Change()
    Dim i As Long, c As Byte
    For i = 0 To ListBox1.ListCount - 1: If ListBox1.Selected(i) Then c = c + 1
    Next i
    If c > 3 Then ListBox1.Selected(ListBox1.ListIndex) = False: MsgBox "3 select max..."
    End Sub

  9. #9
    Expert confirmé
    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
    Par défaut
    Bonjour,

    Je ne vais pas me permettre d’expliciter le code d’ucfoutou, mais t’en donner un mode d’emploi pour sa compréhension. Si ce n’est acquis, profites en au passage pour identifier pourquoi telles ou telles choses sont des Propriétés, Méthodes ou Évènements, ça te fera gagner énormément de temps dans l’avenir…

    Ensuite tu auras quelque chose qui marche et plus important que tu auras compris et que tu sauras refaire ou adapter ce joli morceau de code

    Ligne à ligne : tu regardes les mots clefs et l’aide vba (et les exemples liés)

    Listbox (contrôle) => Evènements => Clic

    Listbox (contrôle) => Propriétés => Listindex

    Listbox (contrôle) => Propriétés => Selected

    Et aussi l’aide à True ou False qui te conduira à Boolean (type de données) qui est la clef de la réponse si question il y a à ce niveau.

    PS : je n’ouvre pas non plus les fichiers…

    Cordialement,

    Didier

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour à tous,

    Ce que veut dire Blord c'est qu'il peut sélectionner autant de lignes qu'il le désire sur la Listbox, rien ne se passe.

    Comme si l'évènement Click ne se produisait pas. D'ailleurs si on place un point d'arrêt, cela n'a aucun effet. Il y a peut-être une subtilité qui m'échappe, mais je n'ai pas trouvé.

    Voici le code qu'il a affecté au formulaire :

    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
    Private Sub UserForm_Initialize()
        ListBox1.AddItem "Projet 1"
        ListBox1.AddItem "Projet 2"
        ListBox1.AddItem "Projet 3"
        ListBox1.AddItem "Projet 4"
        ListBox1.AddItem "Projet 5"
        ListBox1.AddItem "Projet 6"
    End Sub
     
     
    Private Sub ListBox1_Click()
      Static nb As Integer
      Dim choisi As Integer, max As Integer
      max = 2 ' tu mets ici la valeur que tu veux (nombre maxi de sélmections autorisées)
      choisi = Me.ListBox1.ListIndex
      If Me.ListBox1.Selected(choisi) = False Then nb = nb - 1: Exit Sub
      If nb >= max Then Me.ListBox1.Selected(choisi) = False
      nb = nb + 1
    End Sub

  11. #11
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Re,

    Quelle valeur a été assignée à la propriété Multiselect de la listbox ?

  12. #12
    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
    re, le fil j ai teste le code de l ami ucfoutu ca marche tres bien a condition de mettre le code dans change et non dans click multi select bien sur

  13. #13
    Invité
    Invité(e)
    Par défaut
    Ucfoutu : la propriété est "1 FmMultiselectMulti"

    Laetitia :
    avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub ListBox1_Change()
    on sort de la procédure à chaque changement, non ?

  14. #14
    Expert confirmé
    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
    Par défaut
    Oups !

    Merci Jacques Jean
    Pour une sélection multiple, la propriété Multiselect n'est forcément pas à Single, donc l'évènement clic ne se déclenche pas..

    il faut donc passer par une CommandButton annexe de validation des choix faits du genre :

    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 cmd1_Click()
    Dim I As Integer
    Dim choisi As Integer, max As Integer
     
    max = 2 ' tu mets ici la valeur que tu veux (nombre maxi de sélmections autorisées)
    For I = 0 To ListBox1.ListCount - 1
        If ListBox1.Selected(I) = True Then
            choisi = choisi + 1
            If choisi > max Then
                MsgBox "Oups ! ": Exit Sub
            End If
        End If
    Next I
     If choisi > 0 Then MsgBox "lancer le traitement voulu"
    End Sub
    comme quoi il vaut mieux tout lire

    cordialement,

    Didier

  15. #15
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Bonjour à tous,
    Nous oublions une chose... C'est que chaque fois que l'ont modifie une propriété de la ListBox il y a un effet récursif dans les événements de la ListBox, ce qui fausse toutes modifications faites dans l'un de ces événement.
    d'où la solution que j'ai employer dans ce topic qui est un peu lourde mais qui fonctionne parfaitement.
    Il y a probablement d'autres solutions mais personnelement j'ai pas trouver.
    A+

  16. #16
    Invité
    Invité(e)
    Par défaut
    Bonjour Ormonth,

    Merci également pour votre réponse, mais ici je répondais en fonction du code donné par Ucfoutu puis par Laetitia.

    Cette procédure devait permettre de traiter immédiatement le cas du dépassement de lignes choisies sans passer par une validation.

    Cordialement.

  17. #17
    Expert confirmé
    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
    Par défaut
    C'est sur qu'il faut dire en clair à l'utilisateur ce qui se passe et remettre la sélection vierge et un message "Essaie encore !", sinon utiliser des EnableEvents true/false permet d'éviter les évènementiels indésirables....


    PS : pas vu le 13h , euh j'étais à côté de la plaque n'ayant pas lu suffisamment
    cordialement,

    Didier

  18. #18
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Citation Envoyé par Ormonth Voir le message
    sinon utiliser des EnableEvents true/false permet d'éviter les évènementiels indésirables....
    Didier
    EnableEvents n'est valable que pour les événements "feuille" ou WorkBooks mais pas pour des élément ActiveX
    A+

  19. #19
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Par défaut
    bonjour,

    Savez pourquoi les evenements "click" "KeyDown" "KeyPress" "KeyUp" sont inhibés lors la propriété Multiselect = fmMultiSelectMulti ou fmMultiSelectExtended.

    Par contre les évenements "mouse" fonctionnent eux.
    => Mettre la procédure d ' ucfoutu dans l ' êvenement "mousedown " par exemple.

  20. #20
    Expert confirmé
    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
    Par défaut
    EnableEvents n'est valable que pour les événements "feuille" ou WorkBooks mais pas pour des élément ActiveX
    Exact, c'est le jour... dans ce contexte, j'utilise en effet une variable drapeau (Boolean)...

    cordialement,

    Didier

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Limiter le nombre de caractère dans un textarea
    Par Taz_8626 dans le forum Général JavaScript
    Réponses: 34
    Dernier message: 25/04/2006, 15h57
  2. Limiter le nombre de caractère dans un textearea?
    Par Death83 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/01/2006, 02h24
  3. [C#] Limité le nombre de lignes dans une DataView ...
    Par maitrebn dans le forum Accès aux données
    Réponses: 5
    Dernier message: 07/11/2005, 23h57
  4. Sélection dans une ListBox
    Par LoicH dans le forum C++Builder
    Réponses: 2
    Dernier message: 16/04/2005, 22h13

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