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 :

[VBA] Listbox selection de deux éléments en un seul clic [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2018
    Messages : 3
    Par défaut [VBA] Listbox selection de deux éléments en un seul clic
    Bonjour à tous,
    Tout d'abord je suis novice sur VBA et sur ce forum. Je ne sais même pas si je suis au bon endroit pour poser ma question

    J'ai écrit du code qui, pour chaque mot d'une liste de mot classés dans une colonne d'une feuille d'un classeur excel (qui regroupe les mots d'un document), vérifie la présence du mot dans une autre feuille du même classeur (il s'agit d'une sorte de dictionnaire, ou des cellules sont marquées d'une étoile "*" en fonction des champs d'application du mot). Si le mot est inconnu, un UserForm s'ouvre afin de demander à l'utilisateur que faire du mot (un UserForm s'ouvre donc pour chaque mot inconnu) et en particulier choisir quels sont les champs d'application du mot (afin d'intégrer le mot et ses champs d'application dans le dictionnaire). Mon maître de stage m'a demandé de faire basculer les champs sélectionnés d'une ListBox vers une autre (il tient au fait que ce soient des ListBox et non des CheckBox ou autres). J'ai donc implémenté une sub ListBox_Change, qui a donc pour but de transférer le champ sélectionné d'une ListBox à une autre dès l'instant qu'il est sélectionné (cette manœuvre est aussi implémentée dans le sens inverse au cas ou on se serait trompé). Mon problème réside dans le fait que, de manière aléatoire, cette sub s'exécute deux fois et transfert donc un mot et son suivant d'une ListBox à l'autre. Cependant ce phénomène suit tout de même quelques "règles" :

    -Pour une liste de mot à rechercher dans le dictionnaire, le problème apparaît pour toute la liste ou n'apparaît pas
    -Le problème apparaît jusqu'ici soit sur le transfert de la ListBox1 vers la ListBox2, soit sur le transfert inverse, mais pas les deux
    -Le problème n'apparaît que lors du premier click dans la ListBox concernée (mais quand même à chaque ouverture du UserForm)

    Cela fait un moment que je cherche dans mon code et sur internet et je ne trouve pas d'où vient l'erreur. J'ai quand même remarqué plusieurs choses. La première étant que si le ListIntex est paramétré à 2 ou plus, alors l'erreur est systématique (je ne vois aucune logique la dedans). Ensuite, si la ListBox est paramétrée en sélection unique, le premier click transfert non pas deux, mais tous les éléments de la ListBox. Enfin, en déboguant pas à pas, je me suis rendu compte que la sub de transfert s'exécutait deux fois (elle transfert un élément de la ListBox par exécution)

    Je vous joint ci dessous mon code (je sais pas comment le mettre dans les petites cases ou c'est tout joli) qui selon moi ne pose pas problème :

    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
    Private Sub ListBox1_Change()
        Dim i As Integer
        i = 0
        Do While i < taille1
            If ListBox1.Selected(i) = True Then
                ListBox2.AddItem ListBox1.List(i)
                ListBox1.RemoveItem i
                i = i - 1
                Exit Sub
            End If
            i = i + 1
            taille1 = ListBox1.ListCount
        Loop
        taille2 = ListBox2.ListCount
        ok.SetFocus
    End Sub
    Je tiens à préciser que les variables qui ne sont ni initialisées ni déclarées sont des variables globales définies dans un module.
    Je ne sais plus quoi penser de cette erreur, HELP!!!

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Le fait d'utiliser RemoveItem génère la procédure événementielle Change() donc elle sera exécutée deux fois, une première fois à la sélection de l'élément et une seconde fois à la suppression de ce dernier.
    Il te faut utiliser une autre procédure événementielle comme par exemple 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
    16
    17
    18
    19
    20
    21
    22
     
    Private Sub ListBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
     
        If ListBox1.ListIndex > -1 Then
     
            ListBox2.AddItem ListBox1.List(ListBox1.ListIndex)
            ListBox1.RemoveItem (ListBox1.ListIndex)
     
        End If
     
    End Sub
     
    Private Sub ListBox2_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
     
        If ListBox2.ListIndex > -1 Then
     
            ListBox1.AddItem ListBox2.List(ListBox2.ListIndex)
            ListBox2.RemoveItem (ListBox2.ListIndex)
     
        End If
     
    End Sub

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    bonjour theze

    ou tout simplement l'evenement click
    il y a moulte exemples de transfert de list a list
    autant pour moi l'evenement click est bloquant

    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
    Private Sub UserForm_Activate()
        ListBox1.List = Array(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
    End Sub
    'Private Sub ListBox1_Click(): transfert ListBox1, ListBox2: End Sub
    'Private Sub ListBox2_Click(): transfert ListBox2, ListBox1: End Sub
    Private Sub ListBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        transfert ListBox1, ListBox2
    End Sub
    Private Sub ListBox2_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        transfert ListBox2, ListBox1
    End Sub
     
    Sub transfert(ByRef list1 As Object, ByRef list2 As Object)
        With list1
            If .ListIndex <> -1 Then list2.AddItem .List(.ListIndex): .RemoveItem (.ListIndex)
        End With
    End Sub
    @theze
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour Patrick,

    Click est aussi appelé deux fois et génère une erreur au second appel, j'ai testé avant de répondre

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    comment tu a testé le 2d declanchement chez moi j'ai une erreur a remove car la liste a le focus ??
    il faut que je revoie ca ca me titille

    edit:
    Ok j'ai vu!!: j'ai gérer l'erreur et effectivement le click est generé une 2d fois
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    En mettant un point d'arrêt !

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

Discussions similaires

  1. VBA ajouter supprimer via deux listbox
    Par Caillot dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 29/03/2017, 16h20
  2. Réponses: 6
    Dernier message: 08/01/2013, 11h03
  3. selection de plusieurs éléments d'une ListBox
    Par keks42 dans le forum VBA Access
    Réponses: 2
    Dernier message: 30/09/2008, 15h32
  4. Listbox selection multipe et colonnes
    Par Sylvain245 dans le forum IHM
    Réponses: 2
    Dernier message: 01/03/2004, 02h01
  5. [VBA-E] Sélection feuilles sous excel
    Par Mystic eyes dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/02/2004, 13h27

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