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 :

Annuler sélection listBox


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Par défaut Annuler sélection listBox
    Bonsoir,
    Je voudrais annuler la sélection d'un item d'une listbox dans l'évènement Change.

    Lorsque l'utilisateur change de valeur, il y a un filtre qui est effectué, et si l'item n'est pas sélectionnable, un message apparait et c'est à se moment là que je veux remettre à 0 la sélection, sauf que ça ne fonctionne pas.

    Voici un exemple tout bête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub ListBox1_Change()
    If ListBox1.ListIndex = 1 Then
        'ListBox1.Enabled = False 'en commentaire car ça change rien
        MsgBox "Coucou la liste = 1"
        ListBox1.ListIndex = -1
        'ListBox1.Enabled = True
    End If
    End Sub
    La macro passe même deux fois sur l'évènement...
    Avez vous une idée?

    Merci beaucoup de votre aide.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Par défaut
    Solution de contournement trouvée.
    Je déclare une variable boolean dans mon module, si la condition de selection n'est pas autorisée, je gère le truc dans l'evenement MouseUp :
    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
    Public annulation As Boolean
     
    Private Sub ListBox1_Change()
    If ListBox1.ListIndex = 1 Then
        annulation = True
    End If
    End Sub
     
    Private Sub ListBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If annulation Then
        ListBox1.ListIndex = -1
        annulation = False
        MsgBox "Coucou, il est interdit de faire ce choix !!!"
    End If
    End Sub
    J'ai trouvé que ça en attendant.
    Cordialement,

  3. #3
    Membre éprouvé
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Par défaut
    Bonsoir, je suis de nouveau bloqué.
    La methode que je livre ci-dessus fonctionne si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListBox1.ListIndex = -1
    Mais si je veux repositionner la sélection sur une autre ligne, le code est inopérant. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListBox1.ListIndex = 0 'cette ligne la n'est pas selectionnée...
    Je suis dans l'impasse. Si vous avez quelque chose, merci a vous!

    Bonne nuit! :-)

  4. #4
    Membre très actif Avatar de Gorzyne
    Profil pro
    Collégien
    Inscrit en
    Janvier 2008
    Messages
    337
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Janvier 2008
    Messages : 337
    Par défaut
    Salut Jojo triste que personne ait répondu à ton message à l'époque

    j'ai le même problème j'ai essayé de m'en sortir avec enableevents = False mais il execute quand même la macro évenementielle malgré le enableevents = False

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 169
    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 : 13 169
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    L'instruction Application.EnableEvents n'a pas d'effet sur les contrôles du UserForm
    Pour éviter de passer par des instructions présentes dans un Event, il faut utiliser une variable booléenne
    Lorsque l'on modifie la propriété ListIndex du contrôle ListBox on déclenche inévitablement un événement de changement (Change)
    J'utilise l'événement Click pour gérer la sélection d'un ou plusieurs éléments de la liste.
    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

  6. #6
    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
    Coucou
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    .....
    J'utilise l'événement Click pour gérer la sélection d'un ou plusieurs éléments de la liste.

    Et c'est le seul évènement à considérer lorsque l'on veut déterminer de manière orthodoxe la sélection faite. L'évènement Change n'étant, quant à lui, que la conséquence et non la cause.

    Ce distinguo est d'autant plus important à faire, que la "conséquence" (le Change) peut avoir une toute autre cause que celle d'une sélection (le clic).

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 364
    Par défaut
    Bonsoir,

    le contrôle ListBox (Userform nommé Usf) étant nommé Lst, en un clin d'œil :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Lst_Click()
      If Lst.ListIndex = 1 Then Unload Me: Usf.Show
    End Sub

  8. #8
    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 Ordonc

    Je crois que tu n'as pas tout compris du but recherché par jojo.
    Il ne veut pas fermer l'userform. Il veut :
    - interdire de sélectionner l'index 1 (la seconde ligne de la listbox) et afficher un message d'interdiction
    - puis pouvoir forcer une autre sélection (de l'index 0, par exemple).
    Il se heurte alors à des "défaillances" qui ne sont en réalité que de rendu graphique, mal géré par cet activex.

    On peut forcer à tout redessiner ainsi, par 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
    Private Sub UserForm_Initialize()
     ' juste pour avoir un "substrat" pour tester
       toto = Array("a", "b", "c")
       ListBox1.List = toto
    End Sub
     
     
     
    Private Sub ListBox1_Click()
      Static toto As Boolean
      If ListBox1.ListIndex = 1 And toto = False Then
        MsgBox "on ne touche pas à cet index 1 (la seconde ligne)"
        toto = Not toto
        ListBox1.MultiSelect = 1 '--->> je force ainsi le "re-dessin"
        ListBox1.ListIndex = -1
        ListBox1.MultiSelect = 0 '--->> je remets les choses en l'état originel
        toto = Not toto
      End If
    End Sub
     
    Private Sub CommandButton1_Click()
      'preuve du bon fonctionnement
      MsgBox ListBox1.ListIndex ' -->> affichera -1
      ListBox1.ListIndex = 0 ' -->> sélectionnera bien l'index 0
    End Sub
    Lancer -->> sélectionner la seconde ligne (index 1) -->> message -->> OK --->> cliquer sur le bouton de commande et constater.

    EDIT : donner une solution à ce problème ne signifie absolument pas que je trouve une réelle utilité à ce genre de démarches.

  9. #9
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 364
    Par défaut
    re, salut unparia !

    Citation Envoyé par unparia Voir le message
    Je crois que tu n'as pas tout compris du but recherché par jojo.
    Le but dépend quand même de ce que l'on a au départ, non ?

    Je sais que ma proposition est radicale et peut être à rejeter s'il y a d'autres contrôles déjà initialisés.
    Dans ce cas, c'est une autre histoire dont on ne connait pas le fil, n'est-ce pas jojo * ?

    Si on part avec Option Explicit en tête de gondole**, ta proposition, légèrement modifiée, pourra faire l'affaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Option Explicit
    Private Sub UserForm_Initialize()
       ListBox1.List = Array("a", "b", "c")
     End Sub
    * en général, je n'interviens pas quand je ne connais pas le contexte.
    Je l'ai fait ici sachant qu'il y aurait des réactions, pour insister sur le fait qu'en naviguant à vue on risque de perdre le nord.
    On peut se poser la question : «Pourquoi inscrire un item que l'on va refuser ensuite à grand bruit ?».

    ** c'est toujours mon cas (je réside Place St Marc) .

  10. #10
    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 Ordonc
    On peut se poser la question : «Pourquoi inscrire un item que l'on va refuser ensuite à grand bruit ?».
    C'est l'une (la principale et non l'unique) des raisons de mon édit :
    EDIT : donner une solution à ce problème ne signifie absolument pas que je trouve une réelle utilité à ce genre de démarches.
    Il est par ailleurs (et ce : de manière générale) assez maladroit (sur le plan de la convivialité, de l'ergonomie et du risque induit) de déclencher des actions "parallèles" directement au clic de l'utilisateur.

    EDIT :
    Dans ce cas, c'est une autre histoire dont on ne connait pas le fil, n'est-ce pas jojo * ?
    Je crains fort que jojo ne surveille plus depuis très longtemps la présente discussion

Discussions similaires

  1. [AC-2007] Récupération Sélection ListBox dans Requête
    Par JDev_ dans le forum VBA Access
    Réponses: 5
    Dernier message: 08/06/2012, 15h49
  2. [XL-2010] Trier des lignes d'un tableau à partir d'une sélection listbox
    Par JulienLeno dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 19/10/2011, 16h00
  3. [ListBox] Annuler la sélection
    Par h0pelessS dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 06/07/2009, 09h39
  4. Sélection listbox, évênement sur simple clic
    Par DrizztDo dans le forum IHM
    Réponses: 5
    Dernier message: 26/01/2009, 19h37
  5. 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