Problème liste déroulante (ListBox) Excel 2010

Bonjour,

Je précise que je suis sur Excel 2010.

J'ai crée une liste déroulante (ListBox) avec possibilité de choix multiple. Le code fonctionne bien quand je l'utilise avec mon tableau au complet par contre il ne marche pas quand je créais un filtre dans une de mes colonnes. Il applique la sélection de ma liste à pratiquement l'ensemble de mes cellules (ce que je ne veux pas).

Ensuite quand je sélectionne (coche) des cases de ma liste déroulantes et que je reviens dessus, le choix est conservé par contre quand je ferme Excel et l'ouvre à nouveau il ne me conserve pas la sélection.

La liste apparait quand on va dans les cellules de la colonne I (Catégorie) de la feuille "PARAMETRES PARTAGES"

La liste, elle se trouve dans la feuille "LISTES DEROULANTES" au niveau de la colonne E (CATEGORIE)

Pouvez-vous m'aider sur mon code :

1) A pouvoir l'utiliser même quand je fais un filtre sur une colonne (plus facile à remplir qu'un grand tableau)

2) Qu'il me conserve ma sélection dans la liste (il conserve bien le contenu dans la cellule)

J'espère avoir été clair dans mes explications

Merci d'avance pour votre aide

Cordialement

Patrice

Bonjour et

J'espère que vous êtes passé par la case lecture de la charte

Sinon

il ne marche pas quand je créais un filtre dans une de mes colonnes. Il applique la sélection de ma liste à pratiquement l'ensemble de mes cellules (ce que je ne veux pas).

Désolé, mais ce n'est pas le cas, ça marche très bien chez moi

Pour le reste vous passé par un dictionnaire qui n'est forcément pas mise à jour lors de la réouverture du fichier
et pas envie de mettre les mains dans le code existant, désolé.

A+

Bonsoir,

tout comme BrunoM45, malgré les filtres cela fonctionne mais je ne suis pas en version 2010...

Sinon pour la mise à jour de la liste en "direct live" au niveau de la cellule j'ai modifié et supprimé pas mal de code, voici le résultat à mettre à la place de tout ce qui se trouve sur la page de code de la feuille :

Option Explicit
Dim MAJ As Boolean
Dim CelModif As Range

Private Sub ListBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    ' si on détecte un clic sur la ListBox c'est qu'on vient de cocher ou décocher une ligne
    ' la mise à jour de la liste n'est donc plus "bonne" on passe la variable à FALSE
    MAJ = False
End Sub

Private Sub ListBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Dim Blc As Integer

    ' Si la mise à jour de la liste n'est pas bonne, alors on va la mettre à jour
    If MAJ = False Then
        ' comme on va mettre la liste à jour on passe la variable à TRUE
        MAJ = True
        ' on met à jour la cellule, on l'efface
        CelModif = ""
        ' avec la ListBox
        With ListBox1
            ' on efface les données de la cellule
            CelModif.ClearContents
            ' on boucle sur chaque Item de la ListBox1
            For Blc = 0 To ListBox1.ListCount - 1
                ' si l'Item est sélectionné
                If ListBox1.Selected(Blc) Then
                    ' on affiche la valeur dans la colonne A à la suite de ce qui est déjà écrit
                    CelModif = CelModif & ListBox1.List(Blc) & ", "
                End If
            Next
            ' si la cellule n'est pas vide on retire la dernière virgule et son espace
            If CelModif <> "" Then CelModif = Left(CelModif, Len(CelModif) - 2)
        End With
    End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim tablo, j, i
    Dim lastRow As Long
    Set CelModif = Target
    ' pas de sélection multiple
    If Target.CountLarge > 1 Then Exit Sub
    ' si on se trouve en colonne 9 (I)
    If Target.Column = 9 Then
        With Me.ListBox1
            .MultiSelect = fmMultiSelectMulti
            .ListStyle = fmListStyleOption
            .Height = 150
            .Width = 200
            .Top = Target.Top
            .Left = Target.Offset(0, 1).Left
            .Visible = True
        End With
        ' Récupère les données de la liste déroulante
        lastRow = Worksheets("LISTES DEROULANTES").Cells(Worksheets("LISTES DEROULANTES").Rows.Count, "E").End(xlUp).Row
        If lastRow >= 2 Then
            ListBox1.List = Worksheets("LISTES DEROULANTES").Range("E2:E" & lastRow).Value
        Else
            MsgBox "Aucune donnée trouvée pour la catégorie."
            Exit Sub
        End If
        ' on vide les coches
        For i = 0 To Me.ListBox1.ListCount - 1
            ' on desactive la coche
            Me.ListBox1.Selected(i) = False
        Next i
        ' on restaure les sélections existantes dans la cellule cliquée
        ' on récupère les données de la cellule si c'est différent de rien
        If Cells(Target.Row, 9) <> "" Then
            tablo = Split(Cells(Target.Row, 9), ",")
            ' on boucle sur les données de la cellule
            For j = 0 To UBound(tablo)
                ' on boucle sur les données de la listebox
                For i = 0 To Me.ListBox1.ListCount - 1
                    ' si les données sont identiques
                    If Me.ListBox1.List(i) = Trim(tablo(j)) Then
                        ' on active la coche
                        Me.ListBox1.Selected(i) = True
                        ' on sort de la boucle
                        Exit For
                    End If
                Next i
            Next j
        End If
    ' on a quitté la colonne I, on masque la listbox
    Else
        Me.ListBox1.Visible = False
    End If
End Sub

@ bientôt

LouReeD

Bonjour,

Merci pour vos réponses, désolé de ne pas avoir répondu plus tôt mais j'étais en congé.

J'ai repris votre code (LouReeD) et j'ai de mon côté une erreur d'exécution de votre code "Erreur d'exécution '13': Incompatibilité de type.

Quand je fais "débogage" il me renvoie à CelModif = CelModif & ListBox1.List (Blc) & ","

J'ai une version d'excel plus récente chez moi, je vais l'essayer pour voir s'il marche et si cela vient vraiment de la version d'Excel car si cela marche pour BrunoM45 alors que pour moi il ne fonctionne pas correctement cela vient surement de la version et des restrictions que j'ai peut être dans ma société.

Sinon existe-il une autre manière de faire autre que par la liste déroulante car j'aimerai qu'il conserve mes choix et enregistre ses choix à chaque ouverture de mon fichier.

Merci par avance

Cordialement

Bonsoir,

j'ai de nouveau téléchargé votre fichier du premier message, j'ai supprimé tout le code existant sur la feuille concernée, j'ai copié collé "mon code" sur cette feuille "côté" VBA, et cela fonctionne chez moi... Voici le fichier modifié :

Qu'en est il pour vous ?

@ bientôt

LouReeD

Bonjour,

J'ai la même erreur sur le fichier que tu m'as envoyé. Par contre il conserve bien la sélection dans la liste mais j'ai le bug.

J'ai essayé chez moi hier soir avec mon fichier et j'ai les même erreurs qu'avec la version 2010. Il ne me conserve pas les choix fait dans la liste (il conserve bien dans la cellule mais pas dans la liste) et quand je fais un filtre (par exemple avec la colonne M) il applique la sélection aussi au ligne masqué !!!

Je t'ai fais 2 vidéos d'explication pour voir l'erreur sur ton fichier et une autre sur l'explication du filtre avec mon fichier. Malheureusement je suis nouveau sur le site et je ne peux pas mettre de lien dans mon message. Peux-tu m'envoyer un message MP pour que je puisse t'envoyer le lien ?

Merci pour ton aide

@ bientôt

patBabas

Bonsoir,

un dernier test car sinon je ne vois pas ce qui cloche...
J'ai créé une variable "Variant" afin de construire la valeur en cours de modifications de la cellule est une fois fini je dis que la cellule modifiée a une valeur égale à cette variable :

Option Explicit
Dim MAJ As Boolean
Dim CelModif As Range

Private Sub ListBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    ' si on détecte un clic sur la ListBox c'est qu'on vient de cocher ou décocher une ligne
    ' la mise à jour de la liste n'est donc plus "bonne" on passe la variable à FALSE
    MAJ = False
End Sub

Private Sub ListBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Dim Blc As Integer, ModifTexteCellule As Variant

    ' Si la mise à jour de la liste n'est pas bonne, alors on va la mettre à jour
    If MAJ = False Then
        ' comme on va mettre la liste à jour on passe la variable à TRUE
        MAJ = True
        ' on efface les données de la cellule
        CelModif.ClearContents
        ModifTexteCellule = ""
        ' avec la ListBox
        With ListBox1
            ' on boucle sur chaque Item de la ListBox1
            For Blc = 0 To ListBox1.ListCount - 1
                ' si l'Item est sélectionné
                If ListBox1.Selected(Blc) Then
                    ' on affiche la valeur dans la colonne A à la suite de ce qui est déjà écrit
                    ModifTexteCellule = ModifTexteCellule & ListBox1.List(Blc) & ", "
                End If
            Next
            ' si la cellule n'est pas vide on retire la dernière virgule et son espace
            If ModifTexteCellule <> "" Then
                ModifTexteCellule = Left(ModifTexteCellule, Len(ModifTexteCellule) - 2)
                CelModif.Value = ModifTexteCellule
            End If
        End With
    End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim Tablo, I, J, LastRow As Long
    Set CelModif = Target
    ' pas de sélection multiple
    If Target.CountLarge > 1 Then Exit Sub
    ' si on se trouve en colonne 9 (I)
    If Target.Column = 9 Then
        With Me.ListBox1
            .MultiSelect = fmMultiSelectMulti
            .ListStyle = fmListStyleOption
            .Height = 150
            .Width = 200
            .Top = Target.Top
            .Left = Target.Offset(0, 1).Left
            .Visible = True
        End With
        ' Récupère les données de la liste déroulante
        LastRow = Worksheets("LISTES DEROULANTES").Cells(Worksheets("LISTES DEROULANTES").Rows.Count, "E").End(xlUp).Row
        If LastRow >= 2 Then
            ListBox1.List = Worksheets("LISTES DEROULANTES").Range("E2:E" & LastRow).Value
        Else
            MsgBox "Aucune donnée trouvée pour la catégorie."
            Exit Sub
        End If
        ' on vide les coches
        For I = 0 To Me.ListBox1.ListCount - 1
            ' on desactive la coche
            Me.ListBox1.Selected(I) = False
        Next I
        ' on restaure les sélections existantes dans la cellule cliquée
        ' on récupère les données de la cellule si c'est différent de rien
        If Cells(Target.Row, 9) <> "" Then
            Tablo = Split(Cells(Target.Row, 9), ",")
            ' on boucle sur les données de la cellule
            For J = 0 To UBound(Tablo)
                ' on boucle sur les données de la listebox
                For I = 0 To Me.ListBox1.ListCount - 1
                    ' si les données sont identiques
                    If Me.ListBox1.List(I) = Trim(Tablo(J)) Then
                        ' on active la coche
                        Me.ListBox1.Selected(I) = True
                        ' on sort de la boucle
                        Exit For
                    End If
                Next I
            Next J
        End If
    ' on a quitté la colonne I, on masque la listbox
    Else
        Me.ListBox1.Visible = False
    End If
End Sub

Ceci évite de travailler directement avec la cellule (peut-être aurait il fallu ajouter ".Value" derrière CelModif...)

@ bientôt

LouReeD

Bonjour,

Je viens de faire l'essai de ton nouveau code et tout marche nickel !!!

Merci à toi pour ton aide.

Bonne journée

Cordialement

@bientôt

Re-bonjour,

Est-il possible d'avoir la liste déroulante seulement quand je suis dans le tableau avec les lignes remplis et de ne pas l'avoir quand je sélectionne une cellule en dehors du tableau ?

Je crois que j'avais cette possibilité dans mon code de base (ok qui ne fonctionnait pas correctement )

Merci d'avance

@bientôt

patBabas

Bonjour,

Pourtant on a bien "if target.column =9" et "else lisrbox1.visible=false" elle devrait donc s'effacer avec un clic sur une colonne différente de G...

@ bientôt

LouReeD

Bonjour,

Effectivement je n'ai pas la liste déroulante qui apparaît quand je suis sur une autre colonne. Par contre si je suis dans ma colonne "Catégorie" à la ligne 200 par exemple (ligne non remplie) je me retrouve avec la liste déroulante (exemple ci-dessus où je suis en dehors du tableau).

Merci

@bientôt

liste deroulante visible dans une ligne vierge excel

Bonsoir,

remplacez ceci :

' si on se trouve en colonne 9 (I)
If Target.Column = 9 Then

par :

' si on se trouve en colonne "Catégorie" du tableau structuré "PARAMETRES_PARTAGES"
If Not Intersect(Target, Range("PARAMETRES_PARTAGES[Catégorie]")) Is Nothing Then

@ bientôt

LouReeD

Bonjour,

Merci LouReeD pour ton aide. Le résultat correspond exactement à ce que je voulais.

@bientôt pour d'autres codages

patBabas

Bonjour,

Merci de votre retour et remerciement !

@ bientôt

LouReeD

Rechercher des sujets similaires à "probleme liste deroulante listbox 2010"