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 :

Perte de sélection dans une listbox [Toutes versions]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Administratif
    Inscrit en
    Janvier 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Administratif

    Informations forums :
    Inscription : Janvier 2015
    Messages : 11
    Points : 4
    Points
    4
    Par défaut Perte de sélection dans une listbox
    Bonjour à tous,

    Je cherche à remplir un tableau via un formulaire avec listbox dont j'ai activé la propriété multiselection.

    Mon problème est le suivant :
    Après avoir trouvé une première ligne sélectionnée (et réagis comme attendu), la listbox est visiblement réinitialisée sans aucune sélection
    Conséquence seule une ligne est complétée.

    Mon code tiens en quelques lignes



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub CmbValider_Click()
    Dim i As Long
     
    For i = 1 To ListPrevision.ListCount
        If ListPrevision.Selected(i) = True Then
            MsgBox ListPrevision.List(i)
            Range("E" & i + 1).Offset(0, 1) = ListPrevision.List(i, 4)
            Range("H" & i + 1).Offset(0, 1) = ListPrevision.List(i, 7)
        End If
    Next i
     
    End Sub


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub UserForm_Activate()
    Dim NbreLigne As Long
     
    'Alimentation de la listbox
    NbreLigne = Range("Feuil1!A1").CurrentRegion.Rows.Count
    ListPrevision.RowSource = "Feuil1!A1:J" & NbreLigne
    ListPrevision.ListIndex = 0
    End Sub



    Pouvez vous m'indiquer où est mon erreur svp ?

  2. #2
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 138
    Points : 9 972
    Points
    9 972
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Est-ce que ceci corrige ton 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
    Private Sub CmbValider_Click()
    Dim i As Long
     
    For i = 0 To ListPrevision.ListCount - 1
        If ListPrevision.Selected(i) = True Then
            MsgBox ListPrevision.List(i, 0)
            Range("E" & i + 1).Offset(0, 1) = ListPrevision.List(i, 3)
            Range("H" & i + 1).Offset(0, 1) = ListPrevision.List(i, 6)
        End If
     
    Next i
     
    End Sub

    j'ai volontairement modifié le départ et la fin de ton i ainsi que le numéro de colonne que tu utilises dans ton traitement, car le premier élément de ta liste est List(0,0) et pas List(1,1)

  3. #3
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 138
    Points : 9 972
    Points
    9 972
    Billets dans le blog
    5
    Par défaut
    Je reposte plutôt qu'éditer mon message


    désolé, j'ai mal effectué mon test, ce qui a biaisé mon constat

    en fait tes items se désélectionnent quand tu commences à écrire dans ton classeur

    donc je te propose de stocker les index d'items sélectionnés dans une première boucle
    ensuite on fait une seconde boucle avec ces index pour effectuer les écritures

    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
    Private Sub CmbValider_Click()
    Dim i As Long
    Dim ListeSelection
     
    ReDim ListeSelection(0)
    For i = 0 To ListPrevision.ListCount - 1
        If ListPrevision.Selected(i) = True Then
            If ListeSelection(0) = "" Then
                ListeSelection(0) = i
            Else
                ReDim Preserve ListeSelection(UBound(ListeSelection) + 1)
                ListeSelection(UBound(ListeSelection)) = i
            End If
        End If
    Next i
     
    For i = LBound(ListeSelection) To UBound(ListeSelection)
            MsgBox ListPrevision.List(ListeSelection(i), 0)
            Range("E" & ListeSelection(i) + 1).Offset(0, 1) = ListPrevision.List(ListeSelection(i), 3) & " TOTO"
            Range("H" & ListeSelection(i) + 1).Offset(0, 1) = ListPrevision.List(ListeSelection(i), 6) & " TOTO"
    Next i
     
    End Sub

    je sais pas si y'a plus adapté, et je serai curieux/ravi de voir une méthode un peu moins brute que celle là !

  4. #4
    Candidat au Club
    Homme Profil pro
    Administratif
    Inscrit en
    Janvier 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Administratif

    Informations forums :
    Inscription : Janvier 2015
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Bonjour Joe,

    Merci pour ta réponse,


    Pour l'instant ton code ne fonctionne pas correctement :
    Il enregistre ne nombre de sélection effectué et non l'index de la sélection.
    Je ne connais pas les commandes que tu as utilisées... je m'y penche..... merci de ton aide

  5. #5
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 138
    Points : 9 972
    Points
    9 972
    Billets dans le blog
    5
    Par défaut
    reprend bien mon dernier code, ce n'est plus l'indice "i" qu'on utilise dans la seconde boucle

    c'est l'indice ListeSelection(i) qu'on utilise



    pour bien comprend, voici la démarche :

    - chaque items sélectionné possède un index : 0 = le premier élément de la listbox || Listcount - 1 = le dernier élément

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = 0 To ListPrevision.ListCount - 1
    - on met tous les index d'items sélectionnés dans un tableau : ListeSelection

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    If ListPrevision.Selected(i) = True Then
            If ListeSelection(0) = "" Then
                ListeSelection(0) = i
            Else
                ReDim Preserve ListeSelection(UBound(ListeSelection) + 1)
                ListeSelection(UBound(ListeSelection)) = i
            End If
        End If
    - on boucle sur chaque élément de ListeSelection : donc on boucle sur chaque index d'item sélectionné

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = LBound(ListeSelection) To UBound(ListeSelection)

    - pour bien récupérer la valeur de ton item, on a besoin de son index ... qui est situé dans ListeSelection
    donc on prend l'item(i) , où i est en fait ListeSelection(i)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox ListPrevision.List(ListeSelection(i), 0)

  6. #6
    Candidat au Club
    Homme Profil pro
    Administratif
    Inscrit en
    Janvier 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Administratif

    Informations forums :
    Inscription : Janvier 2015
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    çà fonctionne

    Merci Joe

    Je suis tout de même curieux de savoir pourquoi mo premier essai ne fonctionne pas :
    Pourquoi cette perte de sélection après 1 tour de boucle......

    En tout cas ta solution, bien que plus compliqée, fonctionne

  7. #7
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 138
    Points : 9 972
    Points
    9 972
    Billets dans le blog
    5
    Par défaut
    Le plus bizarre, c'est qu'avec mon code du message #2 ... maintenant ça fonctionne !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub CmbValider_Click()
    Dim i As Long
     
    For i = 0 To ListPrevision.ListCount - 1
        If ListPrevision.Selected(i) = True Then
            MsgBox ListPrevision.List(i, 0)
            Range("E" & i + 1).Offset(0, 1) = ListPrevision.List(i, 3)
            Range("H" & i + 1).Offset(0, 1) = ListPrevision.List(i, 6)
        End If
    Next i
     
    End Sub

    j'ai sélectionné 4 items ... et j'ai bien eu les 4 qui ont été reportés dans le classeur

    j'ai testé avec la propriété modale à True et False ... ça fonctionne dans les deux cas.

  8. #8
    Candidat au Club
    Homme Profil pro
    Administratif
    Inscrit en
    Janvier 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Administratif

    Informations forums :
    Inscription : Janvier 2015
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Bien.... Je ne comprend pas.
    Ici le code du message #2 ne fonctionne pas (1 seul report).

    Re,

    Après utilisation, je me rend compte que la solution avec la liste qui récupère les éléments sélectionnés comporte une faille :

    Si aucun élément n'est sélectionné, le code modifie la première ligne (entête de colonne)... ce qui est incorrecte

    Une idée ?...

  9. #9
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 138
    Points : 9 972
    Points
    9 972
    Billets dans le blog
    5
    Par défaut
    c'est lié au fait qu'avant de savoir si une ligne est sélectionnée ou non, on dimensionne ListeSelection(0) ...

    voici le correctif pour gérer ce cas :

    - ajout d'une variable boléenne "ini" pour savoir si on déjà initialisé le tableau
    - au premier élément trouvé comme "sélectionné" : on initialise le tableau avec le premier item et on passe la variable "ini" à True
    - pour les éléments suivants, l'alimentation s'effectue comme auparavant
    - quand on arrive au stade où on doit écrire les valeurs, on regarde si le tableau a été initialisé. Si c'est pas le cas, on averti l'utilisateur et on quitte la procédure. Sinon, on fait les écritures

    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
    Private Sub CmbValider_Click()
    Dim i As Long
    Dim ListeSelection
    Dim Ini As Boolean
     
    For i = 0 To ListPrevision.ListCount - 1
        If ListPrevision.Selected(i) = True Then
            If Ini = False Then
               ReDim ListeSelection(0)
               ListeSelection(0) = i
               Ini = True
            Else
                ReDim Preserve ListeSelection(UBound(ListeSelection) + 1)
                ListeSelection(UBound(ListeSelection)) = i
            End If
        End If
    Next i
     
    If Ini = True Then
        For i = LBound(ListeSelection) To UBound(ListeSelection)
                MsgBox ListPrevision.List(ListeSelection(i), 0)
                Range("E" & ListeSelection(i) + 1).Offset(0, 1) = ListPrevision.List(ListeSelection(i), 3) & " TOTO"
                Range("H" & ListeSelection(i) + 1).Offset(0, 1) = ListPrevision.List(ListeSelection(i), 6) & " TOTO"
        Next i
    Else
        MsgBox "Aucune ligne sélectionnée"
    End If
     
    End Sub

  10. #10
    Candidat au Club
    Homme Profil pro
    Administratif
    Inscrit en
    Janvier 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Administratif

    Informations forums :
    Inscription : Janvier 2015
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Cool
    Tes explications sont très claires Joe

    Je vais maintenant potasser l'utilisation des tableaux pour bien comprendre "mon" code


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

Discussions similaires

  1. Sélection dans une listbox
    Par philippef dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 17/03/2010, 18h52
  2. Sélection dans une Listbox
    Par lesultan2007 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 09/07/2008, 12h43
  3. lister répertoire selon sélection dans une listbox
    Par gorgoroth dans le forum Langage
    Réponses: 12
    Dernier message: 03/06/2008, 17h06
  4. Problème de sélection dans une listbox
    Par cacahuèèète dans le forum Access
    Réponses: 3
    Dernier message: 29/06/2006, 15h03
  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