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 SubCeci é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
Bonsoir,
remplacez ceci :
' si on se trouve en colonne 9 (I)
If Target.Column = 9 Thenpar :
' 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