Réinitialisation non voulue des choix d'une ListBox ActiveX

Bonjour à tous,

mon problème a l'air simple. J'ai une ListBox ActiveX, que j'alimente grâce à un nom d'une plage de cellule. Toutefois, ce nom est "dynamique", puisque défini par une formule décaler. Malheureusement, lorsque je sélectionne des données dans ma ListBox, si je modifie quelque chose dans ma feuille (par exemple je note quelque chose dans une cellule), mes choix dans la ListBox se réinitialisent, c'est à dire qu'ils se désélectionnent tous.

Toutefois, si le nom est défini "en dur", c'est à dire en faisant directement référence à la plage de cellule, il n'y a pas de problème, mes choix sont gardés même si la feuille est modifiée. Donc le problème viendrait de la manière de déclarer le nom de la plage de cellule qui doit alimenter ma ListBox.

Vous trouverez ci joint l'illustration de ce que j'ai expliqué, avec la liste dans un onglet, et les deux listBox avec l'alimentation par un nom "dynamique" et "en dur".

A priori, j'ai besoin que ce soit un contrôle ActiveX par rapport aux options nécessaires (il faut que ma listBox disparaisse si je masque la ligne qui le contient). De même, les noms que j'utilise doivent faire référence à une plage dynamique, car elle peut changer. Je ne peux pas créer de tableau car il y a des données en dessous et au dessus.

Y a-t-il une solution simple ou dois-je faire une macro qui alimente ma plage avec des AddItem, ce qui serait moins pratique...

Merci d'avance pour votre aide !

Bonjour,

il faut déclarer dans le haut du Module1 la variable suivante,

Public temp

et copier les macro suivante sur la page code de la feuille "Liste"

Private Sub Worksheet_Activate()
temp = ""
With Sheets("ListBox")
 For i = 0 To .CASM.ListCount - 1
   If .CASM.Selected(i) = True Then temp = temp & .CASM.List(i) & Chr(10)
 Next i
End With
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    a = Split(temp, Chr(10))
    If UBound(a) >= 0 Then
     With Sheets("ListBox")
      For i = 0 To .CASM.ListCount - 1
        If Not IsError(Application.Match(.CASM.List(i), a, 0)) Then .CASM.Selected(i) = True
      Next i
     End With
    End If
End Sub

Est ce que cela convient ?

Bonjour,

je vous remercie pour votre réponse. J'aurais voulu savoir s'il y avait un moyen "simple" de faire ça, comme de cocher une propriété de ma ListBox, mais tant pis. Je vais donc remplir cette ListeBox par des AddItem, ce qui résout mon problème de réinitialisation :

For Each elt In Range("Liste1")
    ActiveSheet.CASM.AddItem elt
Next

Cela permettra de ne pas faire tourner de macro à chaque changement dans la feuille.

Toutefois, merci pour la solution, elle me sera très utile pour pouvoir conserver les choix sélectionnés lorsque de nouveaux éléments seront ajoutés à la liste, et que la ListBox devra être mise à jour.

A bientôt !

Bonjour,

pour remplir la ListeBox automatiquement, remplacer la macro Worksheet_Change par celle-ci:

Private Sub Worksheet_Change(ByVal Target As Range)
With Sheets("ListBox")
    .CASM.ListFillRange = "Liste!" & Range("Liste1").Address
    a = Split(temp, Chr(10))
    If UBound(a) >= 0 Then
      For i = 0 To .CASM.ListCount - 1
        If Not IsError(Application.Match(.CASM.List(i), a, 0)) Then .CASM.Selected(i) = True
      Next i
    End If
End With
End Sub
Rechercher des sujets similaires à "reinitialisation voulue choix listbox activex"